mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
b5cb71ab84
Condition variables, barriers, and r/w locks now work very well.
69 lines
2.8 KiB
C
69 lines
2.8 KiB
C
#ifndef NSYNC_DLL_H_
|
|
#define NSYNC_DLL_H_
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
COSMOPOLITAN_C_START_
|
|
|
|
/* A nsync_dll_element_ represents an element of a doubly-linked list of
|
|
waiters. */
|
|
typedef struct nsync_dll_element_s_ {
|
|
struct nsync_dll_element_s_ *next;
|
|
struct nsync_dll_element_s_ *prev;
|
|
/* points to the struct this nsync_dll struct is embedded in. */
|
|
void *container;
|
|
} nsync_dll_element_;
|
|
|
|
/* A nsync_dll_list_ represents a list of nsync_dll_elements_. */
|
|
typedef nsync_dll_element_ *nsync_dll_list_; /* last elem of circular list; nil
|
|
=> empty; first is x.next. */
|
|
|
|
/* Initialize *e. */
|
|
void nsync_dll_init_(nsync_dll_element_ *e, void *container);
|
|
|
|
/* Return whether list is empty. */
|
|
int nsync_dll_is_empty_(nsync_dll_list_ list);
|
|
|
|
/* Remove *e from list, and returns the new list. */
|
|
nsync_dll_list_ nsync_dll_remove_(nsync_dll_list_ list, nsync_dll_element_ *e);
|
|
|
|
/* Cause element *n and its successors to come after element *p.
|
|
Requires n and p are non-NULL and do not point at elements of the
|
|
same list. */
|
|
void nsync_dll_splice_after_(nsync_dll_element_ *p, nsync_dll_element_ *n);
|
|
|
|
/* Make element *e the first element of list, and return the list. The
|
|
resulting list will have *e as its first element, followed by any
|
|
elements in the same list as *e, followed by the elements that were
|
|
previously in list. Requires that *e not be in list. If e==NULL, list
|
|
is returned unchanged. */
|
|
nsync_dll_list_ nsync_dll_make_first_in_list_(nsync_dll_list_ list,
|
|
nsync_dll_element_ *e);
|
|
|
|
/* Make element *e the last element of list, and return the list. The
|
|
resulting list will have *e as its last element, preceded by any
|
|
elements in the same list as *e, preceded by the elements that were
|
|
previously in list. Requires that *e not be in list. If e==NULL, list
|
|
is returned unchanged. */
|
|
nsync_dll_list_ nsync_dll_make_last_in_list_(nsync_dll_list_ list,
|
|
nsync_dll_element_ *e);
|
|
|
|
/* Return a pointer to the first element of list, or NULL if list is
|
|
* empty. */
|
|
nsync_dll_element_ *nsync_dll_first_(nsync_dll_list_ list);
|
|
|
|
/* Return a pointer to the last element of list, or NULL if list is
|
|
* empty. */
|
|
nsync_dll_element_ *nsync_dll_last_(nsync_dll_list_ list);
|
|
|
|
/* Return a pointer to the next element of list following *e, or NULL if
|
|
there is no such element. */
|
|
nsync_dll_element_ *nsync_dll_next_(nsync_dll_list_ list,
|
|
nsync_dll_element_ *e);
|
|
|
|
/* Return a pointer to the previous element of list following *e, or
|
|
NULL if there is no such element. */
|
|
nsync_dll_element_ *nsync_dll_prev_(nsync_dll_list_ list,
|
|
nsync_dll_element_ *e);
|
|
|
|
COSMOPOLITAN_C_END_
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* NSYNC_DLL_H_ */
|