diff options
author | David Robillard <d@drobilla.net> | 2011-09-24 03:22:30 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-09-24 03:22:30 +0000 |
commit | 74a711e0d1cdb5c505a227dc9b1925657f1e778d (patch) | |
tree | 78f93b26e4154c76892cb0160414c4effbfc730e /src/server/events/CreateNode.cpp | |
parent | 2be10b0b6f2c0f01870208e9d18e5db87e5dfb88 (diff) | |
download | ingen-74a711e0d1cdb5c505a227dc9b1925657f1e778d.tar.gz ingen-74a711e0d1cdb5c505a227dc9b1925657f1e778d.tar.bz2 ingen-74a711e0d1cdb5c505a227dc9b1925657f1e778d.zip |
Use store lock to avoid race conditions with Get and create/delete events.
Get really shouldn't be reading the store (via ObjectSender) in the post
processing thread at all, avoiding that entirely would be a better solution.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3484 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server/events/CreateNode.cpp')
-rw-r--r-- | src/server/events/CreateNode.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/server/events/CreateNode.cpp b/src/server/events/CreateNode.cpp index 01d4f285..39d5f86d 100644 --- a/src/server/events/CreateNode.cpp +++ b/src/server/events/CreateNode.cpp @@ -57,6 +57,7 @@ CreateNode::CreateNode( , _node_already_exists(false) , _polyphonic(false) , _properties(properties) + , _lock(engine.engine_store()->lock(), Glib::NOT_LOCK) { const Resource::Properties::const_iterator p = properties.find( engine.world()->uris()->ingen_polyphonic); @@ -68,6 +69,8 @@ CreateNode::CreateNode( void CreateNode::pre_process() { + _lock.acquire(); + if (_engine.engine_store()->find_object(_path) != NULL) { _node_already_exists = true; QueuedEvent::pre_process(); @@ -117,8 +120,10 @@ CreateNode::execute(ProcessContext& context) void CreateNode::post_process() { - if (!_request) + if (!_request) { + _lock.release(); return; + } string msg; if (_node_already_exists) { @@ -138,6 +143,8 @@ CreateNode::post_process() _request->respond_ok(); _engine.broadcaster()->send_object(_node, true); // yes, send ports } + + _lock.release(); } } // namespace Server |