txlyre 1 dia atrás
pai
commit
120f66c30d
2 arquivos alterados com 18 adições e 72 exclusões
  1. 13 59
      qirt.c
  2. 5 13
      qirt.h

+ 13 - 59
qirt.c

@@ -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,

+ 5 - 13
qirt.h

@@ -248,13 +248,6 @@ struct _qi_symbol_t {
 
 typedef struct _qi_lock_t qi_lock_t;
 
-struct _qi_lock_t {
-  bool locked;
-
-  void *mutex;
-  void *cond;
-};
-
 #define qi_set(state, is_pf, name, value)                                     \
   (_qi_set((state), is_pf, false, (name), (value)))
 #define qi_bind(state, is_pf, name, value)                                    \
@@ -448,12 +441,11 @@ void qi_mutex_destroy(void *mutex);
 void qi_mutex_lock(void *mutex);
 bool qi_mutex_trylock(void *mutex);
 void qi_mutex_unlock(void *mutex);
-qi_lock_t *qi_lock_create(void);
-void qi_lock_destroy(qi_lock_t *lock);
-void qi_lock_acquire(qi_lock_t *lock);
-bool qi_lock_tryacquire(qi_lock_t *lock);
-bool qi_lock_acquired(qi_lock_t *lock);
-void qi_lock_release(qi_lock_t *lock);
+void *qi_cond_create(void);
+void qi_cond_destroy(void *cond);
+void qi_cond_wait(void *cond, void *mutex);
+void qi_cond_signal(void *cond);
+void qi_cond_broadcast(void *cond);
 void qi_state_init(qi_state_t **state);
 void qi_state_init_debug(qi_state_t **state);