summaryrefslogtreecommitdiff
path: root/evthread_win32.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_win32.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_win32.c')
-rw-r--r--evthread_win32.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/evthread_win32.c b/evthread_win32.c
new file mode 100644
index 00000000..cfe76fc1
--- /dev/null
+++ b/evthread_win32.c
@@ -0,0 +1,58 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef WIN32
+#include <winsock2.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#endif
+
+struct event_base;
+#include <event2/thread.h>
+
+static void *
+evthread_win32_lock_create(void)
+{
+ CRITICAL_SECTION *lock = mm_malloc(sizeof(CRITICAL_SECTION));
+ if (!lock)
+ return NULL;
+ InitializeCriticalSection(lock);
+ return lock;
+}
+
+static void
+evthread_win32_lock_free(void *_lock)
+{
+ CRITICAL_SECTION *lock = _lock;
+ DeleteCriticalSection(lock);
+}
+
+static void
+evthread_win32_lock(int mode, void *_lock)
+{
+ CRITICAL_SECTION *lock = _lock;
+ if (0 != (mode & EVTHREAD_LOCK))
+ EnterCriticalSection(lock);
+ else
+ LeaveCriticalSection(lock);
+}
+
+static unsigned long
+evthread_win32_get_id(void)
+{
+ return (unsigned long) GetCurrentThreadId();
+}
+
+int
+evthread_use_windows_threads(struct event_base *base)
+{
+ evthread_set_lock_create_callbacks(base,
+ evthread_win32_lock_create,
+ evthread_win32_lock_free);
+ evthread_set_locking_callback(base, evthread_win32_lock);
+ evthread_set_id_callback(base, evthread_win32_get_id);
+ return 0;
+}
+