WinRT: made the C++11-based threading backend only try to catch exceptions that it knows it (the threading APIs) might throw, rather than all exceptions
parent
19a168b4b3
commit
90a9278f9d
|
@ -26,8 +26,8 @@ extern "C" {
|
|||
|
||||
#include <chrono>
|
||||
#include <condition_variable>
|
||||
#include <exception>
|
||||
#include <ratio>
|
||||
#include <system_error>
|
||||
|
||||
#include "SDL_sysmutex_c.h"
|
||||
|
||||
|
@ -45,11 +45,11 @@ SDL_CreateCond(void)
|
|||
try {
|
||||
SDL_cond * cond = new SDL_cond;
|
||||
return cond;
|
||||
} catch (std::exception & ex) {
|
||||
SDL_SetError("unable to create C++ condition variable: %s", ex.what());
|
||||
} catch (std::system_error & ex) {
|
||||
SDL_SetError("unable to create a C++ condition variable: code=%d; %s", ex.code(), ex.what());
|
||||
return NULL;
|
||||
} catch (...) {
|
||||
SDL_SetError("unable to create C++ condition variable due to an unknown exception");
|
||||
} catch (std::bad_alloc &) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -60,11 +60,7 @@ void
|
|||
SDL_DestroyCond(SDL_cond * cond)
|
||||
{
|
||||
if (cond) {
|
||||
try {
|
||||
delete cond;
|
||||
} catch (...) {
|
||||
// catch any and all exceptions, just in case something happens
|
||||
}
|
||||
delete cond;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -78,14 +74,8 @@ SDL_CondSignal(SDL_cond * cond)
|
|||
return -1;
|
||||
}
|
||||
|
||||
try {
|
||||
cond->cpp_cond.notify_one();
|
||||
return 0;
|
||||
} catch (...) {
|
||||
// catch any and all exceptions, just in case something happens
|
||||
SDL_SetError("unable to signal C++ condition variable due to an unknown exception");
|
||||
return -1;
|
||||
}
|
||||
cond->cpp_cond.notify_one();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Restart all threads that are waiting on the condition variable */
|
||||
|
@ -98,14 +88,8 @@ SDL_CondBroadcast(SDL_cond * cond)
|
|||
return -1;
|
||||
}
|
||||
|
||||
try {
|
||||
cond->cpp_cond.notify_all();
|
||||
return 0;
|
||||
} catch (...) {
|
||||
// catch any and all exceptions, just in case something happens
|
||||
SDL_SetError("unable to broadcast C++ condition variable due to an unknown exception");
|
||||
return -1;
|
||||
}
|
||||
cond->cpp_cond.notify_all();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Wait on the condition variable for at most 'ms' milliseconds.
|
||||
|
@ -163,11 +147,8 @@ SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
} catch (std::exception & ex) {
|
||||
SDL_SetError("unable to wait on C++ condition variable: %s", ex.what());
|
||||
return -1;
|
||||
} catch (...) {
|
||||
SDL_SetError("unable to lock wait on C++ condition variable due to an unknown exception");
|
||||
} catch (std::system_error & ex) {
|
||||
SDL_SetError("unable to wait on a C++ condition variable: code=%d; %s", ex.code(), ex.what());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ extern "C" {
|
|||
#include "SDL_log.h"
|
||||
}
|
||||
|
||||
#include <exception>
|
||||
#include <system_error>
|
||||
|
||||
#include "SDL_sysmutex_c.h"
|
||||
#include <Windows.h>
|
||||
|
@ -41,11 +41,11 @@ SDL_CreateMutex(void)
|
|||
try {
|
||||
SDL_mutex * mutex = new SDL_mutex;
|
||||
return mutex;
|
||||
} catch (std::exception & ex) {
|
||||
SDL_SetError("unable to create C++ mutex: %s", ex.what());
|
||||
} catch (std::system_error & ex) {
|
||||
SDL_SetError("unable to create a C++ mutex: code=%d; %s", ex.code(), ex.what());
|
||||
return NULL;
|
||||
} catch (...) {
|
||||
SDL_SetError("unable to create C++ mutex due to an unknown exception");
|
||||
} catch (std::bad_alloc &) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -56,11 +56,7 @@ void
|
|||
SDL_DestroyMutex(SDL_mutex * mutex)
|
||||
{
|
||||
if (mutex) {
|
||||
try {
|
||||
delete mutex;
|
||||
} catch (...) {
|
||||
// catch any and all exceptions, just in case something happens
|
||||
}
|
||||
delete mutex;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,11 +75,8 @@ SDL_mutexP(SDL_mutex * mutex)
|
|||
try {
|
||||
mutex->cpp_mutex.lock();
|
||||
return 0;
|
||||
} catch (std::exception & ex) {
|
||||
SDL_SetError("unable to lock C++ mutex: %s", ex.what());
|
||||
return -1;
|
||||
} catch (...) {
|
||||
SDL_SetError("unable to lock C++ mutex due to an unknown exception");
|
||||
} catch (std::system_error & ex) {
|
||||
SDL_SetError("unable to lock a C++ mutex: code=%d; %s", ex.code(), ex.what());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -100,14 +93,8 @@ SDL_mutexV(SDL_mutex * mutex)
|
|||
return -1;
|
||||
}
|
||||
|
||||
try {
|
||||
mutex->cpp_mutex.unlock();
|
||||
return 0;
|
||||
} catch (...) {
|
||||
// catch any and all exceptions, just in case something happens.
|
||||
SDL_SetError("unable to unlock C++ mutex due to an unknown exception");
|
||||
return -1;
|
||||
}
|
||||
mutex->cpp_mutex.unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
|
|
@ -31,6 +31,7 @@ extern "C" {
|
|||
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
#include <system_error>
|
||||
|
||||
// HACK: Mimic C++11's thread_local keyword on Visual C++ 2012 (aka. VC++ 11)
|
||||
// TODO: make sure this hack doesn't get used if and when Visual C++ supports
|
||||
|
@ -55,11 +56,11 @@ SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
|
|||
std::thread cpp_thread(RunThread, args);
|
||||
thread->handle = (void *) new std::thread(std::move(cpp_thread));
|
||||
return 0;
|
||||
} catch (std::exception & ex) {
|
||||
SDL_SetError("unable to create a C++ thread: %s", ex.what());
|
||||
} catch (std::system_error & ex) {
|
||||
SDL_SetError("unable to start a C++ thread: code=%d; %s", ex.code(), ex.what());
|
||||
return -1;
|
||||
} catch (...) {
|
||||
SDL_SetError("unable to create a C++ thread due to an unknown exception");
|
||||
} catch (std::bad_alloc &) {
|
||||
SDL_OutOfMemory();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -114,10 +115,10 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
|
|||
if (cpp_thread->joinable()) {
|
||||
cpp_thread->join();
|
||||
}
|
||||
} catch (...) {
|
||||
// Catch any exceptions, just in case.
|
||||
// Report nothing, as SDL_WaitThread does not seem to offer a means
|
||||
// to report errors to its callers.
|
||||
} 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!
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue