Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
184 lines (163 loc) · 6.13 KB

SDL_systhread.c

File metadata and controls

184 lines (163 loc) · 6.13 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Feb 12, 2011
Feb 12, 2011
3
Copyright (C) 1997-2011 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
24
25
26
/* Win32 thread management routines for SDL */
#include "SDL_thread.h"
Feb 16, 2006
Feb 16, 2006
27
28
#include "../SDL_thread_c.h"
#include "../SDL_systhread.h"
Jan 24, 2011
Jan 24, 2011
29
#include "SDL_systhread_c.h"
Apr 26, 2001
Apr 26, 2001
30
Mar 6, 2006
Mar 6, 2006
31
32
33
34
35
36
37
#ifndef SDL_PASSED_BEGINTHREAD_ENDTHREAD
#ifndef _WIN32_WCE
/* We'll use the C library from this DLL */
#include <process.h>
#endif
#if __GNUC__
Mar 10, 2010
Mar 10, 2010
38
typedef uintptr_t (__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
Jul 10, 2006
Jul 10, 2006
39
40
41
42
43
44
45
46
unsigned
(__stdcall *
func) (void *),
void *arg,
unsigned,
unsigned
*threadID);
typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
May 7, 2006
May 7, 2006
47
48
49
50
51
#elif defined(__WATCOMC__)
/* This is for Watcom targets except OS2 */
#if __WATCOMC__ < 1240
#define __watcall
#endif
Jul 10, 2006
Jul 10, 2006
52
53
54
55
56
57
58
59
60
61
62
typedef unsigned long (__watcall * pfnSDL_CurrentBeginThread) (void *,
unsigned,
unsigned
(__stdcall *
func) (void
*),
void *arg,
unsigned,
unsigned
*threadID);
typedef void (__watcall * pfnSDL_CurrentEndThread) (unsigned code);
Mar 6, 2006
Mar 6, 2006
63
#else
Jul 10, 2006
Jul 10, 2006
64
65
66
67
68
69
70
typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
unsigned (__stdcall *
func) (void
*),
void *arg, unsigned,
unsigned *threadID);
typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
Mar 6, 2006
Mar 6, 2006
71
72
73
74
#endif
#endif /* !SDL_PASSED_BEGINTHREAD_ENDTHREAD */
Feb 6, 2006
Feb 6, 2006
75
76
typedef struct ThreadStartParms
{
Jul 10, 2006
Jul 10, 2006
77
78
void *args;
pfnSDL_CurrentEndThread pfnCurrentEndThread;
Feb 6, 2006
Feb 6, 2006
79
} tThreadStartParms, *pThreadStartParms;
Apr 26, 2001
Apr 26, 2001
80
Feb 14, 2010
Feb 14, 2010
81
static DWORD __stdcall
Jul 10, 2006
Jul 10, 2006
82
RunThread(void *data)
Apr 26, 2001
Apr 26, 2001
83
{
Jul 10, 2006
Jul 10, 2006
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
pThreadStartParms pThreadParms = (pThreadStartParms) data;
pfnSDL_CurrentEndThread pfnCurrentEndThread = NULL;
// Call the thread function!
SDL_RunThread(pThreadParms->args);
// Get the current endthread we have to use!
if (pThreadParms) {
pfnCurrentEndThread = pThreadParms->pfnCurrentEndThread;
SDL_free(pThreadParms);
}
// Call endthread!
if (pfnCurrentEndThread)
(*pfnCurrentEndThread) (0);
return (0);
Apr 26, 2001
Apr 26, 2001
99
100
}
Mar 6, 2006
Mar 6, 2006
101
#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD
Jul 10, 2006
Jul 10, 2006
102
103
104
105
int
SDL_SYS_CreateThread(SDL_Thread * thread, void *args,
pfnSDL_CurrentBeginThread pfnBeginThread,
pfnSDL_CurrentEndThread pfnEndThread)
Apr 26, 2001
Apr 26, 2001
106
{
Mar 6, 2006
Mar 6, 2006
107
#else
Jul 10, 2006
Jul 10, 2006
108
109
int
SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
Mar 6, 2006
Mar 6, 2006
110
111
{
#ifdef _WIN32_WCE
Jul 10, 2006
Jul 10, 2006
112
113
pfnSDL_CurrentBeginThread pfnBeginThread = NULL;
pfnSDL_CurrentEndThread pfnEndThread = NULL;
Mar 6, 2006
Mar 6, 2006
114
#else
Jul 10, 2006
Jul 10, 2006
115
116
pfnSDL_CurrentBeginThread pfnBeginThread = _beginthreadex;
pfnSDL_CurrentEndThread pfnEndThread = _endthreadex;
Mar 6, 2006
Mar 6, 2006
117
118
#endif
#endif /* SDL_PASSED_BEGINTHREAD_ENDTHREAD */
Jul 10, 2006
Jul 10, 2006
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
unsigned threadid;
pThreadStartParms pThreadParms =
(pThreadStartParms) SDL_malloc(sizeof(tThreadStartParms));
if (!pThreadParms) {
SDL_OutOfMemory();
return (-1);
}
// Save the function which we will have to call to clear the RTL of calling app!
pThreadParms->pfnCurrentEndThread = pfnEndThread;
// Also save the real parameters we have to pass to thread function
pThreadParms->args = args;
if (pfnBeginThread) {
thread->handle =
(SYS_ThreadHandle) pfnBeginThread(NULL, 0, RunThread,
pThreadParms, 0, &threadid);
} else {
thread->handle =
CreateThread(NULL, 0, RunThread, pThreadParms, 0, &threadid);
}
if (thread->handle == NULL) {
SDL_SetError("Not enough resources to create thread");
return (-1);
}
return (0);
Apr 26, 2001
Apr 26, 2001
144
145
}
Jul 10, 2006
Jul 10, 2006
146
147
void
SDL_SYS_SetupThread(void)
Apr 26, 2001
Apr 26, 2001
148
{
Jul 10, 2006
Jul 10, 2006
149
return;
Apr 26, 2001
Apr 26, 2001
150
151
}
Dec 16, 2009
Dec 16, 2009
152
SDL_threadID
Jul 10, 2006
Jul 10, 2006
153
SDL_ThreadID(void)
Apr 26, 2001
Apr 26, 2001
154
{
Dec 16, 2009
Dec 16, 2009
155
return ((SDL_threadID) GetCurrentThreadId());
Apr 26, 2001
Apr 26, 2001
156
157
}
Mar 25, 2011
Mar 25, 2011
158
int
Mar 25, 2011
Mar 25, 2011
159
SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
Mar 25, 2011
Mar 25, 2011
160
{
Mar 25, 2011
Mar 25, 2011
161
int value;
Mar 25, 2011
Mar 25, 2011
162
163
if (priority == SDL_THREAD_PRIORITY_LOW) {
Mar 25, 2011
Mar 25, 2011
164
value = THREAD_PRIORITY_LOWEST;
Mar 25, 2011
Mar 25, 2011
165
} else if (priority == SDL_THREAD_PRIORITY_HIGH) {
Mar 25, 2011
Mar 25, 2011
166
value = THREAD_PRIORITY_HIGHEST;
Mar 25, 2011
Mar 25, 2011
167
} else {
Mar 25, 2011
Mar 25, 2011
168
value = THREAD_PRIORITY_NORMAL;
Mar 25, 2011
Mar 25, 2011
169
}
Mar 25, 2011
Mar 25, 2011
170
if (!SetThreadPriority(GetCurrentThread(), value)) {
Mar 25, 2011
Mar 25, 2011
171
172
173
174
175
176
WIN_SetError("SetThreadPriority()");
return -1;
}
return 0;
}
Jul 10, 2006
Jul 10, 2006
177
178
void
SDL_SYS_WaitThread(SDL_Thread * thread)
Apr 26, 2001
Apr 26, 2001
179
{
Jul 10, 2006
Jul 10, 2006
180
181
WaitForSingleObject(thread->handle, INFINITE);
CloseHandle(thread->handle);
Apr 26, 2001
Apr 26, 2001
182
183
}
Jul 10, 2006
Jul 10, 2006
184
/* vi: set ts=4 sw=4 expandtab: */