23 #if SDL_THREAD_WINDOWS
27 #include "SDL_thread.h"
28 #include "../SDL_thread_c.h"
29 #include "../SDL_systhread.h"
30 #include "SDL_systhread_c.h"
32 #ifndef SDL_PASSED_BEGINTHREAD_ENDTHREAD
37 #if (defined(__MINGW32__) && (__GNUC__ < 4))
38 typedef unsigned long (__cdecl *pfnSDL_CurrentBeginThread) (
void *, unsigned,
39 unsigned (__stdcall *
func)(
void *),
void *arg,
40 unsigned,
unsigned *threadID);
41 typedef void (__cdecl *pfnSDL_CurrentEndThread)(
unsigned code);
43 #elif defined(__WATCOMC__)
45 #if __WATCOMC__ < 1240
48 typedef unsigned long (__watcall * pfnSDL_CurrentBeginThread) (
void *,
58 typedef void (__watcall * pfnSDL_CurrentEndThread) (
unsigned code);
61 typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (
void *, unsigned,
67 typedef void (__cdecl * pfnSDL_CurrentEndThread) (
unsigned code);
72 typedef struct ThreadStartParms
75 pfnSDL_CurrentEndThread pfnCurrentEndThread;
76 } tThreadStartParms, *pThreadStartParms;
81 pThreadStartParms pThreadParms = (pThreadStartParms) data;
82 pfnSDL_CurrentEndThread pfnEndThread = pThreadParms->pfnCurrentEndThread;
83 void *args = pThreadParms->args;
86 if (pfnEndThread !=
NULL)
92 RunThreadViaCreateThread(
LPVOID data)
97 static unsigned __stdcall
98 RunThreadViaBeginThreadEx(
void *data)
103 #ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD
106 pfnSDL_CurrentBeginThread pfnBeginThread,
107 pfnSDL_CurrentEndThread pfnEndThread)
109 #elif defined(__CYGWIN__)
113 pfnSDL_CurrentBeginThread pfnBeginThread =
NULL;
114 pfnSDL_CurrentEndThread pfnEndThread =
NULL;
119 pfnSDL_CurrentBeginThread pfnBeginThread = _beginthreadex;
120 pfnSDL_CurrentEndThread pfnEndThread = _endthreadex;
122 pThreadStartParms pThreadParms =
123 (pThreadStartParms)
SDL_malloc(
sizeof(tThreadStartParms));
128 pThreadParms->pfnCurrentEndThread = pfnEndThread;
130 pThreadParms->args = args;
132 if (pfnBeginThread) {
133 unsigned threadid = 0;
135 ((
size_t) pfnBeginThread(
NULL, 0, RunThreadViaBeginThreadEx,
136 pThreadParms, 0, &threadid));
139 thread->
handle = CreateThread(
NULL, 0, RunThreadViaCreateThread,
140 pThreadParms, 0, &threadid);
143 return SDL_SetError(
"Not enough resources to create thread");
149 #pragma warning(disable : 4733)
151 typedef struct tagTHREADNAME_INFO
160 static EXCEPTION_DISPOSITION
161 ignore_exception(
void *
a,
void *
b,
void *
c,
void *
d)
163 return ExceptionContinueExecution;
171 #if (defined(_MSC_VER) && defined(_M_IX86))
176 INT_PTR handler = (INT_PTR) ignore_exception;
181 inf.dwThreadID = (
DWORD) -1;
191 RaiseException(0x406D1388, 0,
sizeof(inf)/
sizeof(
DWORD), (
DWORD*)&inf);
214 value = THREAD_PRIORITY_LOWEST;
216 value = THREAD_PRIORITY_HIGHEST;
218 value = THREAD_PRIORITY_NORMAL;
220 if (!SetThreadPriority(GetCurrentThread(), value)) {
229 WaitForSingleObject(thread->
handle, INFINITE);
230 CloseHandle(thread->
handle);
DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void)
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
unsigned long SDL_threadID
static void * RunThread(void *data)
DECLSPEC void SDLCALL SDL_free(void *mem)
GLboolean GLboolean GLboolean GLboolean a
EGLImageKHR EGLint * name
return Display return Display Bool Bool int d
thread_id SYS_ThreadHandle
int SDL_SYS_CreateThread(SDL_Thread *thread, void *args)
void SDL_SYS_WaitThread(SDL_Thread *thread)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
DECLSPEC int SDLCALL SDL_SetError(const char *fmt,...)
DECLSPEC void *SDLCALL SDL_malloc(size_t size)
typedef LPVOID(WINAPI *PFNWGLCREATEIMAGEBUFFERI3DPROC)(HDC hDC
static SDL_Thread * thread
#define SDL_OutOfMemory()
int WIN_SetError(const char *prefix)
EGLSurface EGLint void ** value
typedef DWORD(WINAPI *XInputGetState_t)(DWORD dwUserIndex
void SDL_RunThread(void *data)
void SDL_SYS_SetupThread(const char *name)
GLdouble GLdouble GLdouble b