Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ValveSoftware/vkd3d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJózef Kucia <jkucia@codeweavers.com>2016-10-07 14:26:39 +0300
committerJózef Kucia <jkucia@codeweavers.com>2016-10-07 14:26:39 +0300
commitc7d123b1222795b638ad9b6fc6305931e9ba20f8 (patch)
tree54eda34816f18babce7e426141a81a467893efec /libs/vkd3d-utils
parent0c1432e671248ca2c8f6d0509d4eb25954e15bad (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.c108
-rw-r--r--libs/vkd3d-utils/vkd3d_utils_private.h12
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 */