From dc5c579778d8b7b6f113c48d202f89c172abd591 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 23 May 2015 03:20:40 +0000 Subject: Prevent concurrent Sord access. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5683 a436a847-0d15-0410-975c-d299462d15a1 --- src/SocketReader.cpp | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'src/SocketReader.cpp') 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 as base URI so e.g. 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 lock(_world.rdf_mutex()); + + // Use as base URI so e.g. 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 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 lock(_world.rdf_mutex()); + + // Destroy everything fclose(f); sord_inserter_free(_inserter); serd_reader_end_stream(reader); -- cgit v1.2.1