summaryrefslogtreecommitdiffstats
path: root/src/server/events/SetMetadata.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/SetMetadata.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/SetMetadata.cpp')
-rw-r--r--src/server/events/SetMetadata.cpp15
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