Hi Mark,

I would like to figure out ways in which libevent can be more thread
friendly without requiring everyone to use threads.   So, thread
specific store for the event base seems like a good idea and I would
certainly appreciate to see patches.

Niels.

On 8/5/07, Mark Heily <[EMAIL PROTECTED]> wrote:
> On Sun, 2007-08-05 at 15:31 -0300, Victor wrote:
> > Is it safe to call event_add() from a second thread to
> > add more events on that event loop base?
>
> No. Two threads cannot modify the same event_base struct without
> explicit locking. You would need to use a mutex to protect the
> event_add() call.
>
> On a related note...
>
> I would like to see a threaded version of libevent that would give each
> thread it's own current_base variable. Right now, there is a global
> variable in event.c:
>
>    struct event_base *current_base = NULL;
>
> A threaded library would use thread-specific data instead:
>
>   static pthread_key_t *current_base_key;
>   #define current_base \
>     ((struct event_base *) (pthread_get_specific(current_base_key))
>
> This would allow you to use event_add(), event_dispatch(), and
> event_loop() in multiple threads in a natural way. Each thread would get
> it's own event loop automatically and not interfere with other threads'
> operation.
>
> You could also add internal protection within the event_base_()
> functions with mutexes so that two threads would not be able to modify
> the same event_base struct simultaneously.
>
> My suggestion is to name this threaded version of the library
> `libevent_r.a` and have a separate Makefile target to generate the
> threaded version. This second target would add -D_REENTRANT to the
> CFLAGS to enable all of the threaded codepaths. You would also need to
> link it with the pthreads library by adding -lpthread to the LDFLAGS.
>
> Returning to my previous example, you would modify event.c to look
> something like this:
>
> #if _REENTRANT
>
> static pthread_key_t *current_base_key;
> # define current_base \
>     ((struct event_base *) (pthread_get_specific(current_base_key))
>
> #else
>
> struct event_base *current_base = NULL;
>
> #endif
>
>
> This approach allows both the threadsafe and non-threadsafe library to
> be built from the same source code.
>
> Niels, does this sound like something you would be willing to consider?
> If so, I would be willing to do the work and submit a patch.
>
> Regards,
>
> Mark
>
>
> _______________________________________________
> Libevent-users mailing list
> Libevent-users@monkey.org
> http://monkey.org/mailman/listinfo/libevent-users
>
>
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to