From 9085d33b7600fd2721f0a2401a4e69830c457f84 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 24 Sep 2011 04:52:23 +0000 Subject: Remove concept of "blocking" events in favour of store RWLock. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3488 a436a847-0d15-0410-975c-d299462d15a1 --- src/server/events/Connect.cpp | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) (limited to 'src/server/events/Connect.cpp') diff --git a/src/server/events/Connect.cpp b/src/server/events/Connect.cpp index e0f09a3d..b67eacbc 100644 --- a/src/server/events/Connect.cpp +++ b/src/server/events/Connect.cpp @@ -16,9 +16,13 @@ */ #include + #include +#include + #include "raul/Maid.hpp" #include "raul/Path.hpp" + #include "ClientBroadcaster.hpp" #include "Connect.hpp" #include "ConnectionImpl.hpp" @@ -40,7 +44,11 @@ namespace Ingen { namespace Server { namespace Events { -Connect::Connect(Engine& engine, SharedPtr request, SampleCount timestamp, const Path& src_port_path, const Path& dst_port_path) +Connect::Connect(Engine& engine, + SharedPtr request, + SampleCount timestamp, + const Path& src_port_path, + const Path& dst_port_path) : QueuedEvent(engine, request, timestamp) , _src_port_path(src_port_path) , _dst_port_path(dst_port_path) @@ -50,12 +58,13 @@ Connect::Connect(Engine& engine, SharedPtr request, SampleCount timesta , _compiled_patch(NULL) , _port_listnode(NULL) , _buffers(NULL) -{ -} +{} void Connect::pre_process() { + Glib::RWLock::ReaderLock rlock(_engine.engine_store()->lock()); + PortImpl* src_port = _engine.engine_store()->find_port(_src_port_path); PortImpl* dst_port = _engine.engine_store()->find_port(_dst_port_path); if (!src_port || !dst_port) { @@ -122,15 +131,23 @@ Connect::pre_process() _port_listnode = new InputPort::Connections::Node(_connection); - // Need to be careful about patch port connections here and adding a node's - // parent as a dependant/provider, or adding a patch as it's own provider... - if (src_node != dst_node && src_node->parent() == dst_node->parent()) { - dst_node->providers()->push_back(new Raul::List::Node(src_node)); - src_node->dependants()->push_back(new Raul::List::Node(dst_node)); - } + rlock.release(); + + { + Glib::RWLock::ReaderLock wlock(_engine.engine_store()->lock()); - _patch->add_connection(_connection); - _dst_input_port->increment_num_connections(); + /* Need to be careful about patch port connections here and adding a + node's parent as a dependant/provider, or adding a patch as its own + provider... + */ + if (src_node != dst_node && src_node->parent() == dst_node->parent()) { + dst_node->providers()->push_back(new Raul::List::Node(src_node)); + src_node->dependants()->push_back(new Raul::List::Node(dst_node)); + } + + _patch->add_connection(_connection); + _dst_input_port->increment_num_connections(); + } /*if ((_dst_input_port->num_connections() == 1 && (_connection->must_mix() || _connection->must_queue())) -- cgit v1.2.1