aboutsummaryrefslogtreecommitdiff
path: root/test_common/harness/ThreadPool.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test_common/harness/ThreadPool.cpp')
-rw-r--r--test_common/harness/ThreadPool.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/test_common/harness/ThreadPool.cpp b/test_common/harness/ThreadPool.cpp
index 62798045..c4abaa2e 100644
--- a/test_common/harness/ThreadPool.cpp
+++ b/test_common/harness/ThreadPool.cpp
@@ -23,6 +23,7 @@
// or any other POSIX system
#include <atomic>
+#include <vector>
#if defined(_WIN32)
#include <windows.h>
@@ -58,6 +59,12 @@ CRITICAL_SECTION gAtomicLock;
pthread_mutex_t gAtomicLock;
#endif
+#if !defined(_WIN32)
+// Keep track of pthread_t's created in ThreadPool_Init() so they can be joined
+// in ThreadPool_Exit() and avoid thread leaks.
+static std::vector<pthread_t> pthreads;
+#endif
+
// Atomic add operator with mem barrier. Mem barrier needed to protect state
// modified by the worker functions.
cl_int ThreadPool_AtomicAdd(volatile cl_int *a, cl_int b)
@@ -642,6 +649,9 @@ void ThreadPool_Init(void)
gThreadCount = i;
break;
}
+#if !defined(_WIN32)
+ pthreads.push_back(tid);
+#endif // !_WIN32
}
atexit(ThreadPool_Exit);
@@ -721,7 +731,20 @@ void ThreadPool_Exit(void)
"still active.\n",
gThreadCount.load());
else
+ {
+#if !defined(_WIN32)
+ for (pthread_t pthread : pthreads)
+ {
+ if (int err = pthread_join(pthread, nullptr))
+ {
+ log_error("Error from %d from pthread_join. Unable to join "
+ "work threads. ThreadPool_Exit failed.\n",
+ err);
+ }
+ }
+#endif
log_info("Thread pool exited in a orderly fashion.\n");
+ }
}