lock.h
1 #ifndef _LIBSIMPLE_LOCK_H_ 2 #define _LIBSIMPLE_LOCK_H_ 3 4 #include <stdint.h> 5 #include <stdbool.h> 6 7 #include "base.h" 8 9 LIBSIMPLE_DECLARATIONS_BEGIN; 10 11 // 12 // lock 13 // 14 15 typedef struct libsimple_lock { 16 uint32_t state; 17 } libsimple_lock_t; 18 19 #define LIBSIMPLE_LOCK_INITIALIZER {0} 20 21 LIBSIMPLE_INLINE 22 static void libsimple_lock_init(libsimple_lock_t* lock) { 23 lock->state = 0; 24 }; 25 26 void libsimple_lock_lock(libsimple_lock_t* lock); 27 void libsimple_lock_unlock(libsimple_lock_t* lock); 28 bool libsimple_lock_try_lock(libsimple_lock_t* lock); 29 30 // 31 // once 32 // 33 34 typedef struct libsimple_once { 35 uint32_t state; 36 } libsimple_once_t; 37 38 typedef void (*libsimple_once_callback)(void* context); 39 40 #define LIBSIMPLE_ONCE_INITIALIZER {0} 41 42 LIBSIMPLE_INLINE 43 static void libsimple_once_init(libsimple_once_t* once) { 44 once->state = 0; 45 }; 46 47 void libsimple_once(libsimple_once_t* once, libsimple_once_callback callback, void* context); 48 49 // 50 // rwlock 51 // 52 53 typedef struct libsimple_rwlock { 54 uint32_t state; 55 } libsimple_rwlock_t; 56 57 #define LIBSIMPLE_RWLOCK_INITIALIZER {0} 58 59 LIBSIMPLE_INLINE 60 static void libsimple_rwlock_init(libsimple_rwlock_t* rwlock) { 61 rwlock->state = 0; 62 }; 63 64 void libsimple_rwlock_lock_read(libsimple_rwlock_t* rwlock); 65 bool libsimple_rwlock_try_lock_read(libsimple_rwlock_t* rwlock); 66 void libsimple_rwlock_unlock_read(libsimple_rwlock_t* rwlock); 67 68 void libsimple_rwlock_lock_write(libsimple_rwlock_t* rwlock); 69 bool libsimple_rwlock_try_lock_write(libsimple_rwlock_t* rwlock); 70 void libsimple_rwlock_unlock_write(libsimple_rwlock_t* rwlock); 71 72 // 73 // condvar 74 // 75 76 typedef struct libsimple_condvar { 77 uint32_t state; 78 } libsimple_condvar_t; 79 80 #define LIBSIMPLE_CONDVAR_INITIALIZER {0} 81 82 LIBSIMPLE_INLINE 83 static void libsimple_condvar_init(libsimple_condvar_t* condvar) { 84 condvar->state = 0; 85 }; 86 87 // NOTE: the same lock must be used for all operations with a condvar. 88 // the only reason we don't just store a pointer to the lock in the condvar 89 // is so that condvars can be initialized statically. 90 91 void libsimple_condvar_wait(libsimple_condvar_t* condvar, libsimple_lock_t* lock); 92 void libsimple_condvar_notify_one(libsimple_condvar_t* condvar, libsimple_lock_t* lock); 93 void libsimple_condvar_notify_all(libsimple_condvar_t* condvar, libsimple_lock_t* lock); 94 95 LIBSIMPLE_DECLARATIONS_END; 96 97 #endif // _LIBSIMPLE_LOCK_H_