aboutsummaryrefslogtreecommitdiff
path: root/src/threading
diff options
context:
space:
mode:
Diffstat (limited to 'src/threading')
-rw-r--r--src/threading/thread.cpp69
-rw-r--r--src/threading/thread.h12
2 files changed, 40 insertions, 41 deletions
diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp
index e0f808c4d..5cfc60995 100644
--- a/src/threading/thread.cpp
+++ b/src/threading/thread.cpp
@@ -33,6 +33,8 @@ DEALINGS IN THE SOFTWARE.
#include <sys/prctl.h>
#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
#include <pthread_np.h>
+#elif defined(__NetBSD__)
+ #include <sched.h>
#elif defined(_MSC_VER)
struct THREADNAME_INFO {
DWORD dwType; // Must be 0x1000
@@ -71,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())
@@ -136,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)
{
@@ -219,12 +211,16 @@ void Thread::setName(const std::string &name)
#elif defined(__NetBSD__)
- pthread_setname_np(pthread_self(), name.c_str());
+ pthread_setname_np(pthread_self(), "%s", const_cast<char*>(name.c_str()));
#elif defined(__APPLE__)
pthread_setname_np(name.c_str());
+#elif defined(__HAIKU__)
+
+ rename_thread(find_thread(NULL), name.c_str());
+
#elif defined(_MSC_VER)
// Windows itself doesn't support thread names,
@@ -281,7 +277,14 @@ bool Thread::bindToProcessor(unsigned int proc_number)
CPU_SET(proc_number, &cpuset);
return pthread_setaffinity_np(getThreadHandle(), sizeof(cpuset), &cpuset) == 0;
+#elif defined(__NetBSD__)
+ cpuset_t *cpuset = cpuset_create();
+ if (cpuset == NULL)
+ return false;
+ int r = pthread_setaffinity_np(getThreadHandle(), cpuset_size(cpuset), cpuset);
+ cpuset_destroy(cpuset);
+ return r == 0;
#elif defined(__sun) || defined(sun)
return processor_bind(P_LWPID, P_MYID, proc_number, NULL) == 0
diff --git a/src/threading/thread.h b/src/threading/thread.h
index cea92226f..45fb171da 100644
--- a/src/threading/thread.h
+++ b/src/threading/thread.h
@@ -36,6 +36,10 @@ DEALINGS IN THE SOFTWARE.
#include <sys/thread.h> // for tid_t
#endif
+#ifdef __HAIKU__
+ #include <kernel/OS.h>
+#endif
+
/*
* On platforms using pthreads, these five priority classes correlate to
* even divisions between the minimum and maximum reported thread priority.
@@ -71,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