]> git.sesse.net Git - vlc/commitdiff
Stub cancellation support
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Fri, 11 Jul 2008 21:02:37 +0000 (00:02 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Wed, 27 Aug 2008 19:43:03 +0000 (22:43 +0300)
include/vlc_threads.h
src/libvlccore.sym
src/misc/threads.c

index 9610793a4a1ac4d53ec617a9237769e2e5738129..c2dd3030a8719f1ba729254afab68c6097eff1dc 100644 (file)
@@ -589,6 +589,16 @@ static inline void barrier (void)
 #endif
 }
 
+#ifndef LIBVLC_USE_PTHREAD
+enum {
+    VLC_SAVE_CANCEL,
+    VLC_RESTORE_CANCEL,
+    VLC_TEST_CANCEL,
+};
+#endif
+
+VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...));
+
 /**
  * Save the cancellation state and disable cancellation for the calling thread.
  * This function must be called before entering a piece of code that is not
@@ -600,6 +610,8 @@ static inline void vlc_savecancel (int *p_state)
 {
 #if defined (LIBVLC_USE_PTHREAD)
     (void) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, p_state);
+#else
+    vlc_control_cancel (VLC_SAVE_CANCEL, p_state);
 #endif
 }
 
@@ -612,6 +624,8 @@ static inline void vlc_restorecancel (int state)
 {
 #if defined (LIBVLC_USE_PTHREAD)
     (void) pthread_setcancelstate (state, NULL);
+#else
+    vlc_control_cancel (VLC_RESTORE_CANCEL, state);
 #endif
 }
 
@@ -624,6 +638,8 @@ static inline void vlc_testcancel (void)
 {
 #if defined (LIBVLC_USE_PTHREAD)
     pthread_testcancel ();
+#else
+    vlc_control_cancel (VLC_TEST_CANCEL);
 #endif
 }
 
index f61c17d6c6a34c6011b04ca01b4fdc9fd3dbfd10..78aaf52d513a4ef81247b6c156e1c91d121ee00a 100644 (file)
@@ -426,6 +426,7 @@ __vlc_cond_destroy
 __vlc_cond_init
 vlc_config_create
 vlc_config_set
+vlc_control_cancel
 vlc_CPU
 vlc_error
 __vlc_event_attach
index af65ddb4a0c0868b977dd3344619f9e1c246f634..97f9f194c717ba5e5bfc71cf70d3250ff53415b1 100644 (file)
@@ -31,6 +31,7 @@
 #include <vlc_common.h>
 
 #include "libvlc.h"
+#include <stdarg.h>
 #include <assert.h>
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
@@ -836,3 +837,45 @@ void vlc_thread_cancel (vlc_object_t *obj)
     if (priv->b_thread)
         vlc_cancel (priv->thread_id);
 }
+
+void vlc_control_cancel (int cmd, ...)
+{
+#ifdef LIBVLC_USE_PTHREAD
+    (void) cmd;
+    abort();
+#else
+    static __thread struct vlc_cancel_t *stack = NULL;
+    static __thread bool killed = false, killable = true;
+    va_list ap;
+
+    va_start (ap, cmd);
+
+    switch (cmd)
+    {
+        case VLC_SAVE_CANCEL:
+        {
+            int *p_state = va_arg (ap, int *);
+            *p_state = killable;
+            killable = false;
+            break;
+        }
+
+        case VLC_RESTORE_CANCEL:
+        {
+            int state = va_arg (ap, int);
+            killable = state != 0;
+            break;
+        }
+
+        case VLC_TEST_CANCEL:
+            if (killable)
+#ifdef WIN32
+                _endthread ();
+#else
+# error Not implemented!
+#endif
+            break;
+    }
+    va_end (ap);
+#endif
+}