[vlc-commits] commit: mozilla: use locking wrapper (Jean-Paul Saman )

git version control git at videolan.org
Thu Mar 4 13:15:37 CET 2010


vlc | branch: master | Jean-Paul Saman <jean-paul.saman at m2x.nl> | Wed Mar  3 10:02:12 2010 +0100| [b1b4acfe68816641337603ef9e836d9117c0f8ca] | committer: Jean-Paul Saman 

mozilla: use locking wrapper

Conflicts:

	projects/mozilla/vlcplugin.cpp

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

 projects/mozilla/vlcplugin.cpp |  103 +++++++++++++++++++++++++++------------
 projects/mozilla/vlcplugin.h   |   18 +++++--
 2 files changed, 85 insertions(+), 36 deletions(-)

diff --git a/projects/mozilla/vlcplugin.cpp b/projects/mozilla/vlcplugin.cpp
index 895d7a2..bdcc2e7 100644
--- a/projects/mozilla/vlcplugin.cpp
+++ b/projects/mozilla/vlcplugin.cpp
@@ -37,7 +37,10 @@
 
 #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
@@ -45,6 +48,61 @@
 #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
  *****************************************************************************/
 VlcPlugin::VlcPlugin( NPP instance, uint16 mode ) :
@@ -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
 }
 
diff --git a/projects/mozilla/vlcplugin.h b/projects/mozilla/vlcplugin.h
index 4c9a11c..a14007f 100644
--- a/projects/mozilla/vlcplugin.h
+++ b/projects/mozilla/vlcplugin.h
@@ -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>
@@ -70,6 +71,17 @@
 #   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);



More information about the vlc-commits mailing list