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

This commit is contained in:
David Ludwig 2013-08-20 21:54:34 -04:00
parent 19a168b4b3
commit 90a9278f9d
3 changed files with 31 additions and 62 deletions

View File

@ -26,8 +26,8 @@ extern "C" {
#include <chrono> #include <chrono>
#include <condition_variable> #include <condition_variable>
#include <exception>
#include <ratio> #include <ratio>
#include <system_error>
#include "SDL_sysmutex_c.h" #include "SDL_sysmutex_c.h"
@ -45,11 +45,11 @@ SDL_CreateCond(void)
try { try {
SDL_cond * cond = new SDL_cond; SDL_cond * cond = new SDL_cond;
return cond; return cond;
} catch (std::exception & ex) { } catch (std::system_error & ex) {
SDL_SetError("unable to create C++ condition variable: %s", ex.what()); SDL_SetError("unable to create a C++ condition variable: code=%d; %s", ex.code(), ex.what());
return NULL; return NULL;
} catch (...) { } catch (std::bad_alloc &) {
SDL_SetError("unable to create C++ condition variable due to an unknown exception"); SDL_OutOfMemory();
return NULL; return NULL;
} }
} }
@ -60,11 +60,7 @@ void
SDL_DestroyCond(SDL_cond * cond) SDL_DestroyCond(SDL_cond * cond)
{ {
if (cond) { if (cond) {
try { delete cond;
delete cond;
} catch (...) {
// catch any and all exceptions, just in case something happens
}
} }
} }
@ -78,14 +74,8 @@ SDL_CondSignal(SDL_cond * cond)
return -1; return -1;
} }
try { cond->cpp_cond.notify_one();
cond->cpp_cond.notify_one(); return 0;
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;
}
} }
/* Restart all threads that are waiting on the condition variable */ /* Restart all threads that are waiting on the condition variable */
@ -98,14 +88,8 @@ SDL_CondBroadcast(SDL_cond * cond)
return -1; return -1;
} }
try { cond->cpp_cond.notify_all();
cond->cpp_cond.notify_all(); return 0;
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;
}
} }
/* Wait on the condition variable for at most 'ms' milliseconds. /* 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; return 0;
} }
} }
} catch (std::exception & ex) { } catch (std::system_error & ex) {
SDL_SetError("unable to wait on C++ condition variable: %s", ex.what()); SDL_SetError("unable to wait on a C++ condition variable: code=%d; %s", ex.code(), ex.what());
return -1;
} catch (...) {
SDL_SetError("unable to lock wait on C++ condition variable due to an unknown exception");
return -1; return -1;
} }
} }

View File

@ -26,7 +26,7 @@ extern "C" {
#include "SDL_log.h" #include "SDL_log.h"
} }
#include <exception> #include <system_error>
#include "SDL_sysmutex_c.h" #include "SDL_sysmutex_c.h"
#include <Windows.h> #include <Windows.h>
@ -41,11 +41,11 @@ SDL_CreateMutex(void)
try { try {
SDL_mutex * mutex = new SDL_mutex; SDL_mutex * mutex = new SDL_mutex;
return mutex; return mutex;
} catch (std::exception & ex) { } catch (std::system_error & ex) {
SDL_SetError("unable to create C++ mutex: %s", ex.what()); SDL_SetError("unable to create a C++ mutex: code=%d; %s", ex.code(), ex.what());
return NULL; return NULL;
} catch (...) { } catch (std::bad_alloc &) {
SDL_SetError("unable to create C++ mutex due to an unknown exception"); SDL_OutOfMemory();
return NULL; return NULL;
} }
} }
@ -56,11 +56,7 @@ void
SDL_DestroyMutex(SDL_mutex * mutex) SDL_DestroyMutex(SDL_mutex * mutex)
{ {
if (mutex) { if (mutex) {
try { delete mutex;
delete mutex;
} catch (...) {
// catch any and all exceptions, just in case something happens
}
} }
} }
@ -79,11 +75,8 @@ SDL_mutexP(SDL_mutex * mutex)
try { try {
mutex->cpp_mutex.lock(); mutex->cpp_mutex.lock();
return 0; return 0;
} catch (std::exception & ex) { } catch (std::system_error & ex) {
SDL_SetError("unable to lock C++ mutex: %s", ex.what()); SDL_SetError("unable to lock a C++ mutex: code=%d; %s", ex.code(), ex.what());
return -1;
} catch (...) {
SDL_SetError("unable to lock C++ mutex due to an unknown exception");
return -1; return -1;
} }
} }
@ -100,14 +93,8 @@ SDL_mutexV(SDL_mutex * mutex)
return -1; return -1;
} }
try { mutex->cpp_mutex.unlock();
mutex->cpp_mutex.unlock(); return 0;
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;
}
} }
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -31,6 +31,7 @@ extern "C" {
#include <mutex> #include <mutex>
#include <thread> #include <thread>
#include <system_error>
// HACK: Mimic C++11's thread_local keyword on Visual C++ 2012 (aka. VC++ 11) // 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 // 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); std::thread cpp_thread(RunThread, args);
thread->handle = (void *) new std::thread(std::move(cpp_thread)); thread->handle = (void *) new std::thread(std::move(cpp_thread));
return 0; return 0;
} catch (std::exception & ex) { } catch (std::system_error & ex) {
SDL_SetError("unable to create a C++ thread: %s", ex.what()); SDL_SetError("unable to start a C++ thread: code=%d; %s", ex.code(), ex.what());
return -1; return -1;
} catch (...) { } catch (std::bad_alloc &) {
SDL_SetError("unable to create a C++ thread due to an unknown exception"); SDL_OutOfMemory();
return -1; return -1;
} }
} }
@ -114,10 +115,10 @@ SDL_SYS_WaitThread(SDL_Thread * thread)
if (cpp_thread->joinable()) { if (cpp_thread->joinable()) {
cpp_thread->join(); cpp_thread->join();
} }
} catch (...) { } catch (std::system_error &) {
// Catch any exceptions, just in case. // An error occurred when joining the thread. SDL_WaitThread does not,
// Report nothing, as SDL_WaitThread does not seem to offer a means // however, seem to provide a means to report errors to its callers
// to report errors to its callers. // though!
} }
} }