]> git.sesse.net Git - vlc/commitdiff
mozilla: use locking wrapper
authorJean-Paul Saman <jean-paul.saman@m2x.nl>
Wed, 3 Mar 2010 09:02:12 +0000 (10:02 +0100)
committerJean-Paul Saman <jean-paul.saman@m2x.nl>
Thu, 4 Mar 2010 12:04:55 +0000 (13:04 +0100)
Conflicts:

projects/mozilla/vlcplugin.cpp

projects/mozilla/vlcplugin.cpp
projects/mozilla/vlcplugin.h

index 895d7a2f4a57d1af9de3d056bd36783aa1203ee4..bdcc2e768972888ddb94052e7f72f83134692aa6 100644 (file)
 
 #include <ctype.h>
 #if defined(XP_UNIX)
-# include <pthread.h>
+#   include <pthread.h>
+#elif defined(XP_WIN)
+    /* windows headers */
+#   include <winbase.h>
 #else
 #warning "locking not implemented for this platform"
 #endif
 
 #include <stdio.h>
 
+/*****************************************************************************
+ * utilitiy functions
+ *****************************************************************************/
+static void plugin_lock_init(plugin_lock_t *lock)
+{
+    assert(lock);
+
+#if defined(XP_UNIX)
+    pthread_mutex_init(&lock->mutex, NULL);
+#elif defined(XP_WIN)
+    InitializeCriticalSection(&lock->cs);
+#else
+#warning "locking not implemented in this platform"
+#endif
+}
+
+static void plugin_lock_destroy(plugin_lock_t *lock)
+{
+    assert(lock);
+
+#if defined(XP_UNIX)
+    pthread_mutex_destroy(&lock->mutex);
+#elif defined(XP_WIN)
+    DeleteCriticalSection(&lock->cs);
+#else
+#warning "locking not implemented in this platform"
+#endif
+}
+
+static void plugin_lock(plugin_lock_t *lock)
+{
+    assert(lock);
+
+#if defined(XP_UNIX)
+    pthread_mutex_lock(&lock->mutex);
+#elif defined(XP_WIN)
+    EnterCriticalSection(&lock->cs);
+#else
+#warning "locking not implemented in this platform"
+#endif
+}
+
+static void plugin_unlock(plugin_lock_t *lock)
+{
+    assert(lock);
+
+#if defined(XP_UNIX)
+    pthread_mutex_unlock(&lock->mutex);
+#elif defined(XP_WIN)
+    LeaveCriticalSection(&lock->cs);
+#else
+#warning "locking not implemented in this platform"
+#endif
+}
+
 /*****************************************************************************
  * VlcPlugin constructor and destructor
  *****************************************************************************/
@@ -95,20 +153,13 @@ static bool boolValue(const char *value) {
 
 bool EventObj::init()
 {
-#if defined(XP_UNIX)
-    return pthread_mutex_init(&mutex, NULL) == 0;
-#else
-#warning "locking not implemented for this platform"
-#endif
+    plugin_lock_init(&lock);
+    return true;
 }
 
 EventObj::~EventObj()
 {
-#if defined(XP_UNIX)
-    pthread_mutex_destroy(&mutex);
-#else
-#warning "locking not implemented for this platform"
-#endif
+    plugin_lock_destroy(&lock);
 }
 
 void EventObj::deliver(NPP browser)
@@ -116,11 +167,8 @@ void EventObj::deliver(NPP browser)
     NPVariant result;
     NPVariant params[1];
 
-#if defined(XP_UNIX)
-    pthread_mutex_lock(&mutex);
-#else
-#warning "locking not implemented for this platform"
-#endif
+    plugin_lock(&lock);
+
     for( ev_l::iterator i=_elist.begin();i!=_elist.end();++i )
     {
         libvlc_event_type_t event = *i;
@@ -139,11 +187,8 @@ void EventObj::deliver(NPP browser)
         }
     }
     _elist.clear();
-#if defined(XP_UNIX)
-    pthread_mutex_unlock(&mutex);
-#else
-#warning "locking not implemented for this platform"
-#endif
+
+    plugin_unlock(&lock);
 }
 
 void VlcPlugin::eventAsync(void *param)
@@ -154,18 +199,12 @@ void VlcPlugin::eventAsync(void *param)
 
 void EventObj::callback(const libvlc_event_t* event)
 {
-#if defined(XP_UNIX)
-    pthread_mutex_lock(&mutex);
-#else
-#warning "locking not implemented for this platform"
-#endif
+    plugin_lock(&lock);
+
     if( have_event(event->type) )
         _elist.push_back(event->type);
-#if defined(XP_UNIX)
-    pthread_mutex_unlock(&mutex);
-#else
-#warning "locking not implemented for this platform"
-#endif
+
+    plugin_unlock(&lock);
 }
 
 void VlcPlugin::event_callback(const libvlc_event_t* event, void *param)
@@ -176,7 +215,7 @@ void VlcPlugin::event_callback(const libvlc_event_t* event, void *param)
     NPN_PluginThreadAsyncCall(plugin->getBrowser(), eventAsync, plugin);
 #else
 #warning NPN_PluginThreadAsyncCall not implemented yet.
-    printf("%s","No NPN_PluginThreadAsyncCall(), doing nothing.");
+    printf("No NPN_PluginThreadAsyncCall(), doing nothing.");
 #endif
 }
 
index 4c9a11cf294c75426e7ed83075f58e28075ac4bf..a14007fcd6e54339bc8a904cae3c3b70204f7127 100644 (file)
@@ -30,7 +30,6 @@
 #define __VLCPLUGIN_H__
 
 #include <vlc/vlc.h>
-#include <pthread.h>
 #include <npapi.h>
 #include <vector>
 
@@ -44,6 +43,7 @@
 
 #ifdef XP_WIN
     /* Windows stuff */
+#   include <winbase.h>
 #endif
 
 #ifdef XP_MACOSX
@@ -52,6 +52,7 @@
 #endif
 
 #ifdef XP_UNIX
+#   include <pthread.h>
     /* X11 stuff */
 #   include <X11/Xlib.h>
 #   include <X11/Intrinsic.h>
 #   define __MIN(a, b)   ( ((a) < (b)) ? (a) : (b) )
 #endif
 
+typedef struct {
+#if defined(XP_UNIX)
+    pthread_mutex_t mutex;
+#elif defined(XP_WIN)
+    CRITICAL_SECTION cs;
+#else
+#warning "locking not implemented in this platform"
+#endif
+} plugin_lock_t;
+
+
 typedef enum vlc_toolbar_clicked_e {
     clicked_Unknown = 0,
     clicked_Play,
@@ -151,9 +163,7 @@ private:
     lr_l _llist;
     ev_l _elist;
 
-#if defined(XP_UNIX)
-    pthread_mutex_t mutex;
-#endif
+    plugin_lock_t lock;
 
     bool ask_for_event(event_t e);
     void unask_for_event(event_t e);