From 9f43f23510ba2acd8e03f2822d87c74a8774b9d6 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 25 Jul 2007 05:01:28 +0000 Subject: Start work on lock stuff, for threadsafe SLV2 and using SLV2 with apps that use Redland themselves. git-svn-id: http://svn.drobilla.net/lad/slv2@621 a436a847-0d15-0410-975c-d299462d15a1 --- src/slv2_internal.h | 12 +++++++++- src/world.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/slv2_internal.h b/src/slv2_internal.h index 2694b5d..4e8c8da 100644 --- a/src/slv2_internal.h +++ b/src/slv2_internal.h @@ -133,7 +133,6 @@ void slv2_plugin_classes_free(); /* ********* World ********* */ - /** Model of LV2 (RDF) data loaded from bundles. */ struct _SLV2World { @@ -145,8 +144,19 @@ struct _SLV2World { SLV2Plugins plugins; librdf_node* lv2_plugin_node; librdf_node* rdf_a_node; + + void (*rdf_lock)(void*); + void (*rdf_unlock)(void*); + void* rdf_lock_data; + int rdf_lock_count; }; +void +slv2_world_lock_if_necessary(SLV2World world); + +void +slv2_world_unlock_if_necessary(SLV2World world); + /** Load all bundles found in \a search_path. * * \param search_path A colon-delimited list of directories. These directories diff --git a/src/world.c b/src/world.c index 898ab5a..d3776e5 100644 --- a/src/world.c +++ b/src/world.c @@ -67,6 +67,11 @@ slv2_world_new() world->rdf_a_node = librdf_new_node_from_uri_string(world->world, (unsigned char*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); + + world->rdf_lock = NULL; + world->rdf_unlock = NULL; + world->rdf_lock_data = NULL; + world->rdf_lock_count = 0; return world; @@ -110,6 +115,11 @@ slv2_world_new_using_rdf_world(librdf_world* rdf_world) world->rdf_a_node = librdf_new_node_from_uri_string(rdf_world, (unsigned char*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); + + world->rdf_lock = NULL; + world->rdf_unlock = NULL; + world->rdf_lock_data = NULL; + world->rdf_lock_count = 0; return world; @@ -122,6 +132,9 @@ fail: void slv2_world_free(SLV2World world) { + if (world->rdf_lock) + world->rdf_lock(world->rdf_lock_data); + librdf_free_node(world->lv2_plugin_node); librdf_free_node(world->rdf_a_node); @@ -144,14 +157,62 @@ slv2_world_free(SLV2World world) librdf_free_world(world->world); world->world = NULL; + + if (world->rdf_unlock) + world->rdf_unlock(world->rdf_lock_data); free(world); } +void +slv2_world_set_rdf_lock_function(SLV2World world, void (*lock)(void*), void* data) +{ + world->rdf_lock = lock; + world->rdf_lock_data = data; +} + + +void +slv2_world_set_rdf_unlock_function(SLV2World world, void (*unlock)(void*)) +{ + world->rdf_unlock = unlock; +} + + +void +slv2_world_lock_if_necessary(SLV2World world) +{ + if (world->rdf_lock) { + + if (world->rdf_lock_count == 0) + world->rdf_lock(world->rdf_lock_data); + + ++world->rdf_lock_count; + + } +} + + +void +slv2_world_unlock_if_necessary(SLV2World world) +{ + if (world->rdf_lock && world->rdf_lock_count > 0) { + + if (world->rdf_lock_count == 1 && world->rdf_unlock) + world->rdf_unlock(world->rdf_lock_data); + + world->rdf_lock_count = 0; + + } +} + + void slv2_world_load_bundle(SLV2World world, const char* bundle_uri_str) { + slv2_world_lock_if_necessary(world); + librdf_uri* bundle_uri = librdf_new_uri(world->world, (const unsigned char*)bundle_uri_str); @@ -209,6 +270,8 @@ slv2_world_load_bundle(SLV2World world, const char* bundle_uri_str) librdf_free_storage(manifest_storage); librdf_free_uri(manifest_uri); librdf_free_uri(bundle_uri); + + slv2_world_unlock_if_necessary(world); } -- cgit v1.2.1