aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/threading/thread.cpp54
-rw-r--r--src/threading/thread.h8
-rw-r--r--src/unittest/test_threading.cpp25
3 files changed, 22 insertions, 65 deletions
diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp
index e19e6ae60..5cfc60995 100644
--- a/src/threading/thread.cpp
+++ b/src/threading/thread.cpp
@@ -73,7 +73,28 @@ Thread::Thread(const std::string &name) :
Thread::~Thread()
{
- kill();
+ // kill the thread if running
+ if (!m_running) {
+ wait();
+ } else {
+
+ m_running = false;
+
+#if defined(_WIN32)
+ // See https://msdn.microsoft.com/en-us/library/hh920601.aspx#thread__native_handle_method
+ TerminateThread((HANDLE) m_thread_obj->native_handle(), 0);
+ CloseHandle((HANDLE) m_thread_obj->native_handle());
+#else
+ // We need to pthread_kill instead on Android since NDKv5's pthread
+ // implementation is incomplete.
+# ifdef __ANDROID__
+ pthread_kill(getThreadHandle(), SIGKILL);
+# else
+ pthread_cancel(getThreadHandle());
+# endif
+ wait();
+#endif
+ }
// Make sure start finished mutex is unlocked before it's destroyed
if (m_start_finished_mutex.try_lock())
@@ -138,37 +159,6 @@ bool Thread::wait()
}
-bool Thread::kill()
-{
- if (!m_running) {
- wait();
- return false;
- }
-
- m_running = false;
-
-#if defined(_WIN32)
- // See https://msdn.microsoft.com/en-us/library/hh920601.aspx#thread__native_handle_method
- TerminateThread((HANDLE) m_thread_obj->native_handle(), 0);
- CloseHandle((HANDLE) m_thread_obj->native_handle());
-#else
- // We need to pthread_kill instead on Android since NDKv5's pthread
- // implementation is incomplete.
-# ifdef __ANDROID__
- pthread_kill(getThreadHandle(), SIGKILL);
-# else
- pthread_cancel(getThreadHandle());
-# endif
- wait();
-#endif
-
- m_retval = nullptr;
- m_joinable = false;
- m_request_stop = false;
-
- return true;
-}
-
bool Thread::getReturnValue(void **ret)
{
diff --git a/src/threading/thread.h b/src/threading/thread.h
index 3946335f5..45fb171da 100644
--- a/src/threading/thread.h
+++ b/src/threading/thread.h
@@ -75,14 +75,6 @@ public:
bool stop();
/*
- * Immediately terminates the thread.
- * This should be used with extreme caution, as the thread will not have
- * any opportunity to release resources it may be holding (such as memory
- * or locks).
- */
- bool kill();
-
- /*
* Waits for thread to finish.
* Note: This does not stop a thread, you have to do this on your own.
* Returns false immediately if the thread is not started or has been waited
diff --git a/src/unittest/test_threading.cpp b/src/unittest/test_threading.cpp
index 8d4d814fd..65ef7c02d 100644
--- a/src/unittest/test_threading.cpp
+++ b/src/unittest/test_threading.cpp
@@ -31,7 +31,6 @@ public:
void runTests(IGameDef *gamedef);
void testStartStopWait();
- void testThreadKill();
void testAtomicSemaphoreThread();
};
@@ -40,7 +39,6 @@ static TestThreading g_test_instance;
void TestThreading::runTests(IGameDef *gamedef)
{
TEST(testStartStopWait);
- TEST(testThreadKill);
TEST(testAtomicSemaphoreThread);
}
@@ -111,29 +109,6 @@ void TestThreading::testStartStopWait()
}
-void TestThreading::testThreadKill()
-{
- SimpleTestThread *thread = new SimpleTestThread(300);
-
- UASSERT(thread->start() == true);
-
- // kill()ing is quite violent, so let's make sure our victim is sleeping
- // before we do this... so we don't corrupt the rest of the program's state
- sleep_ms(100);
- UASSERT(thread->kill() == true);
-
- // The state of the thread object should be reset if all went well
- UASSERT(thread->isRunning() == false);
- UASSERT(thread->start() == true);
- UASSERT(thread->stop() == true);
- UASSERT(thread->wait() == true);
-
- // kill() after already waiting should fail.
- UASSERT(thread->kill() == false);
-
- delete thread;
-}
-
class AtomicTestThread : public Thread {
public: