diff options
| author | Mikhail Romanko <me@blankhex.com> | 2025-03-02 23:18:23 +0300 |
|---|---|---|
| committer | Mikhail Romanko <me@blankhex.com> | 2025-03-02 23:18:23 +0300 |
| commit | d403d41f2c54ca382d3a1be17491fdf94097c693 (patch) | |
| tree | 9aa2dc87bca34ee2360f82e87bbc0ce09eff0a70 /src/Platform/Posix/Condition.c | |
| parent | 2ca6a3e316f356c0467f52f80d8588ee8ed76314 (diff) | |
| download | bhlib-d403d41f2c54ca382d3a1be17491fdf94097c693.tar.gz | |
Add initial implementation of threads/mutexes/semaphores/cvs/spinlocks
Added initial implementation (or wrapper) of the threading library.
It's rather basic, but should work for most of the tasks.
Unfortunately, spinlock implementation relies on GCC/Clang compiler
built-ins (or in-worst-case-scenario on Win32 - InterlockExchange).
In the future, I should revisit this code and fix/reimplement some stuff
(or add support for Windows XP).
Diffstat (limited to 'src/Platform/Posix/Condition.c')
| -rw-r--r-- | src/Platform/Posix/Condition.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/Platform/Posix/Condition.c b/src/Platform/Posix/Condition.c new file mode 100644 index 0000000..10ea1f4 --- /dev/null +++ b/src/Platform/Posix/Condition.c @@ -0,0 +1,74 @@ +#include "Thread.h" + +#include <BH/Thread.h> +#include <stdlib.h> +#include <errno.h> + + +BH_Condition *BH_ConditionNew(void) +{ + BH_Condition *condition; + + /* Allocate space for mutex and initialize it */ + condition = malloc(sizeof(BH_Condition)); + if (condition && pthread_cond_init(&condition->handle, NULL)) + { + free(condition); + return NULL; + } + + return condition; +} + + +void BH_ConditionFree(BH_Condition *condition) +{ + pthread_cond_destroy(&condition->handle); + free(condition); +} + + +int BH_ConditionWait(BH_Condition *condition, + BH_Mutex *mutex) +{ + if (pthread_cond_wait(&condition->handle, &mutex->handle)) + return BH_ERROR; + + return BH_OK; +} + + +int BH_ConditionWaitFor(BH_Condition *condition, + BH_Mutex *mutex, + uint32_t timeout) +{ + struct timespec ts; + + ts.tv_sec = timeout / 1000; + ts.tv_nsec = (timeout - ts.tv_sec * 1000) * 1000000; + + switch (pthread_cond_timedwait(&condition->handle, &mutex->handle, &ts)) + { + case 0: return BH_OK; + case ETIMEDOUT: return BH_TIMEOUT; + default: return BH_ERROR; + } +} + + +int BH_ConditionSignal(BH_Condition *condition) +{ + if (pthread_cond_signal(&condition->handle)) + return BH_ERROR; + + return BH_OK; +} + + +int BH_ConditionBroadcast(BH_Condition *condition) +{ + if (pthread_cond_broadcast(&condition->handle)) + return BH_ERROR; + + return BH_OK; +} |
