diff options
author | David Robillard <d@drobilla.net> | 2012-05-10 03:23:11 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-05-10 03:23:11 +0000 |
commit | da468f24388d7f0f574c6e4dd4022e05d47a9db2 (patch) | |
tree | 32e90d5fa55a35caef43cb69592286fc31c5d4f4 /ingen/client | |
parent | 281bbcc6a7208c28283bc9bdd521c5d6cc48a60f (diff) | |
download | ingen-da468f24388d7f0f574c6e4dd4022e05d47a9db2.tar.gz ingen-da468f24388d7f0f574c6e4dd4022e05d47a9db2.tar.bz2 ingen-da468f24388d7f0f574c6e4dd4022e05d47a9db2.zip |
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
Diffstat (limited to 'ingen/client')
-rw-r--r-- | ingen/client/ThreadedSigClientInterface.hpp | 33 |
1 files changed, 31 insertions, 2 deletions
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; |