From 2eccdda3c595ca3ef4086f37a1a350c1cfea54b3 Mon Sep 17 00:00:00 2001 From: tqchen Date: Mon, 27 Apr 2015 22:42:01 -0700 Subject: [PATCH] strict cstyle pthread --- src/utils/thread.h | 22 ++++++++++++++++++++-- src/utils/thread_buffer.h | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/utils/thread.h b/src/utils/thread.h index 14c27a785..ef6335a74 100644 --- a/src/utils/thread.h +++ b/src/utils/thread.h @@ -123,16 +123,33 @@ class Semaphore { #endif }; +// helper for c thread +// used to strictly call c++ function from pthread +struct ThreadContext { + void *(*entry)(void*); + void *param; +}; +extern "C" { + inline void *RunThreadContext(void *ctx_) { + ThreadContext *ctx = reinterpret_cast(ctx_); + void *ret = (*ctx->entry)(ctx->param); + delete ctx; + return ret; + } +} /*!\brief simple thread class */ class Thread { private: pthread_t thread; + public : - inline void Start(void * entry(void*), void *param) { + inline void Start(void *entry(void*), void *param) { pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - pthread_create(&thread, &attr, entry, param); + ThreadContext *ctx = new ThreadContext(); + ctx->entry = entry; ctx->param = param; + pthread_create(&thread, &attr, RunThreadContext, ctx); } inline int Join(void) { void *status; @@ -142,6 +159,7 @@ class Thread { inline void ThreadExit(void *status) { pthread_exit(status); } + } // namespace utils } // namespace xgboost #define XGBOOST_THREAD_PREFIX void * diff --git a/src/utils/thread_buffer.h b/src/utils/thread_buffer.h index 2bf365ae2..45da6ec84 100644 --- a/src/utils/thread_buffer.h +++ b/src/utils/thread_buffer.h @@ -167,7 +167,6 @@ class ThreadBuffer { /*!\brief entry point of loader thread */ inline static XGBOOST_THREAD_PREFIX LoaderEntry(void *pthread) { static_cast< ThreadBuffer* >(pthread)->RunLoader(); - ThreadExit(NULL); return NULL; } /*!\brief start loader thread */ @@ -199,6 +198,7 @@ class ThreadBuffer { loading_need.Post(); } }; + } // namespace utils } // namespace xgboost #endif