+ msg_Dbg (obj, "using Windows time as clock source");
+#if (_WIN32_WINNT < 0x0601)
+ HANDLE h = GetModuleHandle (_T("kernel32.dll"));
+ if (unlikely(h == NULL))
+ abort ();
+ clk.tick.get = (void *)GetProcAddress (h, _T("GetTickCount64"));
+ if (unlikely(clk.tick.get == NULL))
+ abort ();
+#endif
+ mdate_selected = mdate_tick;
+ }
+ else
+ if (!strcmp (name, "multimedia"))
+ {
+ TIMECAPS caps;
+
+ msg_Dbg (obj, "using multimedia timers as clock source");
+ if (timeGetDevCaps (&caps, sizeof (caps)) != MMSYSERR_NOERROR)
+ abort ();
+ msg_Dbg (obj, " min period: %u ms, max period: %u ms",
+ caps.wPeriodMin, caps.wPeriodMax);
+ mdate_selected = mdate_multimedia;
+ }
+ else
+ if (!strcmp (name, "perf"))
+ {
+ msg_Dbg (obj, "using performance counters as clock source");
+ if (!QueryPerformanceFrequency (&clk.perf.freq))
+ abort ();
+ msg_Dbg (obj, " frequency: %llu Hz", clk.perf.freq.QuadPart);
+ mdate_selected = mdate_perf;
+ }
+ else
+ if (!strcmp (name, "wall"))
+ {
+ msg_Dbg (obj, "using system time as clock source");
+ mdate_selected = mdate_wall;
+ }
+ else
+ {
+ msg_Err (obj, "invalid clock source \"%s\"", name);
+ abort ();