diff options
author | David Robillard <d@drobilla.net> | 2022-10-20 21:08:42 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-10-20 21:17:04 -0400 |
commit | 5eb8ceef3fd92cc2dccd9efc1fd8f2baed0a492c (patch) | |
tree | 893ca237ad6e8b7432e362c85b7ab0dc40b16050 /include | |
parent | 668ffa3febb116d20add6e9460fb1fb521a22e35 (diff) | |
download | zix-5eb8ceef3fd92cc2dccd9efc1fd8f2baed0a492c.tar.gz zix-5eb8ceef3fd92cc2dccd9efc1fd8f2baed0a492c.tar.bz2 zix-5eb8ceef3fd92cc2dccd9efc1fd8f2baed0a492c.zip |
Hide thread implementation
Diffstat (limited to 'include')
-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 - /** @} */ |