|
@@ -2924,6 +2924,7 @@ void *qi_mutex_create(void) {
|
|
|
|
|
|
void qi_mutex_destroy(void *mutex) {
|
|
|
pthread_mutex_destroy((pthread_mutex_t *)mutex);
|
|
|
+ qi_free(mutex);
|
|
|
}
|
|
|
|
|
|
void qi_mutex_lock(void *mutex) {
|
|
@@ -2941,76 +2942,29 @@ void qi_mutex_unlock(void *mutex) {
|
|
|
pthread_mutex_unlock((pthread_mutex_t *)mutex);
|
|
|
}
|
|
|
|
|
|
-qi_lock_t *qi_lock_create(void) {
|
|
|
- qi_lock_t *lock = qi_malloc(sizeof(qi_lock_t));
|
|
|
- lock->locked = false;
|
|
|
-
|
|
|
- lock->mutex = qi_mutex_create();
|
|
|
- if (!lock->mutex)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- pthread_cond_t *cond = qi_malloc(sizeof(pthread_cond_t));
|
|
|
+void *qi_cond_create(void) {
|
|
|
+ pthread_cond_t *cond = qi_malloc_atomic(sizeof(pthread_cond_t));
|
|
|
if (pthread_cond_init(cond, NULL) != 0)
|
|
|
return NULL;
|
|
|
|
|
|
- lock->cond = (void *)cond;
|
|
|
-
|
|
|
- return lock;
|
|
|
-}
|
|
|
-
|
|
|
-void qi_lock_destroy(qi_lock_t *lock) {
|
|
|
- qi_mutex_destroy(lock->mutex);
|
|
|
- pthread_cond_destroy((pthread_cond_t *)lock->cond);
|
|
|
+ return (void *)cond;
|
|
|
}
|
|
|
|
|
|
-void qi_lock_acquire(qi_lock_t *lock) {
|
|
|
- qi_mutex_lock(lock->mutex);
|
|
|
-
|
|
|
- while (lock->locked)
|
|
|
- pthread_cond_wait((pthread_cond_t *)lock->cond, (pthread_mutex_t *)lock->mutex);
|
|
|
-
|
|
|
- lock->locked = true;
|
|
|
-
|
|
|
- qi_mutex_unlock(lock->mutex);
|
|
|
+void qi_cond_destroy(void *cond) {
|
|
|
+ pthread_cond_destroy((pthread_cond_t *)cond);
|
|
|
+ qi_free(cond);
|
|
|
}
|
|
|
|
|
|
-bool qi_lock_tryacquire(qi_lock_t *lock) {
|
|
|
- qi_mutex_lock(lock->mutex);
|
|
|
-
|
|
|
- if (lock->locked) {
|
|
|
- qi_mutex_unlock(lock->mutex);
|
|
|
-
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- while (lock->locked)
|
|
|
- pthread_cond_wait((pthread_cond_t *)lock->cond, (pthread_mutex_t *)lock->mutex);
|
|
|
-
|
|
|
- lock->locked = true;
|
|
|
-
|
|
|
- qi_mutex_unlock(lock->mutex);
|
|
|
-
|
|
|
- return true;
|
|
|
+void qi_cond_wait(void *cond, void *mutex) {
|
|
|
+ pthread_cond_wait((pthread_cond_t *)cond, (pthread_mutex_t *)mutex);
|
|
|
}
|
|
|
|
|
|
-bool qi_lock_acquired(qi_lock_t *lock) {
|
|
|
- qi_mutex_lock(lock->mutex);
|
|
|
-
|
|
|
- bool res = lock->locked;
|
|
|
-
|
|
|
- qi_mutex_unlock(lock->mutex);
|
|
|
-
|
|
|
- return res;
|
|
|
+void qi_cond_signal(void *cond) {
|
|
|
+ pthread_cond_signal((pthread_cond_t *)cond);
|
|
|
}
|
|
|
|
|
|
-void qi_lock_release(qi_lock_t *lock) {
|
|
|
- qi_mutex_lock(lock->mutex);
|
|
|
-
|
|
|
- lock->locked = false;
|
|
|
-
|
|
|
- pthread_cond_signal((pthread_cond_t *)lock->cond);
|
|
|
-
|
|
|
- qi_mutex_unlock(lock->mutex);
|
|
|
+void qi_cond_broadcast(void *cond) {
|
|
|
+ pthread_cond_broadcast((pthread_cond_t *)cond);
|
|
|
}
|
|
|
|
|
|
qi_value_t *qi_builtin_print(qi_state_t *state, qi_size_t pargc,
|