diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-01-21 07:51:25 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-01-21 07:51:25 +0000 |
commit | 309fc7c4ad34f7e50245c305a776a5e04b4a0555 (patch) | |
tree | 07d5a87f1290b387d0ae15aa71f58b11adea05ac /evthread_pthread.c | |
parent | 70405e3c7a184a11be506e2e4fd4774e867f978b (diff) | |
download | libevent-309fc7c4ad34f7e50245c305a776a5e04b4a0555.tar.gz |
New functions to provide sane threading callbacks with pthreads and win32 threading implementations.
svn:r1031
Diffstat (limited to 'evthread_pthread.c')
-rw-r--r-- | evthread_pthread.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/evthread_pthread.c b/evthread_pthread.c new file mode 100644 index 00000000..72f11a72 --- /dev/null +++ b/evthread_pthread.c @@ -0,0 +1,59 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <pthread.h> +struct event_base; +#include <event2/thread.h> + +#include "mm-internal.h" + +static void * +evthread_posix_lock_create(void) +{ + pthread_mutex_t *lock = mm_malloc(sizeof(pthread_mutex_t)); + if (!lock) + return NULL; + pthread_mutex_init(lock, NULL); + return lock; +} + +static void +evthread_posix_lock_free(void *_lock) +{ + pthread_mutex_t *lock = _lock; + pthread_mutex_destroy(lock); + mm_free(lock); +} + +static void +evthread_posix_lock(int mode, void *_lock) +{ + pthread_mutex_t *lock = _lock; + if (0 != (mode & EVTHREAD_LOCK)) + pthread_mutex_lock(lock); + else + pthread_mutex_unlock(lock); +} + +static unsigned long +evthread_posix_get_id(void) +{ + union { + pthread_t thr; + unsigned long id; + } r; + r.thr = pthread_self(); + return r.id; +} + +int +evthread_use_pthreads(struct event_base *base) +{ + evthread_set_lock_create_callbacks(base, + evthread_posix_lock_create, + evthread_posix_lock_free); + evthread_set_locking_callback(base, evthread_posix_lock); + evthread_set_id_callback(base, evthread_posix_get_id); + return -1; +} |