]> git.sesse.net Git - vlc/blobdiff - src/misc/w32thread.c
revision: No need for the -n in echo. Choke Darwin.
[vlc] / src / misc / w32thread.c
index 9e5b521dbb1f8d670bd71047e6b28c15ebc98562..24f991e04db2796be491a3b7bc59565521c7a3a1 100644 (file)
@@ -164,14 +164,12 @@ void vlc_mutex_init( vlc_mutex_t *p_mutex )
      * no defined behavior in case of recursive locking. */
     InitializeCriticalSection (&p_mutex->mutex);
     p_mutex->initialized = 1;
-    return 0;
 }
 
 void vlc_mutex_init_recursive( vlc_mutex_t *p_mutex )
 {
     InitializeCriticalSection( &p_mutex->mutex );
     p_mutex->initialized = 1;
-    return 0;
 }
 
 
@@ -512,3 +510,62 @@ void vlc_control_cancel (int cmd, ...)
     }
     va_end (ap);
 }
+
+
+/*** Timers ***/
+static void CALLBACK vlc_timer_do (void *val, BOOLEAN timeout)
+{
+    vlc_timer_t *id = val;
+
+    assert (timeout);
+    if (TryEnterCriticalSection (&id->serializer))
+    {
+        id->overrun = InterlockedExchange (&id->counter, 0);
+        id->func (id->data);
+        LeaveCriticalSection (&id->serializer);
+    }
+    else /* Overrun */
+        InterlockedIncrement (&id->counter);
+}
+
+int vlc_timer_create (vlc_timer_t *id, void (*func) (void *), void *data)
+{
+    id->func = func;
+    id->data = data;
+    id->overrun = 0;
+    id->handle = INVALID_HANDLE_VALUE;
+    InitializeCriticalSection (&id->serializer);
+    return 0;
+}
+
+void vlc_timer_destroy (vlc_timer_t *id)
+{
+    if (id->handle != INVALID_HANDLE_VALUE)
+        DeleteTimerQueueTimer (NULL, id->handle, NULL);
+    DeleteCriticalSection (&id->serializer);
+}
+
+void vlc_timer_schedule (vlc_timer_t *id, bool absolute,
+                         mtime_t value, mtime_t interval)
+{
+    if (id->handle != INVALID_HANDLE_VALUE)
+    {
+        DeleteTimerQueueTimer (NULL, id->handle, NULL);
+        id->handle = INVALID_HANDLE_VALUE;
+    }
+    if (value == 0)
+        return; /* Disarm */
+
+    if (absolute)
+        value -= mdate ();
+    value = (value + 999) / 1000;
+    interval = (interval + 999) / 1000;
+    if (!CreateTimerQueueTimer (&id->handle, NULL, vlc_timer_do, id, value,
+                                interval, WT_EXECUTEDEFAULT))
+        abort ();
+}
+
+unsigned vlc_timer_getoverrun (const vlc_timer_t *id)
+{
+    return id->overrun;
+}