diff options
Diffstat (limited to 'include/zix/thread.h')
-rw-r--r-- | include/zix/thread.h | 65 |
1 files changed, 12 insertions, 53 deletions
diff --git a/include/zix/thread.h b/include/zix/thread.h index 173cc39..af036b1 100644 --- a/include/zix/thread.h +++ b/include/zix/thread.h @@ -4,6 +4,7 @@ #ifndef ZIX_THREAD_H #define ZIX_THREAD_H +#include "zix/attributes.h" #include "zix/common.h" #ifdef _WIN32 @@ -12,7 +13,6 @@ # include <pthread.h> #endif -#include <errno.h> #include <stddef.h> #ifdef __cplusplus @@ -26,18 +26,21 @@ extern "C" { */ #ifdef _WIN32 -# define ZIX_THREAD_RESULT 0 ///< Result returned from a thread function -# define ZIX_THREAD_FUNC __stdcall ///< Thread function attribute + +# define ZIX_THREAD_RESULT 0 +# define ZIX_THREAD_FUNC __stdcall typedef HANDLE ZixThread; typedef DWORD ZixThreadResult; #else + # define ZIX_THREAD_RESULT NULL ///< Result returned from a thread function # define ZIX_THREAD_FUNC ///< Thread function attribute -typedef pthread_t ZixThread; -typedef void* ZixThreadResult; +typedef pthread_t ZixThread; ///< A thread +typedef void* ZixThreadResult; ///< Thread function return type + #endif /** @@ -59,62 +62,18 @@ typedef ZixThreadResult(ZIX_THREAD_FUNC* ZixThreadFunc)(void*); The thread will immediately be launched, calling `function` with `arg` as the only parameter. */ -static inline ZixStatus +ZIX_API +ZixStatus zix_thread_create(ZixThread* thread, size_t stack_size, ZixThreadFunc function, void* arg); /// Join `thread` (block until `thread` exits) -static inline ZixStatus +ZIX_API +ZixStatus zix_thread_join(ZixThread thread); -#ifdef _WIN32 - -static inline ZixStatus -zix_thread_create(ZixThread* thread, - size_t stack_size, - ZixThreadFunc function, - void* arg) -{ - *thread = CreateThread(NULL, stack_size, function, arg, 0, NULL); - return *thread ? ZIX_STATUS_SUCCESS : ZIX_STATUS_ERROR; -} - -static inline ZixStatus -zix_thread_join(ZixThread thread) -{ - return (WaitForSingleObject(thread, INFINITE) == WAIT_OBJECT_0) - ? ZIX_STATUS_SUCCESS - : ZIX_STATUS_ERROR; -} - -#else /* !defined(_WIN32) */ - -static inline ZixStatus -zix_thread_create(ZixThread* thread, - size_t stack_size, - ZixThreadFunc function, - void* arg) -{ - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setstacksize(&attr, stack_size); - - const int ret = pthread_create(thread, NULL, function, arg); - - pthread_attr_destroy(&attr); - return zix_errno_status(ret); -} - -static inline ZixStatus -zix_thread_join(ZixThread thread) -{ - return pthread_join(thread, NULL) ? ZIX_STATUS_ERROR : ZIX_STATUS_SUCCESS; -} - -#endif - /** @} */ |