summaryrefslogtreecommitdiffstats
path: root/src/server/events/CreateNode.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-15 01:52:08 +0000
committerDavid Robillard <d@drobilla.net>2012-05-15 01:52:08 +0000
commit22209796627acfef17c53d4cf523eed3daa26c2b (patch)
treed800c6ba96f7f8f6673a4e7da6409760001095af /src/server/events/CreateNode.cpp
parentf4f72247ae1f5eac8610a145c119accf0b6097d9 (diff)
downloadingen-22209796627acfef17c53d4cf523eed3daa26c2b.tar.gz
ingen-22209796627acfef17c53d4cf523eed3daa26c2b.tar.bz2
ingen-22209796627acfef17c53d4cf523eed3daa26c2b.zip
Eliminate long-duration event locks by generated responses in pre_process().
This also fixes some correctness issues, since the state at pre_process() time is actually the state that needs to be broadcast to clients. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4416 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server/events/CreateNode.cpp')
-rw-r--r--src/server/events/CreateNode.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/server/events/CreateNode.cpp b/src/server/events/CreateNode.cpp
index b2a6a995..87ecd657 100644
--- a/src/server/events/CreateNode.cpp
+++ b/src/server/events/CreateNode.cpp
@@ -45,13 +45,13 @@ CreateNode::CreateNode(Engine& engine,
: Event(engine, client, id, timestamp)
, _path(path)
, _plugin_uri(plugin_uri)
+ , _properties(properties)
, _patch(NULL)
, _plugin(NULL)
, _node(NULL)
, _compiled_patch(NULL)
, _node_already_exists(false)
, _polyphonic(false)
- , _properties(properties)
{
const Resource::Properties::const_iterator p = properties.find(
engine.world()->uris().ingen_polyphonic);
@@ -92,7 +92,17 @@ CreateNode::pre_process()
}
}
- if (!_node) {
+ if (_node) {
+ Ingen::Shared::URIs& uris = _engine.world()->uris();
+ _update.push_back(make_pair(_node->path(), _node->properties()));
+ for (uint32_t i = 0; i < _node->num_ports(); ++i) {
+ const PortImpl* port = _node->port_impl(i);
+ Resource::Properties pprops = port->properties();
+ pprops.erase(uris.ingen_value);
+ pprops.insert(std::make_pair(uris.ingen_value, port->value()));
+ _update.push_back(std::make_pair(port->path(), pprops));
+ }
+ } else {
_status = FAILURE;
}
@@ -123,7 +133,9 @@ CreateNode::post_process()
respond(FAILURE);
} else {
respond(SUCCESS);
- _engine.broadcaster()->send_object(_node, true); // yes, send ports
+ for (Update::const_iterator i = _update.begin(); i != _update.end(); ++i) {
+ _engine.broadcaster()->put(i->first, i->second);
+ }
}
}