|
|
1.1 root 1: /*
2: SDL - Simple DirectMedia Layer
1.1.1.2 ! root 3: Copyright (C) 1997-2006 Sam Lantinga
1.1 root 4:
5: This library is free software; you can redistribute it and/or
1.1.1.2 ! root 6: modify it under the terms of the GNU Lesser General Public
1.1 root 7: License as published by the Free Software Foundation; either
1.1.1.2 ! root 8: version 2.1 of the License, or (at your option) any later version.
1.1 root 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
1.1.1.2 ! root 13: Lesser General Public License for more details.
1.1 root 14:
1.1.1.2 ! root 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
1.1 root 18:
19: Sam Lantinga
20: [email protected]
21: */
22:
23: #ifndef _SDL_thread_h
24: #define _SDL_thread_h
25:
26: /* Header for the SDL thread management routines
27:
28: These are independent of the other SDL routines.
29: */
30:
1.1.1.2 ! root 31: #include "SDL_stdinc.h"
! 32: #include "SDL_error.h"
1.1 root 33:
34: /* Thread synchronization primitives */
35: #include "SDL_mutex.h"
36:
37: #include "begin_code.h"
38: /* Set up for C function definitions, even when using C++ */
39: #ifdef __cplusplus
40: extern "C" {
41: #endif
42:
43: /* The SDL thread structure, defined in SDL_thread.c */
44: struct SDL_Thread;
45: typedef struct SDL_Thread SDL_Thread;
46:
47: /* Create a thread */
1.1.1.2 ! root 48: #if ((defined(__WIN32__) && !defined(HAVE_LIBC)) || defined(__OS2__)) && !defined(__SYMBIAN32__)
! 49: /*
! 50: We compile SDL into a DLL on OS/2. This means, that it's the DLL which
! 51: creates a new thread for the calling process with the SDL_CreateThread()
! 52: API. There is a problem with this, that only the RTL of the SDL.DLL will
! 53: be initialized for those threads, and not the RTL of the calling application!
! 54: To solve this, we make a little hack here.
! 55: We'll always use the caller's _beginthread() and _endthread() APIs to
! 56: start a new thread. This way, if it's the SDL.DLL which uses this API,
! 57: then the RTL of SDL.DLL will be used to create the new thread, and if it's
! 58: the application, then the RTL of the application will be used.
! 59: So, in short:
! 60: Always use the _beginthread() and _endthread() of the calling runtime library!
! 61: */
! 62: #define SDL_PASSED_BEGINTHREAD_ENDTHREAD
! 63: #ifndef _WIN32_WCE
! 64: #include <process.h> /* This has _beginthread() and _endthread() defined! */
! 65: #endif
! 66:
! 67: #ifdef __OS2__
! 68: typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg);
! 69: typedef void (*pfnSDL_CurrentEndThread)(void);
! 70: #elif __GNUC__
! 71: typedef unsigned long (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned,
! 72: unsigned (__stdcall *func)(void *), void *arg,
! 73: unsigned, unsigned *threadID);
! 74: typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code);
! 75: #else
! 76: typedef uintptr_t (__cdecl *pfnSDL_CurrentBeginThread) (void *, unsigned,
! 77: unsigned (__stdcall *func)(void *), void *arg,
! 78: unsigned, unsigned *threadID);
! 79: typedef void (__cdecl *pfnSDL_CurrentEndThread)(unsigned code);
! 80: #endif
! 81:
! 82: extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data, pfnSDL_CurrentBeginThread pfnBeginThread, pfnSDL_CurrentEndThread pfnEndThread);
! 83:
! 84: #ifdef __OS2__
! 85: #define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthread, _endthread)
! 86: #elif defined(_WIN32_WCE)
! 87: #define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL)
! 88: #else
! 89: #define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex)
! 90: #endif
! 91: #else
1.1 root 92: extern DECLSPEC SDL_Thread * SDLCALL SDL_CreateThread(int (SDLCALL *fn)(void *), void *data);
1.1.1.2 ! root 93: #endif
1.1 root 94:
95: /* Get the 32-bit thread identifier for the current thread */
96: extern DECLSPEC Uint32 SDLCALL SDL_ThreadID(void);
97:
98: /* Get the 32-bit thread identifier for the specified thread,
99: equivalent to SDL_ThreadID() if the specified thread is NULL.
100: */
101: extern DECLSPEC Uint32 SDLCALL SDL_GetThreadID(SDL_Thread *thread);
102:
103: /* Wait for a thread to finish.
104: The return code for the thread function is placed in the area
105: pointed to by 'status', if 'status' is not NULL.
106: */
107: extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread *thread, int *status);
108:
109: /* Forcefully kill a thread without worrying about its state */
110: extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread *thread);
111:
112:
113: /* Ends C function definitions when using C++ */
114: #ifdef __cplusplus
115: }
116: #endif
117: #include "close_code.h"
118:
119: #endif /* _SDL_thread_h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.