| | |
| | | /* |
| | | Simple DirectMedia Layer |
| | | Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> |
| | | Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> |
| | | |
| | | This software is provided 'as-is', without any express or implied |
| | | warranty. In no event will the authors be held liable for any damages |
| | |
| | | /** |
| | | * The SDL thread priority. |
| | | * |
| | | * \note On many systems you require special privileges to set high priority. |
| | | * \note On many systems you require special privileges to set high or time critical priority. |
| | | */ |
| | | typedef enum { |
| | | SDL_THREAD_PRIORITY_LOW, |
| | | SDL_THREAD_PRIORITY_NORMAL, |
| | | SDL_THREAD_PRIORITY_HIGH |
| | | SDL_THREAD_PRIORITY_HIGH, |
| | | SDL_THREAD_PRIORITY_TIME_CRITICAL |
| | | } SDL_ThreadPriority; |
| | | |
| | | /** |
| | |
| | | */ |
| | | typedef int (SDLCALL * SDL_ThreadFunction) (void *data); |
| | | |
| | | #if defined(__WIN32__) && !defined(HAVE_LIBC) |
| | | #if defined(__WIN32__) |
| | | /** |
| | | * \file SDL_thread.h |
| | | * |
| | |
| | | void * /*arg*/, unsigned, unsigned * /* threadID */); |
| | | typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); |
| | | |
| | | #ifndef SDL_beginthread |
| | | #define SDL_beginthread _beginthreadex |
| | | #endif |
| | | #ifndef SDL_endthread |
| | | #define SDL_endthread _endthreadex |
| | | #endif |
| | | |
| | | /** |
| | | * Create a thread. |
| | | */ |
| | |
| | | pfnSDL_CurrentBeginThread pfnBeginThread, |
| | | pfnSDL_CurrentEndThread pfnEndThread); |
| | | |
| | | extern DECLSPEC SDL_Thread *SDLCALL |
| | | SDL_CreateThreadWithStackSize(int (SDLCALL * fn) (void *), |
| | | const char *name, const size_t stacksize, void *data, |
| | | pfnSDL_CurrentBeginThread pfnBeginThread, |
| | | pfnSDL_CurrentEndThread pfnEndThread); |
| | | |
| | | |
| | | /** |
| | | * Create a thread. |
| | | */ |
| | | #if defined(SDL_CreateThread) && SDL_DYNAMIC_API |
| | | #undef SDL_CreateThread |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex) |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #undef SDL_CreateThreadWithStackSize |
| | | #define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize_REAL(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #else |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex) |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #endif |
| | | |
| | | #elif defined(__OS2__) |
| | |
| | | * into a dll with Watcom's runtime statically linked. |
| | | */ |
| | | #define SDL_PASSED_BEGINTHREAD_ENDTHREAD |
| | | |
| | | #ifndef __EMX__ |
| | | #include <process.h> |
| | | #else |
| | | #include <stdlib.h> |
| | | #endif |
| | | |
| | | typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void * /*arg*/); |
| | | typedef void (*pfnSDL_CurrentEndThread)(void); |
| | | |
| | | #ifndef SDL_beginthread |
| | | #define SDL_beginthread _beginthread |
| | | #endif |
| | | #ifndef SDL_endthread |
| | | #define SDL_endthread _endthread |
| | | #endif |
| | | |
| | | extern DECLSPEC SDL_Thread *SDLCALL |
| | | SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, |
| | | pfnSDL_CurrentBeginThread pfnBeginThread, |
| | | pfnSDL_CurrentEndThread pfnEndThread); |
| | | extern DECLSPEC SDL_Thread *SDLCALL |
| | | SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, const char *name, const size_t stacksize, void *data, |
| | | pfnSDL_CurrentBeginThread pfnBeginThread, |
| | | pfnSDL_CurrentEndThread pfnEndThread); |
| | | |
| | | #if defined(SDL_CreateThread) && SDL_DYNAMIC_API |
| | | #undef SDL_CreateThread |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthread, (pfnSDL_CurrentEndThread)_endthread) |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #undef SDL_CreateThreadWithStackSize |
| | | #define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #else |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthread, (pfnSDL_CurrentEndThread)_endthread) |
| | | #define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) |
| | | #endif |
| | | |
| | | #else |
| | | |
| | | /** |
| | | * Create a thread with a default stack size. |
| | | * |
| | | * This is equivalent to calling: |
| | | * SDL_CreateThreadWithStackSize(fn, name, 0, data); |
| | | */ |
| | | extern DECLSPEC SDL_Thread *SDLCALL |
| | | SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data); |
| | | |
| | | /** |
| | | * Create a thread. |
| | |
| | | * If a system imposes requirements, SDL will try to munge the string for |
| | | * it (truncate, etc), but the original string contents will be available |
| | | * from SDL_GetThreadName(). |
| | | * |
| | | * The size (in bytes) of the new stack can be specified. Zero means "use |
| | | * the system default" which might be wildly different between platforms |
| | | * (x86 Linux generally defaults to eight megabytes, an embedded device |
| | | * might be a few kilobytes instead). |
| | | * |
| | | * In SDL 2.1, stacksize will be folded into the original SDL_CreateThread |
| | | * function. |
| | | */ |
| | | extern DECLSPEC SDL_Thread *SDLCALL |
| | | SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data); |
| | | SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, const char *name, const size_t stacksize, void *data); |
| | | |
| | | #endif |
| | | |