Browse Source

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

David Ludwig 13 năm trước cách đây
mục cha
commit
90a9278f9d

+ 12 - 31
src/thread/stdcpp/SDL_syscond.cpp

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

+ 10 - 23
src/thread/stdcpp/SDL_sysmutex.cpp

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

+ 9 - 8
src/thread/stdcpp/SDL_systhread.cpp

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