~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to system/include/SDL/SDL_thread.h

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
  Simple DirectMedia Layer
 
3
  Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
 
4
 
 
5
  This software is provided 'as-is', without any express or implied
 
6
  warranty.  In no event will the authors be held liable for any damages
 
7
  arising from the use of this software.
 
8
 
 
9
  Permission is granted to anyone to use this software for any purpose,
 
10
  including commercial applications, and to alter it and redistribute it
 
11
  freely, subject to the following restrictions:
 
12
 
 
13
  1. The origin of this software must not be misrepresented; you must not
 
14
     claim that you wrote the original software. If you use this software
 
15
     in a product, an acknowledgment in the product documentation would be
 
16
     appreciated but is not required.
 
17
  2. Altered source versions must be plainly marked as such, and must not be
 
18
     misrepresented as being the original software.
 
19
  3. This notice may not be removed or altered from any source distribution.
 
20
*/
 
21
 
 
22
#ifndef _SDL_thread_h
 
23
#define _SDL_thread_h
 
24
 
 
25
/**
 
26
 *  \file SDL_thread.h
 
27
 *  
 
28
 *  Header for the SDL thread management routines.
 
29
 */
 
30
 
 
31
#include "SDL_stdinc.h"
 
32
#include "SDL_error.h"
 
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
/* *INDENT-OFF* */
 
41
extern "C" {
 
42
/* *INDENT-ON* */
 
43
#endif
 
44
 
 
45
/* The SDL thread structure, defined in SDL_thread.c */
 
46
struct SDL_Thread;
 
47
typedef struct SDL_Thread SDL_Thread;
 
48
 
 
49
/* The SDL thread ID */
 
50
typedef unsigned long SDL_threadID;
 
51
 
 
52
/* The SDL thread priority
 
53
 *
 
54
 * Note: On many systems you require special privileges to set high priority.
 
55
 */
 
56
typedef enum {
 
57
    SDL_THREAD_PRIORITY_LOW,
 
58
    SDL_THREAD_PRIORITY_NORMAL,
 
59
    SDL_THREAD_PRIORITY_HIGH
 
60
} SDL_ThreadPriority;
 
61
 
 
62
/* The function passed to SDL_CreateThread()
 
63
   It is passed a void* user context parameter and returns an int.
 
64
 */
 
65
typedef int (SDLCALL * SDL_ThreadFunction) (void *data);
 
66
 
 
67
#if defined(__WIN32__) && !defined(HAVE_LIBC)
 
68
/**
 
69
 *  \file SDL_thread.h
 
70
 *  
 
71
 *  We compile SDL into a DLL. This means, that it's the DLL which
 
72
 *  creates a new thread for the calling process with the SDL_CreateThread()
 
73
 *  API. There is a problem with this, that only the RTL of the SDL.DLL will
 
74
 *  be initialized for those threads, and not the RTL of the calling 
 
75
 *  application!
 
76
 *  
 
77
 *  To solve this, we make a little hack here.
 
78
 *  
 
79
 *  We'll always use the caller's _beginthread() and _endthread() APIs to
 
80
 *  start a new thread. This way, if it's the SDL.DLL which uses this API,
 
81
 *  then the RTL of SDL.DLL will be used to create the new thread, and if it's
 
82
 *  the application, then the RTL of the application will be used.
 
83
 *  
 
84
 *  So, in short:
 
85
 *  Always use the _beginthread() and _endthread() of the calling runtime 
 
86
 *  library!
 
87
 */
 
88
#define SDL_PASSED_BEGINTHREAD_ENDTHREAD
 
89
#ifndef _WIN32_WCE
 
90
#include <process.h>            /* This has _beginthread() and _endthread() defined! */
 
91
#endif
 
92
 
 
93
#ifdef __GNUC__
 
94
typedef unsigned long (__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
 
95
                                                             unsigned
 
96
                                                             (__stdcall *
 
97
                                                              func) (void *),
 
98
                                                             void *arg,
 
99
                                                             unsigned,
 
100
                                                             unsigned
 
101
                                                             *threadID);
 
102
typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
 
103
#else
 
104
typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned,
 
105
                                                        unsigned (__stdcall *
 
106
                                                                  func) (void
 
107
                                                                         *),
 
108
                                                        void *arg, unsigned,
 
109
                                                        unsigned *threadID);
 
110
typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code);
 
111
#endif
 
112
 
 
113
/**
 
114
 *  Create a thread.
 
115
 */
 
116
extern DECLSPEC SDL_Thread *SDLCALL
 
117
SDL_CreateThread(SDL_ThreadFunction fn, void *data,
 
118
                 pfnSDL_CurrentBeginThread pfnBeginThread,
 
119
                 pfnSDL_CurrentEndThread pfnEndThread);
 
120
 
 
121
#if defined(_WIN32_WCE)
 
122
 
 
123
/**
 
124
 *  Create a thread.
 
125
 */
 
126
#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL)
 
127
 
 
128
#else
 
129
 
 
130
/**
 
131
 *  Create a thread.
 
132
 */
 
133
#define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex)
 
134
 
 
135
#endif
 
136
#else
 
137
 
 
138
/**
 
139
 *  Create a thread.
 
140
 */
 
141
extern DECLSPEC SDL_Thread *SDLCALL
 
142
SDL_CreateThread(SDL_ThreadFunction fn, void *data);
 
143
 
 
144
#endif
 
145
 
 
146
/**
 
147
 *  Get the thread identifier for the current thread.
 
148
 */
 
149
extern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void);
 
150
 
 
151
/**
 
152
 *  Get the thread identifier for the specified thread.
 
153
 *  
 
154
 *  Equivalent to SDL_ThreadID() if the specified thread is NULL.
 
155
 */
 
156
extern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread);
 
157
 
 
158
/**
 
159
 *  Set the priority for the current thread
 
160
 */
 
161
extern DECLSPEC int SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority);
 
162
 
 
163
/**
 
164
 *  Wait for a thread to finish.
 
165
 *  
 
166
 *  The return code for the thread function is placed in the area
 
167
 *  pointed to by \c status, if \c status is not NULL.
 
168
 */
 
169
extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status);
 
170
 
 
171
 
 
172
/* Ends C function definitions when using C++ */
 
173
#ifdef __cplusplus
 
174
/* *INDENT-OFF* */
 
175
}
 
176
/* *INDENT-ON* */
 
177
#endif
 
178
#include "close_code.h"
 
179
 
 
180
#endif /* _SDL_thread_h */
 
181
 
 
182
/* vi: set ts=4 sw=4 expandtab: */