From 9b74129a4f2d3edd4502dd263b54535aa67780a0 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Tue, 7 Sep 2010 18:05:42 -0700 Subject: [PATCH] Added a thread utility class to factor out operations on threads. --- src/rt/sync/sync.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ src/rt/sync/sync.h | 21 +++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/rt/sync/sync.cpp b/src/rt/sync/sync.cpp index 09a6f291c70..70e5077cf98 100644 --- a/src/rt/sync/sync.cpp +++ b/src/rt/sync/sync.cpp @@ -10,3 +10,46 @@ void sync::yield() { pthread_yield(); #endif } + +#if defined(__WIN32__) +static DWORD WINAPI +#elif defined(__GNUC__) +static void * +#else +#error "Platform not supported" +#endif +rust_thread_start(void *ptr) { + rust_thread *thread = (rust_thread *) ptr; + thread->run(); + thread->thread = 0; + return 0; +} + +void +rust_thread::start() { +#if defined(__WIN32__) + thread = CreateThread(NULL, 0, rust_thread_start, this, 0, NULL); +#else + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 1024 * 1024); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + pthread_create(&thread, &attr, rust_thread_start, (void *) this); +#endif +} + +void +rust_thread::join() { +#if defined(__WIN32__) + WaitForSingleObject(thread, INFINITE); +#else + pthread_join(thread, NULL); +#endif + thread = 0; +} + +bool +rust_thread::is_running() { + // TODO: This may be broken because of possible races. + return thread; +} diff --git a/src/rt/sync/sync.h b/src/rt/sync/sync.h index 8c9a13f0f4a..562d2a1b7cd 100644 --- a/src/rt/sync/sync.h +++ b/src/rt/sync/sync.h @@ -11,4 +11,25 @@ public: } }; +/** + * Thread utility class. Derive and implement your own run() method. + */ +class rust_thread { +public: +#if defined(__WIN32__) + HANDLE thread; +#else + pthread_t thread; +#endif + void start(); + + virtual void run() { + return; + } + + void join(); + + bool is_running(); +}; + #endif /* SYNC_H */