mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-28 22:18:29 +00:00
This changes *NSYNC to allocate waiters on the stack so our locks don't need to depend on dynamic memory. This make our runtiem simpler, and it also fixes bugs with thread cancellation support.
31 lines
1 KiB
C
31 lines
1 KiB
C
#ifndef NSYNC_SEM_H_
|
|
#define NSYNC_SEM_H_
|
|
#include "third_party/nsync/time.h"
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
COSMOPOLITAN_C_START_
|
|
|
|
typedef struct nsync_semaphore_s_ {
|
|
void *sem_space[32]; /* internal storage */
|
|
} nsync_semaphore;
|
|
|
|
/* Initialize *s; the initial value is 0. */
|
|
void nsync_mu_semaphore_init(nsync_semaphore *s);
|
|
|
|
/* Releases system resources associated with *s. */
|
|
void nsync_mu_semaphore_destroy(nsync_semaphore *s);
|
|
|
|
/* Wait until the count of *s exceeds 0, and decrement it. */
|
|
errno_t nsync_mu_semaphore_p(nsync_semaphore *s);
|
|
|
|
/* Wait until one of: the count of *s is non-zero, in which case
|
|
decrement *s and return 0; or abs_deadline expires, in which case
|
|
return ETIMEDOUT. */
|
|
errno_t nsync_mu_semaphore_p_with_deadline(nsync_semaphore *s,
|
|
nsync_time abs_deadline);
|
|
|
|
/* Ensure that the count of *s is at least 1. */
|
|
void nsync_mu_semaphore_v(nsync_semaphore *s);
|
|
|
|
COSMOPOLITAN_C_END_
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* NSYNC_SEM_H_ */
|