mirror of https://github.com/encounter/SDL.git
Add optional suffix `_generic` to generic SDL_cond impl
Allows for runtime selectable implementation
This commit is contained in:
parent
7539ac8087
commit
2443e51e0e
|
@ -1512,13 +1512,15 @@ elseif(WINDOWS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(SDL_THREADS)
|
if(SDL_THREADS)
|
||||||
|
set(SDL_THREAD_GENERIC_COND_SUFFIX 1)
|
||||||
set(SDL_THREAD_WINDOWS 1)
|
set(SDL_THREAD_WINDOWS 1)
|
||||||
set(SOURCE_FILES ${SOURCE_FILES}
|
set(SOURCE_FILES ${SOURCE_FILES}
|
||||||
|
${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c
|
||||||
|
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syscond_srw.c
|
||||||
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
|
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
|
||||||
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
|
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
|
||||||
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
|
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
|
||||||
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
|
${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c)
|
||||||
${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
|
|
||||||
set(HAVE_SDL_THREADS TRUE)
|
set(HAVE_SDL_THREADS TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -132,6 +132,7 @@
|
||||||
<ClInclude Include="..\..\src\sensor\SDL_syssensor.h" />
|
<ClInclude Include="..\..\src\sensor\SDL_syssensor.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
||||||
|
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
|
||||||
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
||||||
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
||||||
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
||||||
|
@ -269,6 +270,7 @@
|
||||||
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
||||||
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
||||||
|
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
||||||
|
|
|
@ -381,6 +381,9 @@
|
||||||
<ClInclude Include="..\..\src\joystick\windows\SDL_xinputjoystick_c.h">
|
<ClInclude Include="..\..\src\joystick\windows\SDL_xinputjoystick_c.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h">
|
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -716,6 +719,9 @@
|
||||||
<ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c">
|
<ClCompile Include="..\..\src\joystick\windows\SDL_xinputjoystick.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c">
|
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -146,6 +146,7 @@
|
||||||
<ClInclude Include="..\..\src\sensor\SDL_sensor_c.h" />
|
<ClInclude Include="..\..\src\sensor\SDL_sensor_c.h" />
|
||||||
<ClInclude Include="..\..\src\sensor\SDL_syssensor.h" />
|
<ClInclude Include="..\..\src\sensor\SDL_syssensor.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
||||||
|
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
|
||||||
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
||||||
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
||||||
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
||||||
|
@ -303,6 +304,7 @@
|
||||||
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
||||||
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
||||||
|
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
||||||
|
|
|
@ -390,6 +390,9 @@
|
||||||
<ClInclude Include="..\..\src\joystick\windows\SDL_dinputjoystick_c.h">
|
<ClInclude Include="..\..\src\joystick\windows\SDL_dinputjoystick_c.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h">
|
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -743,6 +746,9 @@
|
||||||
<ClCompile Include="..\..\src\joystick\windows\SDL_dinputjoystick.c">
|
<ClCompile Include="..\..\src\joystick\windows\SDL_dinputjoystick.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c">
|
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -359,6 +359,7 @@
|
||||||
<ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" />
|
<ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
||||||
|
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
|
||||||
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
||||||
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
||||||
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
||||||
|
@ -512,6 +513,7 @@
|
||||||
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
||||||
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
||||||
|
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
||||||
|
|
|
@ -301,6 +301,7 @@
|
||||||
<ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" />
|
<ClInclude Include="..\..\src\sensor\windows\SDL_windowssensor.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
||||||
|
<ClInclude Include="..\..\src\thread\generic\SDL_syscond_c.h" />
|
||||||
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
<ClInclude Include="..\..\src\thread\windows\SDL_systhread_c.h" />
|
||||||
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
||||||
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
||||||
|
@ -456,6 +457,7 @@
|
||||||
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
<ClCompile Include="..\..\src\stdlib\SDL_strtokr.c" />
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
||||||
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
||||||
|
<ClCompile Include="..\..\src\thread\windows\SDL_syscond_srw.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_sysmutex.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_syssem.c" />
|
||||||
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
<ClCompile Include="..\..\src\thread\windows\SDL_systhread.c" />
|
||||||
|
|
|
@ -3869,6 +3869,7 @@ AS_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
|
||||||
fi
|
fi
|
||||||
# Set up files for the thread library
|
# Set up files for the thread library
|
||||||
if test x$enable_threads = xyes; then
|
if test x$enable_threads = xyes; then
|
||||||
|
AC_DEFINE(SDL_THREAD_GENERIC_COND_SUFFIX, 1, [])
|
||||||
AC_DEFINE(SDL_THREAD_WINDOWS, 1, [ ])
|
AC_DEFINE(SDL_THREAD_WINDOWS, 1, [ ])
|
||||||
SOURCES="$SOURCES $srcdir/src/thread/windows/*.c"
|
SOURCES="$SOURCES $srcdir/src/thread/windows/*.c"
|
||||||
SOURCES="$SOURCES $srcdir/src/thread/generic/SDL_syscond.c"
|
SOURCES="$SOURCES $srcdir/src/thread/generic/SDL_syscond.c"
|
||||||
|
|
|
@ -330,6 +330,7 @@
|
||||||
#cmakedefine SDL_LOADSO_WINDOWS @SDL_LOADSO_WINDOWS@
|
#cmakedefine SDL_LOADSO_WINDOWS @SDL_LOADSO_WINDOWS@
|
||||||
|
|
||||||
/* Enable various threading systems */
|
/* Enable various threading systems */
|
||||||
|
#cmakedefine SDL_THREAD_GENERIC_COND_SUFFIX @SDL_THREAD_GENERIC_COND_SUFFIX@
|
||||||
#cmakedefine SDL_THREAD_PTHREAD @SDL_THREAD_PTHREAD@
|
#cmakedefine SDL_THREAD_PTHREAD @SDL_THREAD_PTHREAD@
|
||||||
#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX@
|
#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX@
|
||||||
#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP@
|
#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP@
|
||||||
|
|
|
@ -331,6 +331,7 @@
|
||||||
#undef SDL_LOADSO_WINDOWS
|
#undef SDL_LOADSO_WINDOWS
|
||||||
|
|
||||||
/* Enable various threading systems */
|
/* Enable various threading systems */
|
||||||
|
#undef SDL_THREAD_GENERIC_COND_SUFFIX
|
||||||
#undef SDL_THREAD_PTHREAD
|
#undef SDL_THREAD_PTHREAD
|
||||||
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX
|
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX
|
||||||
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
|
#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP
|
||||||
|
|
|
@ -237,6 +237,7 @@ typedef unsigned int uintptr_t;
|
||||||
#define SDL_LOADSO_WINDOWS 1
|
#define SDL_LOADSO_WINDOWS 1
|
||||||
|
|
||||||
/* Enable various threading systems */
|
/* Enable various threading systems */
|
||||||
|
#define SDL_THREAD_GENERIC_COND_SUFFIX 1
|
||||||
#define SDL_THREAD_WINDOWS 1
|
#define SDL_THREAD_WINDOWS 1
|
||||||
|
|
||||||
/* Enable various timer systems */
|
/* Enable various timer systems */
|
||||||
|
|
|
@ -212,6 +212,7 @@ typedef unsigned int uintptr_t;
|
||||||
|
|
||||||
/* Enable various threading systems */
|
/* Enable various threading systems */
|
||||||
#if (NTDDI_VERSION >= NTDDI_WINBLUE)
|
#if (NTDDI_VERSION >= NTDDI_WINBLUE)
|
||||||
|
#define SDL_THREAD_GENERIC_COND_SUFFIX 1
|
||||||
#define SDL_THREAD_WINDOWS 1
|
#define SDL_THREAD_WINDOWS 1
|
||||||
#else
|
#else
|
||||||
/* WinRT on Windows 8.0 and Windows Phone 8.0 don't support CreateThread() */
|
/* WinRT on Windows 8.0 and Windows Phone 8.0 don't support CreateThread() */
|
||||||
|
|
|
@ -28,41 +28,57 @@
|
||||||
|
|
||||||
#include "SDL_thread.h"
|
#include "SDL_thread.h"
|
||||||
|
|
||||||
struct SDL_cond
|
#include "../generic/SDL_syscond_c.h"
|
||||||
|
|
||||||
|
/* If two implementations are to be compiled into SDL (the active one
|
||||||
|
* will be chosen at runtime), the function names need to be
|
||||||
|
* suffixed
|
||||||
|
*/
|
||||||
|
#if !SDL_THREAD_GENERIC_COND_SUFFIX
|
||||||
|
#define SDL_CreateCond_generic SDL_CreateCond
|
||||||
|
#define SDL_DestroyCond_generic SDL_DestroyCond
|
||||||
|
#define SDL_CondSignal_generic SDL_CondSignal
|
||||||
|
#define SDL_CondBroadcast_generic SDL_CondBroadcast
|
||||||
|
#define SDL_CondWait_generic SDL_CondWait
|
||||||
|
#define SDL_CondWaitTimeout_generic SDL_CondWaitTimeout
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct SDL_cond_generic
|
||||||
{
|
{
|
||||||
SDL_mutex *lock;
|
SDL_mutex *lock;
|
||||||
int waiting;
|
int waiting;
|
||||||
int signals;
|
int signals;
|
||||||
SDL_sem *wait_sem;
|
SDL_sem *wait_sem;
|
||||||
SDL_sem *wait_done;
|
SDL_sem *wait_done;
|
||||||
};
|
} SDL_cond_generic;
|
||||||
|
|
||||||
/* Create a condition variable */
|
/* Create a condition variable */
|
||||||
SDL_cond *
|
SDL_cond *
|
||||||
SDL_CreateCond(void)
|
SDL_CreateCond_generic(void)
|
||||||
{
|
{
|
||||||
SDL_cond *cond;
|
SDL_cond_generic *cond;
|
||||||
|
|
||||||
cond = (SDL_cond *) SDL_malloc(sizeof(SDL_cond));
|
cond = (SDL_cond_generic *) SDL_malloc(sizeof(SDL_cond_generic));
|
||||||
if (cond) {
|
if (cond) {
|
||||||
cond->lock = SDL_CreateMutex();
|
cond->lock = SDL_CreateMutex();
|
||||||
cond->wait_sem = SDL_CreateSemaphore(0);
|
cond->wait_sem = SDL_CreateSemaphore(0);
|
||||||
cond->wait_done = SDL_CreateSemaphore(0);
|
cond->wait_done = SDL_CreateSemaphore(0);
|
||||||
cond->waiting = cond->signals = 0;
|
cond->waiting = cond->signals = 0;
|
||||||
if (!cond->lock || !cond->wait_sem || !cond->wait_done) {
|
if (!cond->lock || !cond->wait_sem || !cond->wait_done) {
|
||||||
SDL_DestroyCond(cond);
|
SDL_DestroyCond_generic((SDL_cond *)cond);
|
||||||
cond = NULL;
|
cond = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SDL_OutOfMemory();
|
SDL_OutOfMemory();
|
||||||
}
|
}
|
||||||
return (cond);
|
return (SDL_cond *)cond;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Destroy a condition variable */
|
/* Destroy a condition variable */
|
||||||
void
|
void
|
||||||
SDL_DestroyCond(SDL_cond * cond)
|
SDL_DestroyCond_generic(SDL_cond * _cond)
|
||||||
{
|
{
|
||||||
|
SDL_cond_generic *cond = (SDL_cond_generic *)_cond;
|
||||||
if (cond) {
|
if (cond) {
|
||||||
if (cond->wait_sem) {
|
if (cond->wait_sem) {
|
||||||
SDL_DestroySemaphore(cond->wait_sem);
|
SDL_DestroySemaphore(cond->wait_sem);
|
||||||
|
@ -79,8 +95,9 @@ SDL_DestroyCond(SDL_cond * cond)
|
||||||
|
|
||||||
/* Restart one of the threads that are waiting on the condition variable */
|
/* Restart one of the threads that are waiting on the condition variable */
|
||||||
int
|
int
|
||||||
SDL_CondSignal(SDL_cond * cond)
|
SDL_CondSignal_generic(SDL_cond * _cond)
|
||||||
{
|
{
|
||||||
|
SDL_cond_generic *cond = (SDL_cond_generic *)_cond;
|
||||||
if (!cond) {
|
if (!cond) {
|
||||||
return SDL_SetError("Passed a NULL condition variable");
|
return SDL_SetError("Passed a NULL condition variable");
|
||||||
}
|
}
|
||||||
|
@ -103,8 +120,9 @@ SDL_CondSignal(SDL_cond * cond)
|
||||||
|
|
||||||
/* Restart all threads that are waiting on the condition variable */
|
/* Restart all threads that are waiting on the condition variable */
|
||||||
int
|
int
|
||||||
SDL_CondBroadcast(SDL_cond * cond)
|
SDL_CondBroadcast_generic(SDL_cond * _cond)
|
||||||
{
|
{
|
||||||
|
SDL_cond_generic *cond = (SDL_cond_generic *)_cond;
|
||||||
if (!cond) {
|
if (!cond) {
|
||||||
return SDL_SetError("Passed a NULL condition variable");
|
return SDL_SetError("Passed a NULL condition variable");
|
||||||
}
|
}
|
||||||
|
@ -157,8 +175,9 @@ Thread B:
|
||||||
SDL_UnlockMutex(lock);
|
SDL_UnlockMutex(lock);
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
|
SDL_CondWaitTimeout_generic(SDL_cond * _cond, SDL_mutex * mutex, Uint32 ms)
|
||||||
{
|
{
|
||||||
|
SDL_cond_generic *cond = (SDL_cond_generic *)_cond;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
if (!cond) {
|
if (!cond) {
|
||||||
|
@ -212,9 +231,9 @@ SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
|
||||||
|
|
||||||
/* Wait on the condition variable forever */
|
/* Wait on the condition variable forever */
|
||||||
int
|
int
|
||||||
SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex)
|
SDL_CondWait_generic(SDL_cond * cond, SDL_mutex * mutex)
|
||||||
{
|
{
|
||||||
return SDL_CondWaitTimeout(cond, mutex, SDL_MUTEX_MAXWAIT);
|
return SDL_CondWaitTimeout_generic(cond, mutex, SDL_MUTEX_MAXWAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "../../SDL_internal.h"
|
||||||
|
|
||||||
|
#include "SDL_thread.h"
|
||||||
|
|
||||||
|
#ifndef SDL_syscond_generic_h_
|
||||||
|
#define SDL_syscond_generic_h_
|
||||||
|
|
||||||
|
#if SDL_THREAD_GENERIC_COND_SUFFIX
|
||||||
|
|
||||||
|
SDL_cond * SDL_CreateCond_generic(void);
|
||||||
|
void SDL_DestroyCond_generic(SDL_cond * cond);
|
||||||
|
int SDL_CondSignal_generic(SDL_cond * cond);
|
||||||
|
int SDL_CondBroadcast_generic(SDL_cond * cond);
|
||||||
|
int SDL_CondWait_generic(SDL_cond * cond, SDL_mutex * mutex);
|
||||||
|
int SDL_CondWaitTimeout_generic(SDL_cond * cond,
|
||||||
|
SDL_mutex * mutex, Uint32 ms);
|
||||||
|
|
||||||
|
#endif /* SDL_THREAD_GENERIC_COND_SUFFIX */
|
||||||
|
|
||||||
|
#endif /* SDL_syscond_generic_h_ */
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "../../SDL_internal.h"
|
||||||
|
|
||||||
|
#include "SDL_hints.h"
|
||||||
|
#include "SDL_thread.h"
|
||||||
|
|
||||||
|
#include "../generic/SDL_syscond_c.h"
|
||||||
|
|
||||||
|
typedef SDL_cond * (*pfnSDL_CreateCond)(void);
|
||||||
|
typedef void (*pfnSDL_DestroyCond)(SDL_cond *);
|
||||||
|
typedef int (*pfnSDL_CondSignal)(SDL_cond *);
|
||||||
|
typedef int (*pfnSDL_CondBroadcast)(SDL_cond *);
|
||||||
|
typedef int (*pfnSDL_CondWait)(SDL_cond *, SDL_mutex *);
|
||||||
|
typedef int (*pfnSDL_CondWaitTimeout)(SDL_cond *, SDL_mutex *, Uint32);
|
||||||
|
|
||||||
|
typedef struct SDL_cond_impl_t
|
||||||
|
{
|
||||||
|
pfnSDL_CreateCond Create;
|
||||||
|
pfnSDL_DestroyCond Destroy;
|
||||||
|
pfnSDL_CondSignal Signal;
|
||||||
|
pfnSDL_CondBroadcast Broadcast;
|
||||||
|
pfnSDL_CondWait Wait;
|
||||||
|
pfnSDL_CondWaitTimeout WaitTimeout;
|
||||||
|
} SDL_cond_impl_t;
|
||||||
|
|
||||||
|
/* Implementation will be chosen at runtime based on available Kernel features */
|
||||||
|
static SDL_cond_impl_t SDL_cond_impl_active = {0};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic Condition Variable implementation using SDL_mutex and SDL_sem
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const SDL_cond_impl_t SDL_cond_impl_generic =
|
||||||
|
{
|
||||||
|
&SDL_CreateCond_generic,
|
||||||
|
&SDL_DestroyCond_generic,
|
||||||
|
&SDL_CondSignal_generic,
|
||||||
|
&SDL_CondBroadcast_generic,
|
||||||
|
&SDL_CondWait_generic,
|
||||||
|
&SDL_CondWaitTimeout_generic,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
SDL_cond *
|
||||||
|
SDL_CreateCond(void)
|
||||||
|
{
|
||||||
|
if (SDL_cond_impl_active.Create == NULL) {
|
||||||
|
SDL_memcpy(&SDL_cond_impl_active, &SDL_cond_impl_generic, sizeof(SDL_cond_impl_active));
|
||||||
|
}
|
||||||
|
return SDL_cond_impl_active.Create();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SDL_DestroyCond(SDL_cond * cond)
|
||||||
|
{
|
||||||
|
SDL_cond_impl_active.Destroy(cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
SDL_CondSignal(SDL_cond * cond)
|
||||||
|
{
|
||||||
|
return SDL_cond_impl_active.Signal(cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
SDL_CondBroadcast(SDL_cond * cond)
|
||||||
|
{
|
||||||
|
return SDL_cond_impl_active.Broadcast(cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
|
||||||
|
{
|
||||||
|
return SDL_cond_impl_active.WaitTimeout(cond, mutex, ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex)
|
||||||
|
{
|
||||||
|
return SDL_cond_impl_active.Wait(cond, mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
Loading…
Reference in New Issue