summaryrefslogtreecommitdiffstats
path: root/src/SocketReader.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2015-05-23 03:20:40 +0000
committerDavid Robillard <d@drobilla.net>2015-05-23 03:20:40 +0000
commitdc5c579778d8b7b6f113c48d202f89c172abd591 (patch)
tree7a3a24f7acfab09c652ca466a46099766c8a02d3 /src/SocketReader.cpp
parent63d4ffa098e016a9680b4b1b1f209ab3bb3dbd8c (diff)
downloadingen-dc5c579778d8b7b6f113c48d202f89c172abd591.tar.gz
ingen-dc5c579778d8b7b6f113c48d202f89c172abd591.tar.bz2
ingen-dc5c579778d8b7b6f113c48d202f89c172abd591.zip
Prevent concurrent Sord access.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5683 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/SocketReader.cpp')
-rw-r--r--src/SocketReader.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/SocketReader.cpp b/src/SocketReader.cpp
index 125d904f..85f55f08 100644
--- a/src/SocketReader.cpp
+++ b/src/SocketReader.cpp
@@ -99,10 +99,6 @@ SocketReader::run()
return;
}
- // Use <ingen:/root/> as base URI so e.g. </foo/bar> will be a path
- SordNode* base_uri = sord_new_uri(
- world->c_obj(), (const uint8_t*)"ingen:/root/");
-
// Set up sratom and a forge to build LV2 atoms from model
Sratom* sratom = sratom_new(map);
SerdChunk chunk = { NULL, 0 };
@@ -111,11 +107,23 @@ SocketReader::run()
lv2_atom_forge_set_sink(
&forge, sratom_forge_sink, sratom_forge_deref, &chunk);
- // Make a model and reader to parse the next Turtle message
- _env = world->prefixes().c_obj();
- SordModel* model = sord_new(world->c_obj(), SORD_SPO, false);
+ SordNode* base_uri = NULL;
+ SordModel* model = NULL;
+ {
+ // Lock RDF world
+ std::lock_guard<std::mutex> lock(_world.rdf_mutex());
+
+ // Use <ingen:/root/> as base URI so e.g. </foo/bar> will be a path
+ base_uri = sord_new_uri(
+ world->c_obj(), (const uint8_t*)"ingen:/root/");
+
+ // Make a model and reader to parse the next Turtle message
+ _env = world->prefixes().c_obj();
+ model = sord_new(world->c_obj(), SORD_SPO, false);
- _inserter = sord_inserter_new(model, _env);
+ // Create an inserter for writing incoming triples to model
+ _inserter = sord_inserter_new(model, _env);
+ }
SerdReader* reader = serd_reader_new(
SERD_TURTLE, this, NULL,
@@ -152,6 +160,9 @@ SocketReader::run()
continue; // No data, shouldn't happen
}
+ // Lock RDF world
+ std::lock_guard<std::mutex> lock(_world.rdf_mutex());
+
// Read until the next '.'
SerdStatus st = serd_reader_read_chunk(reader);
if (st == SERD_FAILURE || !_msg_node) {
@@ -174,6 +185,10 @@ SocketReader::run()
_msg_node = NULL;
}
+ // Lock RDF world
+ std::lock_guard<std::mutex> lock(_world.rdf_mutex());
+
+ // Destroy everything
fclose(f);
sord_inserter_free(_inserter);
serd_reader_end_stream(reader);