cosmopolitan/third_party/nsync/dll.h
Justine Tunney b5cb71ab84
Use *NSYNC for POSIX threads locking APIs
Condition variables, barriers, and r/w locks now work very well.
2022-09-11 11:04:50 -07:00

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_ */