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

main
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 <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;
}
}

View File

@ -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: */

View File

@ -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!
}
}