summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan C. Gordon <icculus@icculus.org>2011-09-12 13:36:38 -0400
committerRyan C. Gordon <icculus@icculus.org>2011-09-12 13:36:38 -0400
commitacd3f0b040de1467de22bd6814d7967b54dd527d (patch)
treef9f7cf9bfc4c105eca771f199f4cb2b6550ea6b5
parent28417bafe91ed40561d3cc94e95d281d99320938 (diff)
Clean up the win32 compiler warnings for SDL threads, in the 1.3 branch.
--HG-- extra : rebase_source : 420916ed06d79e2d3c1d50e5fb40314ac7d94d85
-rw-r--r--include/SDL_thread.h12
-rw-r--r--src/thread/windows/SDL_systhread.c45
2 files changed, 28 insertions, 29 deletions
diff --git a/include/SDL_thread.h b/include/SDL_thread.h
index c771a399..238ed3d4 100644
--- a/include/SDL_thread.h
+++ b/include/SDL_thread.h
@@ -90,17 +90,6 @@ typedef int (SDLCALL * SDL_ThreadFunction) (void *data);
#include <process.h> /* This has _beginthread() and _endthread() defined! */
#endif
-#ifdef __GNUC__
-typedef unsigned long (__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
- unsigned
- (__stdcall *
- func) (void *),
- void *arg,
- unsigned,
- unsigned
- *threadID);
-typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
-#else
typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
unsigned (__stdcall *
func) (void
@@ -108,7 +97,6 @@ typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
void *arg, unsigned,
unsigned *threadID);
typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
-#endif
/**
* Create a thread.
diff --git a/src/thread/windows/SDL_systhread.c b/src/thread/windows/SDL_systhread.c
index d907c130..a1a5a597 100644
--- a/src/thread/windows/SDL_systhread.c
+++ b/src/thread/windows/SDL_systhread.c
@@ -33,16 +33,13 @@
#include <process.h>
#endif
-#if __GNUC__
-typedef uintptr_t (__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
- unsigned
- (__stdcall *
- func) (void *),
- void *arg,
- unsigned,
- unsigned
- *threadID);
-typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
+/* Cygwin gcc-3 ... MingW64 (even with a i386 host) does this like MSVC. */
+#if (defined(__MINGW32__) && (__GNUC__ < 4))
+typedef unsigned long (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned,
+ unsigned (__stdcall *func)(void *), void *arg,
+ unsigned, unsigned *threadID);
+typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code);
+
#elif defined(__WATCOMC__)
/* This is for Watcom targets except OS2 */
#if __WATCOMC__ < 1240
@@ -59,6 +56,7 @@ typedef unsigned long (__watcall * pfnSDL_CurrentBeginThread) (void *,
unsigned
*threadID);
typedef void (__watcall * pfnSDL_CurrentEndThread) (unsigned code);
+
#else
typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
unsigned (__stdcall *
@@ -77,7 +75,7 @@ typedef struct ThreadStartParms
pfnSDL_CurrentEndThread pfnCurrentEndThread;
} tThreadStartParms, *pThreadStartParms;
-static unsigned __stdcall
+static DWORD
RunThread(void *data)
{
pThreadStartParms pThreadParms = (pThreadStartParms) data;
@@ -97,6 +95,18 @@ RunThread(void *data)
return (0);
}
+static DWORD WINAPI
+RunThreadViaCreateThread(LPVOID data)
+{
+ return RunThread(data);
+}
+
+static unsigned __stdcall
+RunThreadViaBeginThreadEx(void *data)
+{
+ return (unsigned) RunThread(data);
+}
+
#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD
int
SDL_SYS_CreateThread(SDL_Thread * thread, void *args,
@@ -115,7 +125,6 @@ SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
pfnSDL_CurrentEndThread pfnEndThread = _endthreadex;
#endif
#endif /* SDL_PASSED_BEGINTHREAD_ENDTHREAD */
- DWORD threadid = 0;
pThreadStartParms pThreadParms =
(pThreadStartParms) SDL_malloc(sizeof(tThreadStartParms));
if (!pThreadParms) {
@@ -128,12 +137,14 @@ SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
pThreadParms->args = args;
if (pfnBeginThread) {
- thread->handle =
- (SYS_ThreadHandle) pfnBeginThread(NULL, 0, RunThread,
- pThreadParms, 0, &threadid);
+ unsigned threadid = 0;
+ thread->handle = (SYS_ThreadHandle)
+ ((size_t) pfnBeginThread(NULL, 0, RunThreadViaBeginThreadEx,
+ pThreadParms, 0, &threadid));
} else {
- thread->handle =
- CreateThread(NULL, 0, RunThread, pThreadParms, 0, &threadid);
+ DWORD threadid = 0;
+ thread->handle = CreateThread(NULL, 0, RunThreadViaCreateThread,
+ pThreadParms, 0, &threadid);
}
if (thread->handle == NULL) {
SDL_SetError("Not enough resources to create thread");