[SCM] calf/master: Do not stall entire JACK system while adding/removing plugins.

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:40:30 UTC 2013


The following commit has been merged in the master branch:
commit 6639b1f2a06145e694d24c5d1c385d75a30966bc
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Sun Dec 26 21:09:40 2010 +0000

    Do not stall entire JACK system while adding/removing plugins.

diff --git a/src/calf/utils.h b/src/calf/utils.h
index 3dd83de..783a98a 100644
--- a/src/calf/utils.h
+++ b/src/calf/utils.h
@@ -65,16 +65,22 @@ public:
     }
 };
 
-/// Exception-safe mutex lock
-class ptlock
+class ptlock_base
 {
+protected:
     ptmutex &mutex;
     bool locked;
+
+    ptlock_base(ptmutex &_m)
+    : mutex(_m)
+    , locked(false)
+    {
+    }
     
 public:
-    ptlock(ptmutex &_m) : mutex(_m), locked(true)
+    bool is_locked()
     {
-        mutex.lock();
+        return locked;
     }
     void unlock()
     {
@@ -85,13 +91,33 @@ public:
     {
         locked = false;
     }
-    ~ptlock()
+    ~ptlock_base()
     {
         if (locked)
             mutex.unlock();
     }
 };
 
+/// Exception-safe mutex lock
+class ptlock: public ptlock_base
+{
+public:
+    ptlock(ptmutex &_m) : ptlock_base(_m)
+    {
+        locked = mutex.lock();
+    }
+};
+
+/// Exception-safe polling mutex lock
+class pttrylock: public ptlock_base
+{
+public:
+    pttrylock(ptmutex &_m) : ptlock_base(_m)
+    {
+        locked = mutex.trylock();
+    }
+};
+
 /// Exception-safe temporary assignment
 template<class T, class Tref = T&>
 class scope_assign
diff --git a/src/jack_client.cpp b/src/jack_client.cpp
index 65719d3..010e69a 100644
--- a/src/jack_client.cpp
+++ b/src/jack_client.cpp
@@ -96,9 +96,12 @@ const char **jack_client::get_ports(const char *name_re, const char *type_re, un
 int jack_client::do_jack_process(jack_nframes_t nframes, void *p)
 {
     jack_client *self = (jack_client *)p;
-    ptlock lock(self->mutex);
-    for(unsigned int i = 0; i < self->plugins.size(); i++)
-        self->plugins[i]->process(nframes);
+    pttrylock lock(self->mutex);
+    if (lock.is_locked())
+    {
+        for(unsigned int i = 0; i < self->plugins.size(); i++)
+            self->plugins[i]->process(nframes);
+    }
     return 0;
 }
 

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list