summaryrefslogtreecommitdiffstats
path: root/src/server/events/CreateNode.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-09-24 03:22:30 +0000
committerDavid Robillard <d@drobilla.net>2011-09-24 03:22:30 +0000
commit74a711e0d1cdb5c505a227dc9b1925657f1e778d (patch)
tree78f93b26e4154c76892cb0160414c4effbfc730e /src/server/events/CreateNode.cpp
parent2be10b0b6f2c0f01870208e9d18e5db87e5dfb88 (diff)
downloadingen-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.cpp9
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