SDL  2.0
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_TLSDataSDL_SYS_GetTLSData (void)
int SDL_SYS_SetTLSData (SDL_TLSData *data)

Function Documentation

static void RunThread ( void args)
static

Definition at line 41 of file SDL_systhread.cpp.

References SDL_RunThread().

Referenced by SDL_SYS_CreateThread().

{
}
int SDL_SYS_CreateThread ( SDL_Thread thread,
void args 
)

Definition at line 48 of file SDL_systhread.cpp.

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

{
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 &) {
return -1;
}
}
void SDL_SYS_DetachThread ( SDL_Thread thread)

Definition at line 136 of file SDL_systhread.cpp.

References SDL_Thread::handle.

{
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!
}
}
SDL_TLSData* SDL_SYS_GetTLSData ( void  )

Definition at line 156 of file SDL_systhread.cpp.

References SDL_Generic_GetTLSData().

{
}
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);
}
int SDL_SYS_SetTLSData ( SDL_TLSData data)

Definition at line 163 of file SDL_systhread.cpp.

References SDL_Generic_SetTLSData().

{
return SDL_Generic_SetTLSData(data);
}
void SDL_SYS_SetupThread ( const char *  name)

Definition at line 66 of file SDL_systhread.cpp.

References SDL_ThreadID.

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

Definition at line 116 of file SDL_systhread.cpp.

References SDL_Thread::handle.

{
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!
}
}
SDL_threadID SDL_ThreadID ( void  )

Get the thread identifier for the current thread.

Definition at line 75 of file SDL_systhread.cpp.

References lock, and mutex.

{
#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
}