Lines Matching refs:lock

20 fssh_recursive_lock_get_recursion(fssh_recursive_lock *lock)
22 if (lock->holder == fssh_find_thread(NULL))
23 return lock->recursion;
30 fssh_recursive_lock_init_etc(fssh_recursive_lock *lock, const char *name,
35 if (lock == NULL)
39 name = "recursive lock";
41 lock->holder = -1;
42 lock->recursion = 0;
43 lock->sem = fssh_create_sem(1, name);
44 if (lock->sem < FSSH_B_OK)
45 fssh_panic("could not create recursive lock");
50 fssh_recursive_lock_init(fssh_recursive_lock *lock, const char *name)
52 fssh_recursive_lock_init_etc(lock, name, 0);
57 fssh_recursive_lock_destroy(fssh_recursive_lock *lock)
59 if (lock == NULL)
62 fssh_delete_sem(lock->sem);
63 lock->sem = -1;
68 fssh_recursive_lock_lock(fssh_recursive_lock *lock)
72 if (thread != lock->holder) {
73 fssh_status_t status = fssh_acquire_sem(lock->sem);
77 lock->holder = thread;
79 lock->recursion++;
85 fssh_recursive_lock_trylock(fssh_recursive_lock *lock)
89 if (thread != lock->holder) {
90 fssh_status_t status = fssh_acquire_sem_etc(lock->sem, 1,
95 lock->holder = thread;
97 lock->recursion++;
103 fssh_recursive_lock_unlock(fssh_recursive_lock *lock)
105 if (fssh_find_thread(NULL) != lock->holder)
106 fssh_panic("recursive_lock %p unlocked by non-holder thread!\n", lock);
108 if (--lock->recursion == 0) {
109 lock->holder = -1;
110 fssh_release_sem(lock->sem);
116 fssh_recursive_lock_transfer_lock(fssh_recursive_lock *lock,
119 if (lock->recursion != 1)
120 fssh_panic("invalid recursion level for lock transfer!");
122 lock->holder = thread;
211 fssh_rw_lock_init(fssh_rw_lock *lock, const char *name)
213 if (lock == NULL)
217 name = "r/w lock";
219 lock->count = 0;
220 lock->holder = -1;
222 lock->sem = fssh_create_sem(FSSH_RW_MAX_READERS, name);
223 if (lock->sem < FSSH_B_OK)
224 fssh_panic("could not create r/w lock");
229 fssh_rw_lock_init_etc(fssh_rw_lock *lock, const char *name, uint32_t flags)
231 fssh_rw_lock_init(lock, name);
236 fssh_rw_lock_destroy(fssh_rw_lock *lock)
238 if (lock == NULL)
241 fssh_delete_sem(lock->sem);
246 fssh_rw_lock_read_lock(fssh_rw_lock *lock)
248 if (lock->holder == fssh_find_thread(NULL)) {
249 lock->count++;
253 return fssh_acquire_sem(lock->sem);
258 fssh_rw_lock_read_unlock(fssh_rw_lock *lock)
260 if (lock->holder == fssh_find_thread(NULL) && --lock->count > 0)
263 return fssh_release_sem(lock->sem);
268 fssh_rw_lock_write_lock(fssh_rw_lock *lock)
270 if (lock->holder == fssh_find_thread(NULL)) {
271 lock->count++;
275 fssh_status_t status = fssh_acquire_sem_etc(lock->sem, FSSH_RW_MAX_READERS,
278 lock->holder = fssh_find_thread(NULL);
279 lock->count = 1;
286 fssh_rw_lock_write_unlock(fssh_rw_lock *lock)
288 if (--lock->count > 0)
291 lock->holder = -1;
293 return fssh_release_sem_etc(lock->sem, FSSH_RW_MAX_READERS, 0);