#ifndef __pbd_signals_h__
#define __pbd_signals_h__
+#include <csignal>
+
#include <list>
#include <map>
#endif
protected:
- Glib::Threads::Mutex _mutex;
+ mutable Glib::Threads::Mutex _mutex;
#ifdef DEBUG_PBD_SIGNAL_CONNECTIONS
bool _debug_connection;
#endif
class LIBPBD_API Connection : public boost::enable_shared_from_this<Connection>
{
public:
- Connection (SignalBase* b) : _signal (b) {}
+ Connection (SignalBase* b, PBD::EventLoop::InvalidationRecord* ir) : _signal (b), _invalidation_record (ir)
+ {
+ if (_invalidation_record) {
+ _invalidation_record->ref ();
+ }
+ }
void disconnect ()
{
}
}
+ void disconnected ()
+ {
+ if (_invalidation_record) {
+ _invalidation_record->unref ();
+ }
+ }
+
void signal_going_away ()
{
Glib::Threads::Mutex::Lock lm (_mutex);
+ if (_invalidation_record) {
+ _invalidation_record->unref ();
+ }
_signal = 0;
}
private:
Glib::Threads::Mutex _mutex;
SignalBase* _signal;
+ PBD::EventLoop::InvalidationRecord* _invalidation_record;
};
template<typename R>
return r;
}
};
-
+
typedef boost::shared_ptr<Connection> UnscopedConnection;
-
+
class LIBPBD_API ScopedConnection
{
public:
if (_c == o) {
return *this;
}
-
+
disconnect ();
_c = o;
return *this;
private:
UnscopedConnection _c;
};
-
+
class LIBPBD_API ScopedConnectionList : public boost::noncopyable
{
public:
ScopedConnectionList();
virtual ~ScopedConnectionList ();
-
+
void add_connection (const UnscopedConnection& c);
void drop_connections ();
(1) (unlikely) we make a connection involving a callback on the
same object from 2 threads. (wouldn't that just be appalling
programming style?)
-
+
(2) where we are dropping connections in one thread and adding
one from another.
*/
ConnectionList _list;
};
-#include "pbd/signals_generated.h"
-
+#include "pbd/signals_generated.h"
+
} /* namespace */
#endif /* __pbd_signals_h__ */