diff options
| author | Aldrik Ramaekers <aldrik.ramaekers@protonmail.com> | 2020-01-30 21:11:12 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik.ramaekers@protonmail.com> | 2020-01-30 21:11:12 +0100 |
| commit | 260f05025631031b7cc4904805d5017feaf53eda (patch) | |
| tree | d5a723bb7bbbc9f8b598712723fe3d8290c0a54c /src/linux/thread.c | |
initial commit
Diffstat (limited to 'src/linux/thread.c')
| -rw-r--r-- | src/linux/thread.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/linux/thread.c b/src/linux/thread.c new file mode 100644 index 0000000..b6295ef --- /dev/null +++ b/src/linux/thread.c @@ -0,0 +1,129 @@ +/* +* BSD 2-Clause “Simplified” License +* Copyright (c) 2019, Aldrik Ramaekers, aldrik.ramaekers@protonmail.com +* All rights reserved. +*/ + +// stop gcc from reporting implicit declaration warning.. +extern long int syscall (long int __sysno, ...); +extern int pthread_tryjoin_np(pthread_t thread, void **retval); + +thread thread_start(void *(*start_routine) (void *), void *arg) +{ + thread result; + result.valid = false; + + pthread_attr_t attr; + int attr_init_result = pthread_attr_init(&attr); + if (attr_init_result) + return result; + + int start_thread_result = pthread_create(&result.thread, &attr, start_routine, arg); + if (start_thread_result) + { + pthread_attr_destroy(&attr); + return result; + } + + result.valid = true; + pthread_attr_destroy(&attr); + + return result; +} + +inline void thread_detach(thread *thread) +{ + if (thread->valid) + { + pthread_detach(thread->thread); + } +} + +inline void thread_join(thread *thread) +{ + if (thread->valid) + { + void *retval; + pthread_join(thread->thread, &retval); + } +} + +bool thread_tryjoin(thread *thread) +{ + if (thread->valid) + { + void *retval; + bool thread_joined = !pthread_tryjoin_np(thread->thread, &retval); + return thread_joined; + } + return false; +} + +inline void thread_stop(thread *thread) +{ + if (thread->valid) + { + pthread_cancel(thread->thread); + } +} + +mutex mutex_create() +{ + mutex result; + + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT); + + pthread_mutex_init(&result.mutex, &attr); + + pthread_mutexattr_destroy(&attr); + + return result; +} + +mutex mutex_create_recursive() +{ + mutex result; + + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + + pthread_mutex_init(&result.mutex, &attr); + + pthread_mutexattr_destroy(&attr); + + return result; +} + +inline void mutex_lock(mutex *mutex) +{ + pthread_mutex_lock(&mutex->mutex); +} + +inline bool mutex_trylock(mutex *mutex) +{ + return !pthread_mutex_trylock(&mutex->mutex); +} + +inline void mutex_unlock(mutex *mutex) +{ + pthread_mutex_unlock(&mutex->mutex); +} + +inline void mutex_destroy(mutex *mutex) +{ + mutex_unlock(mutex); + pthread_mutex_destroy(&mutex->mutex); +} + +inline u32 thread_get_id() +{ + return (u32)syscall(__NR_gettid); +} + +inline void thread_sleep(u64 microseconds) +{ + usleep(microseconds); +} |
