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_