[vlc-commits] Win32: run-time support for Seven's interrupt time

Rémi Denis-Courmont git at videolan.org
Thu Sep 6 20:05:39 CEST 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Sep  6 21:02:21 2012 +0300| [a5e6bc392fd56394b21986bd050f93eaef541e0d] | committer: Rémi Denis-Courmont

Win32: run-time support for Seven's interrupt time

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a5e6bc392fd56394b21986bd050f93eaef541e0d
---

 src/win32/thread.c |   44 ++++++++++++++++++++++++++++++++------------
 1 file changed, 32 insertions(+), 12 deletions(-)

diff --git a/src/win32/thread.c b/src/win32/thread.c
index b2fd955..b581bc1 100644
--- a/src/win32/thread.c
+++ b/src/win32/thread.c
@@ -721,29 +721,39 @@ static union
 {
     struct
     {
-        LARGE_INTEGER freq;
-    } perf;
+#if (_WIN32_WINNT < 0x0601)
+        BOOL (*query) (PULONGLONG);
+#endif
+    } interrupt;
     struct
     {
 #if (_WIN32_WINNT < 0x0600)
         ULONGLONG (*get) (void);
 #endif
     } tick;
+    struct
+    {
+        LARGE_INTEGER freq;
+    } perf;
 } clk;
 
-#if (_WIN32_WINNT >= 0x0601)
 static mtime_t mdate_interrupt (void)
 {
     ULONGLONG ts;
+    BOOL ret;
 
-    if (unlikely(!QueryUnbiasedInterruptTime (&ts)))
+#if (_WIN32_WINNT >= 0x0601)
+    ret = QueryUnbiasedInterruptTime (&ts);
+#else
+    ret = clk.interrupt.query (&ts);
+#endif
+    if (unlikely(!ret))
         abort ();
 
     /* hundreds of nanoseconds */
     static_assert ((10000000 % CLOCK_FREQ) == 0, "Broken frequencies ratio");
     return ts / (10000000 / CLOCK_FREQ);
 }
-#endif
 
 static mtime_t mdate_tick (void)
 {
@@ -833,14 +843,21 @@ void SelectClockSource (vlc_object_t *obj)
     char *str = var_InheritString (obj, "clock-source");
     if (str != NULL)
         name = str;
-#if (_WIN32_WINNT >= 0x0601)
     if (!strcmp (name, "interrupt"))
     {
         msg_Dbg (obj, "using interrupt time as clock source");
+#if (_WIN32_WINNT < 0x0601)
+        HANDLE h = GetModuleHandle (_T("kernel32.dll"));
+        if (unlikely(h == NULL))
+            abort ();
+        clk.interrupt.query = (void *)GetProcAddress (h,
+                                                      _T("QueryUnbiasedInterruptTime"));
+        if (unlikely(clk.interrupt.query == NULL))
+            abort ();
+#endif
         mdate_selected = mdate_interrupt;
     }
     else
-#endif
     if (!strcmp (name, "tick"))
     {
         msg_Dbg (obj, "using Windows time as clock source");
@@ -899,7 +916,7 @@ size_t EnumClockSource (vlc_object_t *obj, char ***vp, char ***np)
     char **names = xmalloc (sizeof (*names) * max);
     size_t n = 0;
 
-#if (_WIN32_WINNT < 0x0600)
+#if (_WIN32_WINNT < 0x0601)
     DWORD version = LOWORD(GetVersion());
     version = (LOBYTE(version) << 8) | (HIBYTE(version) << 0);
 #endif
@@ -907,11 +924,14 @@ size_t EnumClockSource (vlc_object_t *obj, char ***vp, char ***np)
     values[n] = xstrdup ("");
     names[n] = xstrdup (_("Auto"));
     n++;
-#if (_WIN32_WINNT >= 0x0601)
-    values[n] = xstrdup ("interrupt");
-    names[n] = xstrdup ("Interrupt time");
-    n++;
+#if (_WIN32_WINNT < 0x0601)
+    if (version >= 0x0601)
 #endif
+    {
+        values[n] = xstrdup ("interrupt");
+        names[n] = xstrdup ("Interrupt time");
+        n++;
+    }
 #if (_WIN32_WINNT < 0x0600)
     if (version >= 0x0600)
 #endif



More information about the vlc-commits mailing list