Lines Matching refs:sem
10 void sem_init(semaphore_t *sem, int16_t initial_permits, int16_t max_permits) { in sem_init() argument
11 lock_init(&sem->core, next_striped_spin_lock_num()); in sem_init()
12 sem->permits = initial_permits; in sem_init()
13 sem->max_permits = max_permits; in sem_init()
17 int __time_critical_func(sem_available)(semaphore_t *sem) { in __time_critical_func()
19 return *(volatile typeof(sem->permits) *) &sem->permits; in __time_critical_func()
21 static_assert(sizeof(sem->permits) == 2, ""); in __time_critical_func()
22 return *(volatile int16_t *) &sem->permits; in __time_critical_func()
26 void __time_critical_func(sem_acquire_blocking)(semaphore_t *sem) { in __time_critical_func()
28 uint32_t save = spin_lock_blocking(sem->core.spin_lock); in __time_critical_func()
29 if (sem->permits > 0) { in __time_critical_func()
30 sem->permits--; in __time_critical_func()
31 spin_unlock(sem->core.spin_lock, save); in __time_critical_func()
34 lock_internal_spin_unlock_with_wait(&sem->core, save); in __time_critical_func()
38 bool __time_critical_func(sem_acquire_timeout_ms)(semaphore_t *sem, uint32_t timeout_ms) { in __time_critical_func()
39 return sem_acquire_block_until(sem, make_timeout_time_ms(timeout_ms)); in __time_critical_func()
42 bool __time_critical_func(sem_acquire_timeout_us)(semaphore_t *sem, uint32_t timeout_us) { in __time_critical_func()
43 return sem_acquire_block_until(sem, make_timeout_time_us(timeout_us)); in __time_critical_func()
46 bool __time_critical_func(sem_acquire_block_until)(semaphore_t *sem, absolute_time_t until) { in __time_critical_func()
48 uint32_t save = spin_lock_blocking(sem->core.spin_lock); in __time_critical_func()
49 if (sem->permits > 0) { in __time_critical_func()
50 sem->permits--; in __time_critical_func()
51 spin_unlock(sem->core.spin_lock, save); in __time_critical_func()
54 if (lock_internal_spin_unlock_with_best_effort_wait_or_timeout(&sem->core, save, until)) { in __time_critical_func()
60 bool __time_critical_func(sem_try_acquire)(semaphore_t *sem) { in __time_critical_func()
61 uint32_t save = spin_lock_blocking(sem->core.spin_lock); in __time_critical_func()
62 if (sem->permits > 0) { in __time_critical_func()
63 sem->permits--; in __time_critical_func()
64 spin_unlock(sem->core.spin_lock, save); in __time_critical_func()
67 spin_unlock(sem->core.spin_lock, save); in __time_critical_func()
72 bool __time_critical_func(sem_release)(semaphore_t *sem) { in __time_critical_func()
73 uint32_t save = spin_lock_blocking(sem->core.spin_lock); in __time_critical_func()
74 int32_t count = sem->permits; in __time_critical_func()
75 if (count < sem->max_permits) { in __time_critical_func()
76 sem->permits = (int16_t)(count + 1); in __time_critical_func()
77 lock_internal_spin_unlock_with_notify(&sem->core, save); in __time_critical_func()
80 spin_unlock(sem->core.spin_lock, save); in __time_critical_func()
85 void __time_critical_func(sem_reset)(semaphore_t *sem, int16_t permits) { in __time_critical_func()
86 assert(permits >= 0 && permits <= sem->max_permits); in __time_critical_func()
87 uint32_t save = spin_lock_blocking(sem->core.spin_lock); in __time_critical_func()
88 if (permits > sem->permits) { in __time_critical_func()
89 sem->permits = permits; in __time_critical_func()
90 lock_internal_spin_unlock_with_notify(&sem->core, save); in __time_critical_func()
92 sem->permits = permits; in __time_critical_func()
93 spin_unlock(sem->core.spin_lock, save); in __time_critical_func()