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.

References SDL_RunThread().

Referenced by SDL_SYS_CreateThread().

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

◆ 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.

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 }
static void RunThread(void *args)
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57
#define SDL_SetError

◆ SDL_SYS_DetachThread()

void SDL_SYS_DetachThread ( SDL_Thread thread)

Definition at line 136 of file SDL_systhread.cpp.

References SDL_Thread::handle.

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 }
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57

◆ SDL_SYS_GetTLSData()

SDL_TLSData* SDL_SYS_GetTLSData ( void  )

Definition at line 156 of file SDL_systhread.cpp.

References SDL_Generic_GetTLSData().

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

◆ 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.

References SDL_Generic_SetTLSData().

164 {
165  return SDL_Generic_SetTLSData(data);
166 }
int SDL_Generic_SetTLSData(SDL_TLSData *storage)
Definition: SDL_thread.c:163

◆ SDL_SYS_SetupThread()

void SDL_SYS_SetupThread ( const char *  name)

Definition at line 66 of file SDL_systhread.cpp.

References SDL_ThreadID().

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

◆ SDL_SYS_WaitThread()

void SDL_SYS_WaitThread ( SDL_Thread thread)

Definition at line 116 of file SDL_systhread.cpp.

References SDL_Thread::handle.

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 }
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57

◆ SDL_ThreadID()

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.

Referenced by SDL_SYS_SetupThread().

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 }
static SDL_mutex * mutex
Definition: testlock.c:23
SDL_mutex * lock
Definition: SDL_events.c:78
unsigned long SDL_threadID
Definition: SDL_thread.h:49