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_win32.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_win32.c')
-rw-r--r-- | evthread_win32.c | 58 |
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; +} + |