diff options
author | David Robillard <d@drobilla.net> | 2012-05-15 01:52:08 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-05-15 01:52:08 +0000 |
commit | 22209796627acfef17c53d4cf523eed3daa26c2b (patch) | |
tree | d800c6ba96f7f8f6673a4e7da6409760001095af /src/server/events/SetMetadata.cpp | |
parent | f4f72247ae1f5eac8610a145c119accf0b6097d9 (diff) | |
download | ingen-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/SetMetadata.cpp')
-rw-r--r-- | src/server/events/SetMetadata.cpp | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/src/server/events/SetMetadata.cpp b/src/server/events/SetMetadata.cpp index fa02f220..26757426 100644 --- a/src/server/events/SetMetadata.cpp +++ b/src/server/events/SetMetadata.cpp @@ -17,6 +17,8 @@ #include <string> #include <vector> +#include <glibmm/thread.h> + #include <boost/format.hpp> #include "raul/log.hpp" @@ -68,7 +70,6 @@ SetMetadata::SetMetadata(Engine& engine, , _compiled_patch(NULL) , _create(create) , _context(context) - , _lock(engine.engine_store()->lock(), Glib::NOT_LOCK) { if (context != Resource::DEFAULT) { Resource::set_context(_properties, context); @@ -107,7 +108,8 @@ SetMetadata::pre_process() const bool is_graph_object = Raul::Path::is_path(_subject); - _lock.acquire(); + // Take a writer lock while we modify the store + Glib::RWLock::WriterLock lock(_engine.engine_store()->lock()); _object = is_graph_object ? _engine.engine_store()->find_object(Raul::Path(_subject.str())) @@ -251,17 +253,12 @@ SetMetadata::pre_process() } if (_status != SUCCESS) { - _error_predicate += key.str(); break; } _types.push_back(op); } - if (!_create_event) { - _lock.release(); - } - Event::pre_process(); } @@ -367,10 +364,6 @@ SetMetadata::post_process() } else { respond(_status); } - - if (_create_event) { - _lock.release(); - } } } // namespace Events |