From da468f24388d7f0f574c6e4dd4022e05d47a9db2 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 10 May 2012 03:23:11 +0000 Subject: Use SharedPtr references to Interfaces to keep things sane. Fix double register when using GUI with a remote engine. Avoid signal when writing to dead socket by using send with MSG_NOSIGNAL. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4336 a436a847-0d15-0410-975c-d299462d15a1 --- ingen/client/ThreadedSigClientInterface.hpp | 33 +++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'ingen/client') diff --git a/ingen/client/ThreadedSigClientInterface.hpp b/ingen/client/ThreadedSigClientInterface.hpp index 096920bd..e8b46504 100644 --- a/ingen/client/ThreadedSigClientInterface.hpp +++ b/ingen/client/ThreadedSigClientInterface.hpp @@ -106,10 +106,39 @@ public: { push_sig(sigc::bind(property_change_slot, subject, key, value)); } /** Process all queued events - Called from GTK thread to emit signals. */ - bool emit_signals(); + bool emit_signals() { + // Process a limited number of events, to prevent locking the GTK + // thread indefinitely while processing continually arriving events + + size_t num_processed = 0; + while (!_sigs.empty() && num_processed++ < (_sigs.capacity() * 3 / 4)) { + Closure& ev = _sigs.front(); + ev(); + ev.disconnect(); + _sigs.pop(); + } + + _mutex.lock(); + _cond.broadcast(); + _mutex.unlock(); + + return true; + } private: - void push_sig(Closure ev); + void push_sig(Closure ev) { + bool success = false; + while (!success) { + success = _sigs.push(ev); + if (!success) { + Raul::warn << "Client event queue full. Waiting..." << std::endl; + _mutex.lock(); + _cond.wait(_mutex); + _mutex.unlock(); + Raul::warn << "Queue drained, continuing" << std::endl; + } + } + } Glib::Mutex _mutex; Glib::Cond _cond; -- cgit v1.2.1