From 81e1564a7d6097164ff914eb7e341f9fca42f1df Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 9 Feb 2012 16:13:56 -0800 Subject: [PATCH] rt: Detach pthreads before exiting Joinable pthreads need to be either joined or detached and we no longer join with the scheduler threads. --- src/rt/rust_task_thread.cpp | 1 + src/rt/sync/rust_thread.cpp | 12 ++++++++++++ src/rt/sync/rust_thread.h | 5 +++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/rt/rust_task_thread.cpp b/src/rt/rust_task_thread.cpp index 48bd7f16bdf9..87e8a616dfc2 100644 --- a/src/rt/rust_task_thread.cpp +++ b/src/rt/rust_task_thread.cpp @@ -319,6 +319,7 @@ rust_task_thread::create_task(rust_task *spawner, const char *name, void rust_task_thread::run() { this->start_main_loop(); + detach(); sched->release_task_thread(); } diff --git a/src/rt/sync/rust_thread.cpp b/src/rt/sync/rust_thread.cpp index 49daaa5c96db..3c54fdcf3f48 100644 --- a/src/rt/sync/rust_thread.cpp +++ b/src/rt/sync/rust_thread.cpp @@ -4,6 +4,9 @@ rust_thread::rust_thread() : thread(0) { } +rust_thread::~rust_thread() { +} + #if defined(__WIN32__) static DWORD WINAPI #elif defined(__GNUC__) @@ -41,3 +44,12 @@ rust_thread::join() { #endif thread = 0; } + +void +rust_thread::detach() { +#if !defined(__WIN32__) + // Don't leak pthread resources. + // http://crosstantine.blogspot.com/2010/01/pthreadcreate-memory-leak.html + pthread_detach(thread); +#endif +} diff --git a/src/rt/sync/rust_thread.h b/src/rt/sync/rust_thread.h index 1c27d1b6597b..2e143110c282 100644 --- a/src/rt/sync/rust_thread.h +++ b/src/rt/sync/rust_thread.h @@ -12,6 +12,8 @@ public: pthread_t thread; #endif rust_thread(); + virtual ~rust_thread(); + void start(); virtual void run() { @@ -19,8 +21,7 @@ public: } void join(); - - virtual ~rust_thread() {} // quiet the compiler + void detach(); }; #endif /* RUST_THREAD_H */