Undef SearchPath where needed as it is defined via windows.h
[ardour.git] / libs / pbd / pbd / signals.h
index e20a126163633a2eef05401e1ea143cc194a3baa..69c52f57cf9b330cf9ca76edf5e29c46ebeba720 100644 (file)
 #define __pbd_signals_h__
 
 #include <list>
-#include <glibmm/thread.h>
+#include <map>
+#include <glibmm/threads.h>
 
 #include <boost/noncopyable.hpp>
 #include <boost/bind.hpp>
 #include <boost/bind/protect.hpp>
 #include <boost/function.hpp>
-#include <boost/thread/mutex.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/optional.hpp>
 
@@ -44,7 +44,7 @@ public:
        virtual void disconnect (boost::shared_ptr<Connection>) = 0;
 
 protected:
-       boost::mutex _mutex;
+        Glib::Threads::Mutex _mutex;
 };
 
 class Connection : public boost::enable_shared_from_this<Connection>
@@ -54,7 +54,7 @@ public:
 
        void disconnect ()
        {
-               boost::mutex::scoped_lock lm (_mutex);
+               Glib::Threads::Mutex::Lock lm (_mutex);
                if (_signal) {
                        _signal->disconnect (shared_from_this ());
                        _signal = 0;
@@ -63,12 +63,12 @@ public:
 
        void signal_going_away ()
        {
-               boost::mutex::scoped_lock lm (_mutex);
+               Glib::Threads::Mutex::Lock lm (_mutex);
                _signal = 0;
        }
 
 private:
-       boost::mutex _mutex;
+        Glib::Threads::Mutex _mutex;
        SignalBase* _signal;
 };
 
@@ -110,6 +110,11 @@ public:
 
        ScopedConnection& operator= (UnscopedConnection const & o)
        {
+               if (_c == o) {
+                       return *this;
+               }
+               
+               disconnect ();
                _c = o;
                return *this;
        }
@@ -142,7 +147,7 @@ class ScopedConnectionList  : public boost::noncopyable
               one from another.
         */
 
-       Glib::Mutex _lock;
+       Glib::Threads::Mutex _lock;
 
        typedef std::list<ScopedConnection*> ConnectionList;
        ConnectionList _list;