/*
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>
+#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>
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>
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;
};
ScopedConnection& operator= (UnscopedConnection const & o)
{
+ if (_c == o) {
+ return *this;
+ }
+
+ disconnect ();
_c = o;
return *this;
}
/* this class is not copyable */
ScopedConnectionList(const ScopedConnectionList&);
- /* this lock is shared by all instances of a ScopedConnectionList.
- We do not want one mutex per list, and since we only need the lock
- when adding or dropping connections, which are generally occuring
- in object creation and UI operations, the contention on this
- lock is low and not of significant consequence. Even though
- boost::signals2 is thread-safe, this additional list of
+ /* Even though our signals code is thread-safe, this additional list of
scoped connections needs to be protected in 2 cases:
(1) (unlikely) we make a connection involving a callback on the
one from another.
*/
- static Glib::StaticMutex _lock;
+ Glib::Threads::Mutex _lock;
typedef std::list<ScopedConnection*> ConnectionList;
ConnectionList _list;