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

◆ RunThread()

static void RunThread ( void args)
static

Definition at line 41 of file SDL_systhread.cpp.

42{
43 SDL_RunThread(args);
44}
void SDL_RunThread(void *data)
Definition: SDL_thread.c:265

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.

49{
50 try {
51 // !!! FIXME: no way to set a thread stack size here.
52 std::thread cpp_thread(RunThread, args);
53 thread->handle = (void *) new std::thread(std::move(cpp_thread));
54 return 0;
55 } catch (std::system_error & ex) {
56 SDL_SetError("unable to start a C++ thread: code=%d; %s", ex.code(), ex.what());
57 return -1;
58 } catch (std::bad_alloc &) {
60 return -1;
61 }
62}
#define SDL_SetError
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
static void RunThread(void *args)
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57

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.

137{
138 if ( ! thread) {
139 return;
140 }
141
142 try {
143 std::thread * cpp_thread = (std::thread *) thread->handle;
144 if (cpp_thread->joinable()) {
145 cpp_thread->detach();
146 }
147 } catch (std::system_error &) {
148 // An error occurred when detaching the thread. SDL_DetachThread does not,
149 // however, seem to provide a means to report errors to its callers
150 // though!
151 }
152}

References SDL_Thread::handle.

◆ SDL_SYS_GetTLSData()

SDL_TLSData * SDL_SYS_GetTLSData ( void  )

Definition at line 156 of file SDL_systhread.cpp.

157{
158 return SDL_Generic_GetTLSData();
159}
SDL_TLSData * SDL_Generic_GetTLSData(void)
Definition: SDL_thread.c:124

References SDL_Generic_GetTLSData().

◆ SDL_SYS_SetThreadPriority()

int SDL_SYS_SetThreadPriority ( SDL_ThreadPriority  priority)

Definition at line 97 of file SDL_systhread.cpp.

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

◆ SDL_SYS_SetTLSData()

int SDL_SYS_SetTLSData ( SDL_TLSData data)

Definition at line 163 of file SDL_systhread.cpp.

164{
166}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
int SDL_Generic_SetTLSData(SDL_TLSData *storage)
Definition: SDL_thread.c:163

References SDL_Generic_SetTLSData().

◆ SDL_SYS_SetupThread()

void SDL_SYS_SetupThread ( const char *  name)

Definition at line 66 of file SDL_systhread.cpp.

67{
68 // Make sure a thread ID gets assigned ASAP, for debugging purposes:
70 return;
71}
SDL_threadID SDL_ThreadID(void)

References SDL_ThreadID().

◆ SDL_SYS_WaitThread()

void SDL_SYS_WaitThread ( SDL_Thread thread)

Definition at line 116 of file SDL_systhread.cpp.

117{
118 if ( ! thread) {
119 return;
120 }
121
122 try {
123 std::thread * cpp_thread = (std::thread *) thread->handle;
124 if (cpp_thread->joinable()) {
125 cpp_thread->join();
126 }
127 } catch (std::system_error &) {
128 // An error occurred when joining the thread. SDL_WaitThread does not,
129 // however, seem to provide a means to report errors to its callers
130 // though!
131 }
132}

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.

76{
77#ifdef __WINRT__
78 return GetCurrentThreadId();
79#else
80 // HACK: Mimick a thread ID, if one isn't otherwise available.
81 static thread_local SDL_threadID current_thread_id = 0;
82 static SDL_threadID next_thread_id = 1;
83 static std::mutex next_thread_id_mutex;
84
85 if (current_thread_id == 0) {
86 std::lock_guard<std::mutex> lock(next_thread_id_mutex);
87 current_thread_id = next_thread_id;
88 ++next_thread_id;
89 }
90
91 return current_thread_id;
92#endif
93}
SDL_mutex * lock
Definition: SDL_events.c:76
unsigned long SDL_threadID
Definition: SDL_thread.h:49
static SDL_mutex * mutex
Definition: testlock.c:23

References lock, and mutex.

Referenced by SDL_SYS_SetupThread().