]> git.proxmox.com Git - libgit2.git/commitdiff
Support pthread_cond_* on Win32
authorPhilip Kelley <phkelley@hotmail.com>
Tue, 16 Oct 2012 17:18:45 +0000 (13:18 -0400)
committerPhilip Kelley <phkelley@hotmail.com>
Tue, 16 Oct 2012 17:18:45 +0000 (13:18 -0400)
src/win32/pthread.c
src/win32/pthread.h

index 3a186c8d9516e464015dc9981671d049de5c8c3d..cbed9d99397741e8ca609b2c49745e47c53c0f26 100644 (file)
@@ -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;
index b194cbfa745dc7c7c35cb6a4370f6b9f2ddb8309..136f9b1a3c7633fdd4530e343bd1c6275d55052e 100644 (file)
@@ -21,6 +21,7 @@ typedef int pthread_condattr_t;
 typedef int pthread_attr_t;
 typedef CRITICAL_SECTION pthread_mutex_t;
 typedef HANDLE pthread_t;
+typedef HANDLE pthread_cond_t;
 
 #define PTHREAD_MUTEX_INITIALIZER {(void*)-1};
 
@@ -35,6 +36,12 @@ int pthread_mutex_destroy(pthread_mutex_t *);
 int pthread_mutex_lock(pthread_mutex_t *);
 int pthread_mutex_unlock(pthread_mutex_t *);
 
+int pthread_cond_init(pthread_cond_t *, const pthread_condattr_t *);
+int pthread_cond_destroy(pthread_cond_t *);
+int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
+int pthread_cond_signal(pthread_cond_t *);
+/* pthread_cond_broadcast is not supported on Win32 yet. */
+
 int pthread_num_processors_np(void);
 
 #endif