diff options
author | Vicent Marti <tanoku@gmail.com> | 2013-04-16 19:46:41 +0400 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2013-04-16 19:46:41 +0400 |
commit | a50086d174658914d4d6462afbc83b02825b1f5b (patch) | |
tree | e8daa1c7bf678222cf351445179837bed7db3a72 /src/win32/pthread.c | |
parent | 5b9fac39d8a76b9139667c26a63e6b3f204b3977 (diff) | |
parent | f124ebd457bfbf43de3516629aaba5a279636e04 (diff) |
Merge branch 'development'v0.18.0
Diffstat (limited to 'src/win32/pthread.c')
-rw-r--r-- | src/win32/pthread.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/src/win32/pthread.c b/src/win32/pthread.c index 3a186c8d9..105f4b89e 100644 --- a/src/win32/pthread.c +++ b/src/win32/pthread.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2012 the libgit2 contributors + * Copyright (C) the libgit2 contributors. All rights reserved. * * This file is part of libgit2, distributed under the GNU GPL v2 with * a Linking Exception. For full terms see the included COPYING file. @@ -54,6 +54,74 @@ 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); + GIT_UNUSED(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); + GIT_UNUSED(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); + GIT_UNUSED(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; |