diff options
author | Józef Kucia <jkucia@codeweavers.com> | 2016-10-07 14:26:39 +0300 |
---|---|---|
committer | Józef Kucia <jkucia@codeweavers.com> | 2016-10-07 14:26:39 +0300 |
commit | c7d123b1222795b638ad9b6fc6305931e9ba20f8 (patch) | |
tree | 54eda34816f18babce7e426141a81a467893efec /libs/vkd3d-utils | |
parent | 0c1432e671248ca2c8f6d0509d4eb25954e15bad (diff) |
libs/vkd3d: Move event objects implementation to libvkd3d-utils.
The libvkd3d is not the best place for event objects implementation.
Diffstat (limited to 'libs/vkd3d-utils')
-rw-r--r-- | libs/vkd3d-utils/vkd3d_utils_main.c | 108 | ||||
-rw-r--r-- | libs/vkd3d-utils/vkd3d_utils_private.h | 12 |
2 files changed, 118 insertions, 2 deletions
diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c index e0b6c303..e7933633 100644 --- a/libs/vkd3d-utils/vkd3d_utils_main.c +++ b/libs/vkd3d-utils/vkd3d_utils_main.c @@ -45,3 +45,111 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, return vkd3d_create_device(&create_info, riid, device); } + +/* Events */ +HANDLE WINAPI VKD3DCreateEvent(void) +{ + struct vkd3d_event *event; + int rc; + + TRACE(".\n"); + + if (!(event = vkd3d_malloc(sizeof(*event)))) + return NULL; + + if ((rc = pthread_mutex_init(&event->mutex, NULL))) + { + ERR("Failed to initialize mutex, error %d.\n", rc); + vkd3d_free(event); + return NULL; + } + if ((rc = pthread_cond_init(&event->cond, NULL))) + { + ERR("Failed to initialize condition variable, error %d.\n", rc); + pthread_mutex_destroy(&event->mutex); + vkd3d_free(event); + return NULL; + } + + event->is_signaled = FALSE; + + TRACE("Created event %p.\n", event); + + return event; +} + +unsigned int WINAPI VKD3DWaitEvent(HANDLE event, unsigned int milliseconds) +{ + struct vkd3d_event *impl = event; + int rc; + + TRACE("event %p, milliseconds %u.\n", event, milliseconds); + + if ((rc = pthread_mutex_lock(&impl->mutex))) + { + ERR("Failed to lock mutex, error %d.\n", rc); + return WAIT_FAILED; + } + + if (impl->is_signaled || !milliseconds) + { + BOOL is_signaled = impl->is_signaled; + impl->is_signaled = FALSE; + pthread_mutex_unlock(&impl->mutex); + return is_signaled ? WAIT_OBJECT_0 : WAIT_TIMEOUT; + } + + if (milliseconds == INFINITE) + { + do + { + if ((rc = pthread_cond_wait(&impl->cond, &impl->mutex))) + { + ERR("Failed to wait on condition variable, error %d.\n", rc); + pthread_mutex_unlock(&impl->mutex); + return WAIT_FAILED; + } + } while (!impl->is_signaled); + + impl->is_signaled = FALSE; + pthread_mutex_unlock(&impl->mutex); + return WAIT_OBJECT_0; + } + + pthread_mutex_unlock(&impl->mutex); + FIXME("Timed wait not implemented yet.\n"); + return WAIT_FAILED; +} + +BOOL WINAPI VKD3DSignalEvent(HANDLE event) +{ + struct vkd3d_event *impl = event; + int rc; + + TRACE("event %p.\n", event); + + if ((rc = pthread_mutex_lock(&impl->mutex))) + { + ERR("Failed to lock mutex, error %d.\n", rc); + return FALSE; + } + impl->is_signaled = TRUE; + pthread_cond_signal(&impl->cond); + pthread_mutex_unlock(&impl->mutex); + + return TRUE; +} + +void WINAPI VKD3DDestroyEvent(HANDLE event) +{ + struct vkd3d_event *impl = event; + int rc; + + TRACE("event %p.\n", event); + + if ((rc = pthread_mutex_destroy(&impl->mutex))) + ERR("Failed to destroy mutex, error %d.\n", rc); + if ((rc = pthread_cond_destroy(&impl->cond))) + ERR("Failed to destroy condition variable, error %d.\n", rc); + vkd3d_free(impl); +} diff --git a/libs/vkd3d-utils/vkd3d_utils_private.h b/libs/vkd3d-utils/vkd3d_utils_private.h index a6405760..f9f0db53 100644 --- a/libs/vkd3d-utils/vkd3d_utils_private.h +++ b/libs/vkd3d-utils/vkd3d_utils_private.h @@ -23,10 +23,18 @@ #ifndef __VKD3D_UTILS_PRIVATE_H #define __VKD3D_UTILS_PRIVATE_H +#include <pthread.h> + #define COBJMACROS #define NONAMELESSUNION -#include "vkd3d_debug.h" - +#include "vkd3d_memory.h" #include "vkd3d.h" +struct vkd3d_event +{ + pthread_mutex_t mutex; + pthread_cond_t cond; + BOOL is_signaled; +}; + #endif /* __VKD3D_UTILS_PRIVATE_H */ |