Skip to content

Commit

Permalink
Use 32-bit atomic for uaflgs in thread specific events
Browse files Browse the repository at this point in the history
  • Loading branch information
rickard-green committed Dec 16, 2010
1 parent dc122c3 commit 5525174
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 24 deletions.
6 changes: 3 additions & 3 deletions erts/emulator/beam/erl_process_lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ transfer_locks(Process *p,
do {
erts_tse_t *tmp = wake;
wake = wake->next;
erts_atomic_set(&tmp->uaflgs, 0);
erts_atomic32_set(&tmp->uaflgs, 0);
erts_tse_set(tmp);
} while (wake);

Expand Down Expand Up @@ -509,14 +509,14 @@ wait_for_locks(Process *p,

ASSERT((wtr->uflgs & ~ERTS_PROC_LOCKS_ALL) == 0);

erts_atomic_set(&wtr->uaflgs, 1);
erts_atomic32_set(&wtr->uaflgs, 1);
erts_pix_unlock(pix_lock);

while (1) {
int res;
erts_tse_reset(wtr);

if (erts_atomic_read(&wtr->uaflgs) == 0)
if (erts_atomic32_read(&wtr->uaflgs) == 0)
break;

/*
Expand Down
2 changes: 1 addition & 1 deletion erts/include/internal/ethread.h
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ struct ethr_ts_event_ {
ethr_ts_event *prev;
ethr_event event;
void *udata;
ethr_atomic_t uaflgs;
ethr_atomic32_t uaflgs;
unsigned uflgs;
unsigned iflgs; /* for ethr lib only */
short rgix; /* for ethr lib only */
Expand Down
4 changes: 2 additions & 2 deletions erts/lib_src/common/ethr_aux.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,10 +285,10 @@ static ethr_ts_event *ts_event_pool(int size, ethr_ts_event **endpp)
+ ETHR_CACHE_LINE_SIZE));
for (i = 1; i < size; i++) {
atsev[i-1].ts_ev.next = &atsev[i].ts_ev;
ethr_atomic_init(&atsev[i-1].ts_ev.uaflgs, 0);
ethr_atomic32_init(&atsev[i-1].ts_ev.uaflgs, 0);
atsev[i-1].ts_ev.iflgs = 0;
}
ethr_atomic_init(&atsev[size-1].ts_ev.uaflgs, 0);
ethr_atomic32_init(&atsev[size-1].ts_ev.uaflgs, 0);
atsev[size-1].ts_ev.iflgs = 0;
atsev[size-1].ts_ev.next = NULL;
if (endpp)
Expand Down
36 changes: 18 additions & 18 deletions erts/lib_src/common/ethr_mutex.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ event_wait(struct ethr_mutex_base_ *mtxb,
/* Need to enqueue and wait... */

tse->uflgs = type;
ethr_atomic_set(&tse->uaflgs, type);
ethr_atomic32_set(&tse->uaflgs, type);

ETHR_MTX_Q_LOCK(&mtxb->qlck);
locked = 1;
Expand Down Expand Up @@ -560,15 +560,15 @@ event_wait(struct ethr_mutex_base_ *mtxb,
while (1) {
ethr_event_reset(&tse->event);

act = ethr_atomic_read_acqb(&tse->uaflgs);
act = ethr_atomic32_read_acqb(&tse->uaflgs);
if (!act)
goto done; /* Got it */

ETHR_ASSERT(act == type);
ethr_event_swait(&tse->event, spincount);
/* swait result: 0 || EINTR */

act = ethr_atomic_read_acqb(&tse->uaflgs);
act = ethr_atomic32_read_acqb(&tse->uaflgs);
if (!act)
goto done; /* Got it */
}
Expand All @@ -588,7 +588,7 @@ wake_writer(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
dequeue(&mtxb->q, tse, tse);

ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs) == ETHR_RWMTX_W_WAIT_FLG__);
ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs) == ETHR_RWMTX_W_WAIT_FLG__);
#ifdef ETHR_MTX_HARD_DEBUG_WSQ
mtxb->ws--;
#endif
Expand All @@ -598,7 +598,7 @@ wake_writer(struct ethr_mutex_base_ *mtxb, int is_rwmtx)

ETHR_MTX_Q_UNLOCK(&mtxb->qlck);

ethr_atomic_set(&tse->uaflgs, 0);
ethr_atomic32_set(&tse->uaflgs, 0);
ethr_event_set(&tse->event);
}

Expand Down Expand Up @@ -973,7 +973,7 @@ enqueue_mtx(ethr_mutex *mtx, ethr_ts_event *tse_start, ethr_ts_event *tse_end)
ETHR_MTX_HARD_DEBUG_CHK_Q(mtx);
ETHR_MTX_Q_UNLOCK(&mtx->mtxb.qlck);

ethr_atomic_set(&tse_start->uaflgs, 0);
ethr_atomic32_set(&tse_start->uaflgs, 0);
ethr_event_set(&tse_start->event);
}
break;
Expand Down Expand Up @@ -1064,9 +1064,9 @@ ethr_cond_signal(ethr_cond *cnd)

ETHR_MTX_HARD_DEBUG_FENCE_CHK(mtx);
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs) == ETHR_CND_WAIT_FLG__);
ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs) == ETHR_CND_WAIT_FLG__);

ethr_atomic_set(&tse->uaflgs, ETHR_RWMTX_W_WAIT_FLG__);
ethr_atomic32_set(&tse->uaflgs, ETHR_RWMTX_W_WAIT_FLG__);

dequeue(&cnd->q, tse, tse);

Expand Down Expand Up @@ -1117,11 +1117,11 @@ ethr_cond_broadcast(ethr_cond *cnd)
/* The normal case */

ETHR_ASSERT(tse_tmp->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
ETHR_ASSERT(ethr_atomic_read(&tse_tmp->uaflgs)
ETHR_ASSERT(ethr_atomic32_read(&tse_tmp->uaflgs)
== ETHR_CND_WAIT_FLG__);

ethr_atomic_set(&tse_tmp->uaflgs,
ETHR_RWMTX_W_WAIT_FLG__);
ethr_atomic32_set(&tse_tmp->uaflgs,
ETHR_RWMTX_W_WAIT_FLG__);
}
else {
/* Should be very unusual */
Expand Down Expand Up @@ -1174,7 +1174,7 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
tse->udata = (void *) mtx;

tse->uflgs = ETHR_RWMTX_W_WAIT_FLG__; /* Prep for mutex lock op */
ethr_atomic_set(&tse->uaflgs, ETHR_CND_WAIT_FLG__);
ethr_atomic32_set(&tse->uaflgs, ETHR_CND_WAIT_FLG__);

ETHR_MTX_Q_LOCK(&cnd->qlck);

Expand All @@ -1191,7 +1191,7 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)

ethr_event_reset(&tse->event);

act = ethr_atomic_read_acqb(&tse->uaflgs);
act = ethr_atomic32_read_acqb(&tse->uaflgs);
if (!act)
break; /* Mtx locked */

Expand All @@ -1207,7 +1207,7 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
*/
if (act == ETHR_CND_WAIT_FLG__) {
ETHR_MTX_Q_LOCK(&cnd->qlck);
act = ethr_atomic_read(&tse->uaflgs);
act = ethr_atomic32_read(&tse->uaflgs);
ETHR_ASSERT(act == ETHR_CND_WAIT_FLG__
|| act == ETHR_RWMTX_W_WAIT_FLG__);
/*
Expand Down Expand Up @@ -1409,7 +1409,7 @@ wake_readers(ethr_rwmutex *rwmtx, int rs)
rwmtx->rq_end = NULL;

ETHR_ASSERT(!rwmtx->mtxb.q
|| (ethr_atomic_read(&rwmtx->mtxb.q->uaflgs)
|| (ethr_atomic32_read(&rwmtx->mtxb.q->uaflgs)
== ETHR_RWMTX_W_WAIT_FLG__));

ETHR_RWMTX_HARD_DEBUG_CHK_Q(rwmtx);
Expand All @@ -1420,15 +1420,15 @@ wake_readers(ethr_rwmutex *rwmtx, int rs)

#ifdef ETHR_DEBUG
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_R_WAIT_FLG__);
ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs)
ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs)
== ETHR_RWMTX_R_WAIT_FLG__);
drs++;
#endif

tse_next = tse->next; /* we aren't allowed to read tse->next
after we have reset uaflgs */

ethr_atomic_set(&tse->uaflgs, 0);
ethr_atomic32_set(&tse->uaflgs, 0);
ethr_event_set(&tse->event);
tse = tse_next;
}
Expand Down Expand Up @@ -2812,7 +2812,7 @@ hard_debug_chk_q__(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
ETHR_MTX_HARD_ASSERT(tse->next->prev == tse);
ETHR_MTX_HARD_ASSERT(tse->prev->next == tse);

type = ethr_atomic_read(&tse->uaflgs);
type = ethr_atomic32_read(&tse->uaflgs);
ETHR_MTX_HARD_ASSERT(type == tse->uflgs);
switch (type) {
case ETHR_RWMTX_W_WAIT_FLG__:
Expand Down

0 comments on commit 5525174

Please sign in to comment.