[redland-dev] Calling librdf_new_uri from multiple threads
Anthony Bargnesi
abargnesi at gmail.com
Wed Oct 1 13:58:57 EDT 2014
These segfaults seem to be related to URI interning (raptor_avltree) using
multiple pthreads.
Setting the RAPTOR_WORLD_FLAG_URI_INTERNING flag to 0 eliminates the
segfaults from the previous example.
// open world
world = librdf_new_world();
librdf_world_open(world);
// set raptor flags
rworld = raptor_new_world();
raptor_world_set_flag(rworld, RAPTOR_WORLD_FLAG_URI_INTERNING, 0);
librdf_world_set_raptor(world, rworld);
Is it possible for raptor to use a pthread_mutex to synchronize the
raptor_avltree function calls? It would be nice to have interning in a
multi-threaded environment.
Thanks!
Anthony Bargnesi
On Fri, Sep 19, 2014 at 4:16 PM, Anthony Bargnesi <abargnesi at gmail.com>
wrote:
> Hi folks,
>
> I am encountering segfaults when calling librdf_new_uri from multiple
> threads in C. My program code:
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <stdarg.h>
> #include <pthread.h>
> #include <librdf.h>
> #include <raptor2.h>
> /* pthread_mutex_t mutex; */
>
> struct thread_struct {
> librdf_world *world;
> char *uri;
> };
>
> void *create_uri_instances(void *args) {
> char *original_uri;
> char *uri_copy;
> librdf_uri *uri;
> struct thread_struct *arg_struct = (struct thread_struct *) args;
> const int iterations = 1000;
>
> librdf_world_open(arg_struct->world);
>
> int i;
> for(i = 0; i < iterations; i++) {
> uri_copy = (char *) malloc(strlen(arg_struct->uri) + 1);
> strcpy(uri_copy, arg_struct->uri);
>
> /* pthread_mutex_lock(&mutex); */
> uri = librdf_new_uri(arg_struct->world, uri_copy);
> librdf_free_uri(uri);
> fprintf(stdout, "new/free of librdf_uri: %s\n", uri_copy);
> free(uri_copy);
> /* pthread_mutex_unlock(&mutex); */
> }
> }
>
> int main(int argc, char *argv[]) {
> librdf_world* world;
> pthread_t create_uri_instances_thread_1;
> pthread_t create_uri_instances_thread_2;
>
> // open world
> world = librdf_new_world();
> librdf_world_open(world);
>
> /* pthread_mutex_init(&mutex, NULL); */
>
> /* start thread 1 */
> struct thread_struct args1;
> args1.world = world;
> args1.uri = "http://host.org/1";
> pthread_create(&create_uri_instances_thread_1, NULL,
> create_uri_instances, (void *) &args1);
>
> /* start thread 2 */
> struct thread_struct args2;
> args2.world = world;
> args2.uri = "http://host.org/2";
> pthread_create(&create_uri_instances_thread_2, NULL,
> create_uri_instances, (void *) &args2);
>
> /* join on threads */
> pthread_join(create_uri_instances_thread_1, NULL);
> pthread_join(create_uri_instances_thread_2, NULL);
>
> librdf_free_world(world);
> pthread_mutex_destroy(&mutex);
> return 0;
> }
>
> Without the pthread mutex I encounter different segfaults originating from
> raptor_avltree.c. The gdb backtraces are attached. When I synchronize
> around librdf_new_uri / librdf_free_uri with the pthread mutext I do not
> encounter segfaults.
>
> Is this expected behaviour? Does anyone have advice or examples on using
> threads with librdf?
>
> Thanks for your time,
>
> Anthony Bargnesi
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.librdf.org/pipermail/redland-dev/attachments/20141001/662c33fe/attachment.html>
More information about the redland-dev
mailing list