diff foosdk/sdk/pfc/timers.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/pfc/timers.cpp	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,123 @@
+#include "pfc-lite.h"
+
+#include "timers.h"
+#include "debug.h"
+
+#if defined(_WIN32) && defined(PFC_HAVE_PROFILER)
+#include <ShlObj.h>
+#endif
+
+#ifndef _WIN32
+#include "nix-objects.h"
+#include <time.h>
+#endif
+
+namespace pfc {
+
+#ifdef PFC_HAVE_PROFILER
+
+profiler_static::profiler_static(const char * p_name)
+{
+	name = p_name;
+	total_time = 0;
+	num_called = 0;
+}
+
+static void profilerMsg(const char* msg) {
+#ifdef _WIN32
+    if (!IsDebuggerPresent()) {
+        static HANDLE hWriteTo = INVALID_HANDLE_VALUE;
+        static bool initialized = false;
+        if (!initialized) {
+            initialized = true;
+            wchar_t path[1024] = {};
+            if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, path))) {
+                size_t l = wcslen(path);
+                if (l > 0) {
+                    if (path[l - 1] != '\\') {
+                        wcscat_s(path, L"\\");
+                    }
+                    wchar_t fn[256];
+                    wsprintf(fn, L"profiler-%u.txt", GetProcessId(GetCurrentProcess()));
+                    wcscat_s(path, fn);
+                    hWriteTo = CreateFile(path, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL);
+                }
+            }
+        }
+        if (hWriteTo != INVALID_HANDLE_VALUE) {
+            SetFilePointer(hWriteTo, 0, 0, SEEK_END);
+            pfc::string8 temp = msg;
+            temp += "\r\n";
+            DWORD written = 0;
+            WriteFile(hWriteTo, temp.c_str(), (DWORD) temp.length(), &written, NULL);
+        }
+    }
+#endif
+    outputDebugLine(msg);
+}
+
+profiler_static::~profiler_static()
+{
+	try {
+		pfc::string8 message;
+		message << "profiler: " << pfc::format_pad_left(48,' ',name) << " - " << 
+			pfc::format_pad_right(16,' ',pfc::format_uint(total_time) ) << " cycles";
+
+		if (num_called > 0) {
+			message << " (executed " << num_called << " times, " << (total_time / num_called) << " average)";
+		}
+        profilerMsg(message);
+	} catch(...) {
+		//should never happen
+		OutputDebugString(_T("unexpected profiler failure\n"));
+	}
+}
+#endif
+
+#ifndef _WIN32
+
+    void hires_timer::start() {
+        m_start = nixGetTime();
+    }
+    double hires_timer::query() const {
+        return nixGetTime() - m_start;
+    }
+    double hires_timer::query_reset() {
+        double t = nixGetTime();
+        double r = t - m_start;
+        m_start = t;
+        return r;
+    }
+    pfc::string8 hires_timer::queryString(unsigned precision) const {
+        return format_time_ex( query(), precision ).get_ptr();
+    }
+#endif
+
+
+    uint64_t fileTimeWtoU(uint64_t ft) {
+        return (ft - 116444736000000000 + /*rounding*/10000000/2) / 10000000;
+    }
+    uint64_t fileTimeUtoW(uint64_t ft) {
+        return (ft * 10000000) + 116444736000000000;
+    }
+#ifndef _WIN32
+    uint64_t fileTimeUtoW(const timespec & ts) {
+        uint64_t ft = (uint64_t)ts.tv_sec * 10000000 + (uint64_t)ts.tv_nsec / 100;
+        return ft + 116444736000000000;
+    }
+#endif
+    
+	uint64_t fileTimeNow() {
+#ifdef _WIN32
+		uint64_t ret;
+		GetSystemTimeAsFileTime((FILETIME*)&ret);
+		return ret;
+#else // not _WIN32
+        timespec ts = {};
+        auto status = clock_gettime( CLOCK_REALTIME, &ts);
+        PFC_ASSERT( status == 0 ); (void) status;
+        return fileTimeUtoW(ts);
+#endif // _WIN32 or not
+	}
+    
+}