summaryrefslogtreecommitdiff
path: root/evthread_pthread.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-01-21 07:51:25 +0000
committerNick Mathewson <nickm@torproject.org>2009-01-21 07:51:25 +0000
commit309fc7c4ad34f7e50245c305a776a5e04b4a0555 (patch)
tree07d5a87f1290b387d0ae15aa71f58b11adea05ac /evthread_pthread.c
parent70405e3c7a184a11be506e2e4fd4774e867f978b (diff)
downloadlibevent-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.c59
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;
+}