diff options
| author | Philip Kelley <phkelley@hotmail.com> | 2012-10-16 13:18:45 -0400 |
|---|---|---|
| committer | Philip Kelley <phkelley@hotmail.com> | 2012-10-16 13:18:45 -0400 |
| commit | 5e4f2b5faaa86843befadcda2fb784301254e452 (patch) | |
| tree | b5242b1570a9bdb6e28de4b0470e86635a0b6cfb /src/win32/pthread.c | |
| parent | a891841850d50d68842c88f57cd3f7c9cbdff38f (diff) | |
| download | libgit2-5e4f2b5faaa86843befadcda2fb784301254e452.tar.gz | |
Support pthread_cond_* on Win32
Diffstat (limited to 'src/win32/pthread.c')
| -rw-r--r-- | src/win32/pthread.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/win32/pthread.c b/src/win32/pthread.c index 3a186c8d9..cbed9d993 100644 --- a/src/win32/pthread.c +++ b/src/win32/pthread.c @@ -54,6 +54,71 @@ int pthread_mutex_unlock(pthread_mutex_t *mutex) return 0; } +int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) +{ + /* We don't support non-default attributes. */ + if (attr) + return EINVAL; + + /* This is an auto-reset event. */ + *cond = CreateEventW(NULL, FALSE, FALSE, NULL); + assert(*cond); + + /* If we can't create the event, claim that the reason was out-of-memory. + * The actual reason can be fetched with GetLastError(). */ + return *cond ? 0 : ENOMEM; +} + +int pthread_cond_destroy(pthread_cond_t *cond) +{ + BOOL closed; + + if (!cond) + return EINVAL; + + closed = CloseHandle(*cond); + assert(closed); + + *cond = NULL; + return 0; +} + +int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + int error; + DWORD wait_result; + + if (!cond || !mutex) + return EINVAL; + + /* The caller must be holding the mutex. */ + error = pthread_mutex_unlock(mutex); + + if (error) + return error; + + wait_result = WaitForSingleObject(*cond, INFINITE); + assert(WAIT_OBJECT_0 == wait_result); + + return pthread_mutex_lock(mutex); +} + +int pthread_cond_signal(pthread_cond_t *cond) +{ + BOOL signaled; + + if (!cond) + return EINVAL; + + signaled = SetEvent(*cond); + assert(signaled); + + return 0; +} + +/* pthread_cond_broadcast is not implemented because doing so with just Win32 events + * is quite complicated, and no caller in libgit2 uses it yet. */ + int pthread_num_processors_np(void) { DWORD_PTR p, s; |
