From 53ca48efe202a10404351b51006b503c41fbe7f5 Mon Sep 17 00:00:00 2001 From: truebrain Date: Mon, 12 Jan 2009 14:31:49 +0000 Subject: (svn r15006) -Codechange: throw a real instance of a class, instead of '0' (which can also be a throw from within a thread for what ever reason) --- src/thread.h | 2 ++ src/thread_morphos.cpp | 6 ++++-- src/thread_pthread.cpp | 4 +++- src/thread_win32.cpp | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/thread.h b/src/thread.h index f6f29a711..8d0a8ee84 100644 --- a/src/thread.h +++ b/src/thread.h @@ -7,6 +7,8 @@ typedef void (*OTTDThreadFunc)(void *); +class OTTDThreadExitSignal { }; + /** * A Thread Object which works on all our supported OSes. */ diff --git a/src/thread_morphos.cpp b/src/thread_morphos.cpp index ef074da45..fcf459d04 100644 --- a/src/thread_morphos.cpp +++ b/src/thread_morphos.cpp @@ -153,7 +153,7 @@ public: if (NewGetTaskAttrs(NULL, &msg, sizeof(struct OTTDThreadStartupMessage *), TASKINFOTYPE_STARTUPMSG, TAG_DONE) && msg != NULL) { /* For now we terminate by throwing an error, gives much cleaner cleanup */ - throw 0; + throw OTTDThreadExitSignal(); } return true; @@ -203,8 +203,10 @@ private: if (NewGetTaskAttrs(NULL, &msg, sizeof(struct OTTDThreadStartupMessage *), TASKINFOTYPE_STARTUPMSG, TAG_DONE) && msg != NULL) { try { msg->func(msg->arg); - } catch(...) { + } catch(OTTDThreadExitSignal e) { KPutStr("[Child] Returned to main()\n"); + } catch(...) { + NOT_REACHED(); } } diff --git a/src/thread_pthread.cpp b/src/thread_pthread.cpp index b3f340b6a..2fbca79b2 100644 --- a/src/thread_pthread.cpp +++ b/src/thread_pthread.cpp @@ -92,7 +92,7 @@ public: if (!IsRunning()) return false; /* For now we terminate by throwing an error, gives much cleaner cleanup */ - throw 0; + throw OTTDThreadExitSignal(); } /* virtual */ void Join() @@ -137,7 +137,9 @@ private: /* Call the proc of the creator to continue this thread */ try { m_proc(m_param); + } catch (OTTDThreadExitSignal e) { } catch (...) { + NOT_REACHED(); } /* Notify threads waiting for our completion */ diff --git a/src/thread_win32.cpp b/src/thread_win32.cpp index 6f12a6fbc..83bb5a76a 100644 --- a/src/thread_win32.cpp +++ b/src/thread_win32.cpp @@ -87,7 +87,7 @@ public: if (!IsRunning()) return false; /* For now we terminate by throwing an error, gives much cleaner cleanup */ - throw 0; + throw OTTDThreadExitSignal(); } /* virtual */ void Join() @@ -128,7 +128,9 @@ private: { try { m_proc(m_param); + } catch (OTTDThreadExitSignal) { } catch (...) { + NOT_REACHED(); } } }; -- cgit v1.2.3-70-g09d2