SDL_systhread.cpp File Reference
`#include "../../SDL_internal.h"`
`#include "SDL_thread.h"`
`#include "../SDL_thread_c.h"`
`#include "../SDL_systhread.h"`
`#include "SDL_log.h"`
`#include <mutex>`
`#include <thread>`
`#include <system_error>`
Include dependency graph for SDL_systhread.cpp:

Go to the source code of this file.

## Functions

static void | RunThread (void *args)
int | SDL_SYS_CreateThread (SDL_Thread *thread, void *args)
void | SDL_SYS_SetupThread (const char *name)
SDL_threadID | SDL_ThreadID (void)
int | SDL_SYS_SetThreadPriority (SDL_ThreadPriority priority)
void | SDL_SYS_WaitThread (SDL_Thread *thread)
void | SDL_SYS_DetachThread (SDL_Thread *thread)
SDL_TLSData * | SDL_SYS_GetTLSData (void)
int | SDL_SYS_SetTLSData (SDL_TLSData *data)

## Function Documentation

## RunThread()

static void RunThread | ( | void * | args | ) |

static

Definition at line 41 of file SDL_systhread.cpp.

{
SDL_RunThread(args);
}

References SDL_RunThread().

Referenced by SDL_SYS_CreateThread().

## SDL_SYS_CreateThread()

int SDL_SYS_CreateThread | ( | SDL_Thread * | thread,
|  | void * | args
| ) |  |

Definition at line 48 of file SDL_systhread.cpp.

{
try {
// !!! FIXME: no way to set a thread stack size here.
std::thread cpp_thread(RunThread, args);
thread->handle = (void *) new std::thread(std::move(cpp_thread));
return 0;
} catch (std::system_error & ex) {
SDL_SetError("unable to start a C++ thread: code=%d; %s", ex.code(), ex.what());
return -1;
} catch (std::bad_alloc &) {
SDL_OutOfMemory();
return -1;
}
}

References SDL_Thread::handle, RunThread(), SDL_OutOfMemory, and SDL_SetError.

## SDL_SYS_DetachThread()

void SDL_SYS_DetachThread | ( | SDL_Thread * | thread | ) |

Definition at line 136 of file SDL_systhread.cpp.

{
if ( ! thread) {
return;
}
try {
std::thread * cpp_thread = (std::thread *) thread->handle;
if (cpp_thread->joinable()) {
cpp_thread->detach();
}
} catch (std::system_error &) {
// An error occurred when detaching the thread. SDL_DetachThread does not,
// however, seem to provide a means to report errors to its callers
// though!
}
}

References SDL_Thread::handle.

## SDL_SYS_GetTLSData()

SDL_TLSData* SDL_SYS_GetTLSData | ( | void |  | ) |

Definition at line 156 of file SDL_systhread.cpp.

{
return SDL_Generic_GetTLSData();
}

References SDL_Generic_GetTLSData().

## SDL_SYS_SetThreadPriority()

int SDL_SYS_SetThreadPriority | ( | SDL_ThreadPriority | priority | ) |

Definition at line 97 of file SDL_systhread.cpp.

{
// Thread priorities do not look to be settable via C++11's thread
// interface, at least as of this writing (Nov 2012). std::thread does
// provide access to the OS' native handle, however, and some form of
// priority-setting could, in theory, be done through this interface.
//
// WinRT: UPDATE (Aug 20, 2013): thread priorities cannot be changed
// on WinRT, at least not for any thread that's already been created.
// WinRT threads appear to be based off of the WinRT class,
// ThreadPool, more info on which can be found at:
// http://msdn.microsoft.com/en-us/library/windows/apps/windows.system.threading.threadpool.aspx
//
// For compatibility sake, 0 will be returned here.
return (0);
}

## SDL_SYS_SetTLSData()

int SDL_SYS_SetTLSData | ( | SDL_TLSData * | data | ) |

Definition at line 163 of file SDL_systhread.cpp.

{
return SDL_Generic_SetTLSData(data);
}

References SDL_Generic_SetTLSData().

## SDL_SYS_SetupThread()

void SDL_SYS_SetupThread | ( | const char * | name | ) |

Definition at line 66 of file SDL_systhread.cpp.

{
// Make sure a thread ID gets assigned ASAP, for debugging purposes:
SDL_ThreadID();
return;
}

References SDL_ThreadID().

## SDL_SYS_WaitThread()

void SDL_SYS_WaitThread | ( | SDL_Thread * | thread | ) |

Definition at line 116 of file SDL_systhread.cpp.

{
if ( ! thread) {
return;
}
try {
std::thread * cpp_thread = (std::thread *) thread->handle;
if (cpp_thread->joinable()) {
cpp_thread->join();
}
} catch (std::system_error &) {
// An error occurred when joining the thread. SDL_WaitThread does not,
// however, seem to provide a means to report errors to its callers
// though!
}
}

References SDL_Thread::handle.

## SDL_ThreadID()

SDL_threadID SDL_ThreadID | ( | void |  | ) |

Get the thread identifier for the current thread.

Definition at line 75 of file SDL_systhread.cpp.

{
#ifdef __WINRT__
return GetCurrentThreadId();
#else
// HACK: Mimick a thread ID, if one isn't otherwise available.
static thread_local SDL_threadID current_thread_id = 0;
static SDL_threadID next_thread_id = 1;
static std::mutex next_thread_id_mutex;
if (current_thread_id == 0) {
std::lock_guard<std::mutex> lock(next_thread_id_mutex);
current_thread_id = next_thread_id;
++next_thread_id;
}
return current_thread_id;
#endif
}

References lock, and mutex.

Referenced by SDL_SYS_SetupThread().

SDL_ThreadID
SDL_threadID SDL_ThreadID(void)
Definition: SDL_systhread.cpp:75
SDL_Generic_SetTLSData
int SDL_Generic_SetTLSData(SDL_TLSData *storage)
Definition: SDL_thread.c:163
SDL_RunThread
void SDL_RunThread(void *data)
Definition: SDL_thread.c:265
mutex
static SDL_mutex * mutex
Definition: testlock.c:23
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_threadID
unsigned long SDL_threadID
Definition: SDL_thread.h:49
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_Generic_GetTLSData
SDL_TLSData * SDL_Generic_GetTLSData(void)
Definition: SDL_thread.c:124
SDL_Thread::handle
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57
RunThread
static void RunThread(void *args)
Definition: SDL_systhread.cpp:41
lock
SDL_mutex * lock
Definition: SDL_events.c:76