src/thread/win32/SDL_systhread.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 06 Mar 2006 06:00:45 +0000
changeset 1470 d47d96962fcc
parent 1433 bb6839704ed6
child 1471 9fb0eee04dd9
permissions -rw-r--r--
Fixed declarations to match mingw includes
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2006 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 /* Win32 thread management routines for SDL */
    25 
    26 #define WIN32_LEAN_AND_MEAN
    27 #include <windows.h>
    28 
    29 #include "SDL_thread.h"
    30 #include "../SDL_thread_c.h"
    31 #include "../SDL_systhread.h"
    32 
    33 typedef struct ThreadStartParms
    34 {
    35   void *args;
    36   pfnSDL_CurrentEndThread pfnCurrentEndThread;
    37 } tThreadStartParms, *pThreadStartParms;
    38 
    39 static unsigned __stdcall RunThread(void *data)
    40 {
    41   pThreadStartParms pThreadParms = (pThreadStartParms)data;
    42   pfnSDL_CurrentEndThread pfnCurrentEndThread = NULL;
    43 
    44   // Call the thread function!
    45   SDL_RunThread(pThreadParms->args);
    46 
    47   // Get the current endthread we have to use!
    48   if (pThreadParms)
    49   {
    50     pfnCurrentEndThread = pThreadParms->pfnCurrentEndThread;
    51     SDL_free(pThreadParms);
    52   }
    53   // Call endthread!
    54   if (pfnCurrentEndThread)
    55     (*pfnCurrentEndThread)(0);
    56   return(0);
    57 }
    58 
    59 int SDL_SYS_CreateThread(SDL_Thread *thread, void *args, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread)
    60 {
    61 	unsigned threadid;
    62 	pThreadStartParms pThreadParms = (pThreadStartParms)SDL_malloc(sizeof(tThreadStartParms));
    63 	if (!pThreadParms) {
    64 		SDL_OutOfMemory();
    65 		return(-1);
    66 	}
    67 
    68 	// Save the function which we will have to call to clear the RTL of calling app!
    69 	pThreadParms->pfnCurrentEndThread = pfnEndThread;
    70 	// Also save the real parameters we have to pass to thread function
    71 	pThreadParms->args = args;
    72 
    73 	if (pfnBeginThread) {
    74 		thread->handle = (SYS_ThreadHandle) pfnBeginThread(NULL, 0, RunThread,
    75 				pThreadParms, 0, &threadid);
    76 	} else {
    77 		thread->handle = CreateThread(NULL, 0, RunThread, pThreadParms, 0, &threadid);
    78 	}
    79 	if (thread->handle == NULL) {
    80 		SDL_SetError("Not enough resources to create thread");
    81 		return(-1);
    82 	}
    83 	return(0);
    84 }
    85 
    86 void SDL_SYS_SetupThread(void)
    87 {
    88 	return;
    89 }
    90 
    91 Uint32 SDL_ThreadID(void)
    92 {
    93 	return((Uint32)GetCurrentThreadId());
    94 }
    95 
    96 void SDL_SYS_WaitThread(SDL_Thread *thread)
    97 {
    98 	WaitForSingleObject(thread->handle, INFINITE);
    99 	CloseHandle(thread->handle);
   100 }
   101 
   102 /* WARNING: This function is really a last resort.
   103  * Threads should be signaled and then exit by themselves.
   104  * TerminateThread() doesn't perform stack and DLL cleanup.
   105  */
   106 void SDL_SYS_KillThread(SDL_Thread *thread)
   107 {
   108 	TerminateThread(thread->handle, FALSE);
   109 }