|
KallistiOS git master
Independent SDK for the Sega Dreamcast
|
Semaphores. More...
#include <kos/cdefs.h>Go to the source code of this file.
Data Structures | |
| struct | semaphore_t |
| Semaphore type. More... | |
Macros | |
| #define | SEM_INITIALIZER(value) |
| Initializer for a transient semaphore. | |
| #define | sem_wait_scoped(sm) |
| Wait on a semaphore with scope management. | |
Functions | |
| int | sem_init (semaphore_t *sm, int count) |
| Initialize a semaphore for use. | |
| int | sem_destroy (semaphore_t *sm) __nonnull_all |
| Destroy a semaphore. | |
| int | sem_wait_timed (semaphore_t *sm, unsigned int timeout) __nonnull_all |
| Wait on a semaphore (with a timeout). | |
| static __nonnull_all int | sem_wait (semaphore_t *sm) |
| Wait on a semaphore. | |
| int | sem_trywait (semaphore_t *sm) __nonnull_all |
| "Wait" on a semaphore without blocking. | |
| int | sem_wait_irqsafe (semaphore_t *sm) __nonnull_all |
| Wait on a semaphore. | |
| int | sem_signal (semaphore_t *sm) __nonnull_all |
| Signal a semaphore. | |
| int | sem_count (const semaphore_t *sm) __nonnull_all |
| Retrieve the number of available resources. | |
Semaphores.
This file defines semaphores. A semaphore is a synchronization primitive that allows a specified number of threads to be in its critical section at a single point of time. Another way to think of it is that you have a predetermined number of resources available, and the semaphore maintains the resources.
| #define SEM_INITIALIZER | ( | value | ) |
Initializer for a transient semaphore.
| value | The initial count of the semaphore. |
| #define sem_wait_scoped | ( | sm | ) |
Wait on a semaphore with scope management.
This macro will wait on a semaphore, similarly to sem_wait, with the difference that the semaphore will automatically be signaled once the execution exits the functional block in which the macro was called.
| sm | The semaphore to wait on |
| int sem_count | ( | const semaphore_t * | sm | ) |
Retrieve the number of available resources.
This function will retrieve the count of available resources for a semaphore. This is not a thread-safe way to make sure resources will be available when you get around to waiting, so don't use it as such.
| sm | The semaphore to check |
References sem_signal().
| int sem_destroy | ( | semaphore_t * | sm | ) |
Destroy a semaphore.
This function destroys a semaphore, leaving it uninitialized. If there are any threads currently waiting on the semaphore, they will be woken with an ENOTRECOVERABLE error.
| sm | The semaphore to destroy |
| 0 | On success (no error conditions currently defined) |
| int sem_init | ( | semaphore_t * | sm, |
| int | count ) |
Initialize a semaphore for use.
This function initializes the semaphore passed in with the starting count value specified.
| sm | The semaphore to initialize |
| count | The initial count of the semaphore |
| 0 | On success |
| -1 | On error, errno will be set as appropriate |
Referenced by main().
| int sem_signal | ( | semaphore_t * | sm | ) |
Signal a semaphore.
This function will release resources associated with a semaphore, signalling a waiting thread to continue on, if any are waiting. It is your responsibility to make sure you only release resources you have.
| sm | The semaphore to signal |
| 0 | On success |
| -1 | On error, sets errno as appropriate |
Referenced by sem_count(), and thd_1().
| int sem_trywait | ( | semaphore_t * | sm | ) |
"Wait" on a semaphore without blocking.
This function will decrement the semaphore's count and return, if resources are available. Otherwise, it will return an error.
This function does not protect you against doing things that will cause a deadlock. This function, unlike the other waiting functions is safe to call inside an interrupt.
| sm | The semaphore to "wait" on |
| 0 | On success |
| -1 | On error, sets errno as appropriate |
|
inlinestatic |
Wait on a semaphore.
This function will decrement the semaphore's count and return, if resources are available. Otherwise, the function will block until the resources become available.
This function does not protect you against doing things that will cause a deadlock. This function is not safe to call in an interrupt. See sem_trywait() for a safe function to call in an interrupt.
| sm | The semaphore to wait on |
| 0 | On success |
| -1 | On error, sets errno as appropriate |
References sem_wait_timed().
Referenced by thd_2().
| int sem_wait_irqsafe | ( | semaphore_t * | sm | ) |
Wait on a semaphore.
This function will decrement the semaphore's count and return, if resources are available. Otherwise, the function will block until the resources become available.
This function can be used from within an interrupt context. In that case, if the semaphore is already used, an error will be returned.
| sm | The semaphore to wait on |
| 0 | On success |
| -1 | On error, sets errno as appropriate |
| int sem_wait_timed | ( | semaphore_t * | sm, |
| unsigned int | timeout ) |
Wait on a semaphore (with a timeout).
This function will decrement the semaphore's count and return, if resources are available. Otherwise, the function will block until the resources become available or the timeout expires.
This function does not protect you against doing things that will cause a deadlock. This function is not safe to call in an interrupt. See sem_trywait() for a safe function to call in an interrupt.
| sm | The semaphore to wait on |
| timeout | The maximum number of milliseconds to block (a value of 0 here will block indefinitely) |
| 0 | On success |
| -1 | On error, sets errno as appropriate |
Referenced by sem_wait(), and thd_2().