upimutex
struct upimutex;
typedef struct upimutex upimutex_t;
struct upimutex;
struct upimutex *t_upimutex; /* list of upimutexes owned by thread */
if (upimutex == NULL || upimutex->upi_owner != curthread) {
upimutex_unlock((upimutex_t *)upimutex, flag);
struct upimutex *upip;
volatile struct upimutex *upimutex = NULL;
upimutex_unlock((upimutex_t *)upimutex, 0);
upimutex = upi_get(upibp, &lwpchan);
if (upimutex == NULL || upimutex->upi_owner != curthread) {
upimutex_unlock((upimutex_t *)upimutex, flag);
static struct upimutex *
struct upimutex *upip;
upi_chain_add(upib_t *upibp, struct upimutex *upimutex)
upimutex->upi_nextchain = upibp->upib_first;
upibp->upib_first = upimutex;
upi_chain_del(upib_t *upibp, struct upimutex *upimutex)
struct upimutex **prev;
while (*prev != upimutex) {
*prev = upimutex->upi_nextchain;
upimutex->upi_nextchain = NULL;
upi_mylist_add(struct upimutex *upimutex)
upimutex->upi_nextowned = t->t_upimutex;
t->t_upimutex = upimutex;
upi_mylist_del(struct upimutex *upimutex)
struct upimutex **prev;
while (*prev != upimutex) {
*prev = upimutex->upi_nextowned;
upimutex->upi_nextowned = NULL;
static struct upimutex *
struct upimutex *upimutex;
upimutex = upi_get(upibp, &lwpchan);
if (upimutex == NULL || upimutex->upi_owner != curthread) {
return (upimutex);
upimutex_unlock(struct upimutex *upimutex, uint16_t flag)
upi_mylist_del(upimutex);
upibp = upimutex->upi_upibp;
if (upimutex->upi_waiter != 0) { /* if waiters */
ts = turnstile_lookup(upimutex);
upimutex->upi_owner = newowner;
upimutex->upi_waiter = 0;
turnstile_exit(upimutex);
upi_chain_del(upimutex->upi_upibp, upimutex);
kmem_free(upimutex, sizeof (upimutex_t));
volatile struct upimutex *upimutex = NULL;
upimutex_unlock((upimutex_t *)upimutex, 0);
upimutex = upi_get(upibp, &lwpchan);
if (upimutex == NULL) {
upimutex = kmem_zalloc(sizeof (upimutex_t), KM_SLEEP);
upi_chain_add(upibp, (upimutex_t *)upimutex);
upimutex->upi_owner = curthread; /* grab lock */
upimutex->upi_upibp = upibp;
upimutex->upi_vaddr = lp;
upimutex->upi_lwpchan = lwpchan;
nupinest = upi_mylist_add((upimutex_t *)upimutex);
upimutex_unlock((upimutex_t *)upimutex, flag);
upimutex_unlock((upimutex_t *)upimutex, flag);
ASSERT(upimutex->upi_owner != NULL);
if (upimutex->upi_owner == curthread) {
ts = turnstile_lookup((upimutex_t *)upimutex);
upimutex->upi_waiter = 1;
error = turnstile_block(ts, TS_WRITER_Q, (upimutex_t *)upimutex,
(upimutex = lwp_upimutex_owned(lp, type))) {
(void) upi_mylist_add((upimutex_t *)upimutex);
upimutex_unlock((upimutex_t *)upimutex, 0);
(error == EDEADLK && !upi_owned((upimutex_t *)upimutex)));
ASSERT(lwp_upimutex_owned(lp, type) == upimutex);
nupinest = upi_mylist_add((upimutex_t *)upimutex);
upimutex_unlock((upimutex_t *)upimutex, flag);
volatile struct upimutex *upimutex = NULL;
upimutex_unlock((upimutex_t *)upimutex, 0);
upimutex = upi_get(upibp, &lwpchan);