[redland-dev] Calling librdf_new_uri from multiple threads

Dave Beckett dave at dajobe.org
Wed Oct 1 15:57:42 EDT 2014


Yeah I'd expect there are threading issues; it's not a well tested path.

Dave

On Wed, 1 Oct 2014, Anthony Bargnesi wrote:

> 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
> 
> 
> 
>


More information about the redland-dev mailing list