src/thread/os2/SDL_systhread.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 16 Feb 2006 10:11:48 +0000
changeset 1361 19418e4422cb
parent 1358 c71e05b4dc2e
child 1402 d910939febfa
permissions -rw-r--r--
New configure-based build system. Still work in progress, but much improved
     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 
    23 /* OS/2 thread management routines for SDL */
    24 
    25 #include <process.h>
    26 #define INCL_DOSERRORS
    27 #define INCL_DOSPROCESS
    28 #include <os2.h>
    29 
    30 #include "SDL_thread.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 void threadfunc(void *pparm)
    40 {
    41   pThreadStartParms pThreadParms = pparm;
    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)();
    56 }
    57 
    58 int SDL_SYS_CreateThread(SDL_Thread *thread, void *args, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread)
    59 {
    60   pThreadStartParms pThreadParms = SDL_malloc(sizeof(tThreadStartParms));
    61   if (!pThreadParms)
    62   {
    63     SDL_SetError("Not enough memory to create thread");
    64     return(-1);
    65   }
    66 
    67   // Save the function which we will have to call to clear the RTL of calling app!
    68   pThreadParms->pfnCurrentEndThread = pfnEndThread;
    69   // Also save the real parameters we have to pass to thread function
    70   pThreadParms->args = args;
    71   // Start the thread using the runtime library of calling app!
    72   thread->threadid = thread->handle = (*pfnBeginThread)(threadfunc, NULL, 512*1024, pThreadParms);
    73   if (thread->threadid<=0)
    74   {
    75     SDL_SetError("Not enough resources to create thread");
    76     return(-1);
    77   }
    78   return(0);
    79 }
    80 
    81 void SDL_SYS_SetupThread(void)
    82 {
    83   return;
    84 }
    85 
    86 DECLSPEC Uint32 SDLCALL SDL_ThreadID(void)
    87 {
    88   PTIB tib;
    89   DosGetInfoBlocks(&tib, NULL);
    90   return((Uint32) (tib->tib_ptib2->tib2_ultid));
    91 }
    92 
    93 void SDL_SYS_WaitThread(SDL_Thread *thread)
    94 {
    95   TID tid = thread->handle;
    96   DosWaitThread(&tid, DCWW_WAIT);
    97 }
    98 
    99 /* WARNING: This function is really a last resort.
   100  * Threads should be signaled and then exit by themselves.
   101  * TerminateThread() doesn't perform stack and DLL cleanup.
   102  */
   103 void SDL_SYS_KillThread(SDL_Thread *thread)
   104 {
   105   DosKillThread(thread->handle);
   106 }