Merge branch 'master' into cairocanvas
[ardour.git] / libs / pbd / pbd / signals.h
index 904d51e45f472abe6a1385904f029309c7364ac5..140ea014e8040d3431c0f47aaa78dcb0ac4ff584 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2009-2012 Paul Davis 
-
+    
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
 #define __pbd_signals_h__
 
 #include <list>
-#include <glibmm/thread.h>
+#include <map>
+
+#ifdef nil
+#undef nil
+#endif
+
+#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 +49,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,20 +59,21 @@ public:
 
        void disconnect ()
        {
-               boost::mutex::scoped_lock lm (_mutex);
+               Glib::Threads::Mutex::Lock lm (_mutex);
                if (_signal) {
                        _signal->disconnect (shared_from_this ());
-               } 
+                       _signal = 0;
+               }
        }
 
        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;
 };
 
@@ -109,6 +115,11 @@ public:
 
        ScopedConnection& operator= (UnscopedConnection const & o)
        {
+               if (_c == o) {
+                       return *this;
+               }
+               
+               disconnect ();
                _c = o;
                return *this;
        }
@@ -141,7 +152,7 @@ class ScopedConnectionList  : public boost::noncopyable
               one from another.
         */
 
-       Glib::Mutex _lock;
+       Glib::Threads::Mutex _lock;
 
        typedef std::list<ScopedConnection*> ConnectionList;
        ConnectionList _list;