Skip to content

Commit

Permalink
WinRT: made the C++11-based threading backend only try to catch excep…
Browse files Browse the repository at this point in the history
…tions that it knows it (the threading APIs) might throw, rather than all exceptions
  • Loading branch information
DavidLudwig committed Aug 21, 2013
1 parent 19a168b commit 90a9278
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 62 deletions.
43 changes: 12 additions & 31 deletions src/thread/stdcpp/SDL_syscond.cpp
Expand Up @@ -26,8 +26,8 @@ extern "C" {

#include <chrono>
#include <condition_variable>
#include <exception>
#include <ratio>
#include <system_error>

#include "SDL_sysmutex_c.h"

Expand All @@ -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;
}
}
Expand All @@ -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;
}
}

Expand All @@ -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 */
Expand All @@ -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.
Expand Down Expand Up @@ -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;
}
}
Expand Down
33 changes: 10 additions & 23 deletions src/thread/stdcpp/SDL_sysmutex.cpp
Expand Up @@ -26,7 +26,7 @@ extern "C" {
#include "SDL_log.h"
}

#include <exception>
#include <system_error>

#include "SDL_sysmutex_c.h"
#include <Windows.h>
Expand All @@ -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;
}
}
Expand All @@ -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;
}
}

Expand All @@ -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;
}
}
Expand All @@ -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: */
17 changes: 9 additions & 8 deletions src/thread/stdcpp/SDL_systhread.cpp
Expand Up @@ -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
Expand All @@ -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;
}
}
Expand Down Expand Up @@ -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!
}
}

Expand Down

0 comments on commit 90a9278

Please sign in to comment.