mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-25 12:00:31 +00:00
Use *NSYNC for POSIX threads locking APIs
Condition variables, barriers, and r/w locks now work very well.
This commit is contained in:
parent
3de35e196c
commit
b5cb71ab84
197 changed files with 3734 additions and 3817 deletions
69
third_party/nsync/dll.h
vendored
Normal file
69
third_party/nsync/dll.h
vendored
Normal file
|
@ -0,0 +1,69 @@
|
|||
#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_ */
|
Loading…
Add table
Add a link
Reference in a new issue