mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 14:38:21 +00:00
semaphore: introduce a semaphore_reset helper
This simply clears the internal counter of a semaphore.
This commit is contained in:
@@ -27,6 +27,7 @@ typedef struct semaphore_t{
|
|||||||
int semaphore_wait(semaphore_t *sem, bool interruptible);
|
int semaphore_wait(semaphore_t *sem, bool interruptible);
|
||||||
int semaphore_timedwait(semaphore_t *sem, time_t timeoutusec, bool interruptible);
|
int semaphore_timedwait(semaphore_t *sem, time_t timeoutusec, bool interruptible);
|
||||||
void semaphore_signal(semaphore_t *sem);
|
void semaphore_signal(semaphore_t *sem);
|
||||||
|
void semaphore_reset(semaphore_t *sem);
|
||||||
bool semaphore_test(semaphore_t *sem);
|
bool semaphore_test(semaphore_t *sem);
|
||||||
bool semaphore_haswaiters(semaphore_t *sem);
|
bool semaphore_haswaiters(semaphore_t *sem);
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,13 @@ void semaphore_signal(semaphore_t *sem) {
|
|||||||
interrupt_set(intstate);
|
interrupt_set(intstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void semaphore_reset(semaphore_t *sem) {
|
||||||
|
bool intstate = spinlock_acquireirqclear(&sem->lock);
|
||||||
|
__assert(sem->head == NULL);
|
||||||
|
sem->i = 0;
|
||||||
|
spinlock_releaseirqrestore(&sem->lock, intstate);
|
||||||
|
}
|
||||||
|
|
||||||
bool semaphore_haswaiters(semaphore_t *sem) {
|
bool semaphore_haswaiters(semaphore_t *sem) {
|
||||||
bool intstate = interrupt_set(false);
|
bool intstate = interrupt_set(false);
|
||||||
spinlock_acquire(&sem->lock);
|
spinlock_acquire(&sem->lock);
|
||||||
|
|||||||
Reference in New Issue
Block a user