Skip to content

Commit 5525174

Browse files
committed
Use 32-bit atomic for uaflgs in thread specific events
1 parent dc122c3 commit 5525174

File tree

4 files changed

+24
-24
lines changed

4 files changed

+24
-24
lines changed

erts/emulator/beam/erl_process_lock.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ transfer_locks(Process *p,
413413
do {
414414
erts_tse_t *tmp = wake;
415415
wake = wake->next;
416-
erts_atomic_set(&tmp->uaflgs, 0);
416+
erts_atomic32_set(&tmp->uaflgs, 0);
417417
erts_tse_set(tmp);
418418
} while (wake);
419419

@@ -509,14 +509,14 @@ wait_for_locks(Process *p,
509509

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

512-
erts_atomic_set(&wtr->uaflgs, 1);
512+
erts_atomic32_set(&wtr->uaflgs, 1);
513513
erts_pix_unlock(pix_lock);
514514

515515
while (1) {
516516
int res;
517517
erts_tse_reset(wtr);
518518

519-
if (erts_atomic_read(&wtr->uaflgs) == 0)
519+
if (erts_atomic32_read(&wtr->uaflgs) == 0)
520520
break;
521521

522522
/*

erts/include/internal/ethread.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ struct ethr_ts_event_ {
565565
ethr_ts_event *prev;
566566
ethr_event event;
567567
void *udata;
568-
ethr_atomic_t uaflgs;
568+
ethr_atomic32_t uaflgs;
569569
unsigned uflgs;
570570
unsigned iflgs; /* for ethr lib only */
571571
short rgix; /* for ethr lib only */

erts/lib_src/common/ethr_aux.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,10 @@ static ethr_ts_event *ts_event_pool(int size, ethr_ts_event **endpp)
285285
+ ETHR_CACHE_LINE_SIZE));
286286
for (i = 1; i < size; i++) {
287287
atsev[i-1].ts_ev.next = &atsev[i].ts_ev;
288-
ethr_atomic_init(&atsev[i-1].ts_ev.uaflgs, 0);
288+
ethr_atomic32_init(&atsev[i-1].ts_ev.uaflgs, 0);
289289
atsev[i-1].ts_ev.iflgs = 0;
290290
}
291-
ethr_atomic_init(&atsev[size-1].ts_ev.uaflgs, 0);
291+
ethr_atomic32_init(&atsev[size-1].ts_ev.uaflgs, 0);
292292
atsev[size-1].ts_ev.iflgs = 0;
293293
atsev[size-1].ts_ev.next = NULL;
294294
if (endpp)

erts/lib_src/common/ethr_mutex.c

+18-18
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ event_wait(struct ethr_mutex_base_ *mtxb,
415415
/* Need to enqueue and wait... */
416416

417417
tse->uflgs = type;
418-
ethr_atomic_set(&tse->uaflgs, type);
418+
ethr_atomic32_set(&tse->uaflgs, type);
419419

420420
ETHR_MTX_Q_LOCK(&mtxb->qlck);
421421
locked = 1;
@@ -560,15 +560,15 @@ event_wait(struct ethr_mutex_base_ *mtxb,
560560
while (1) {
561561
ethr_event_reset(&tse->event);
562562

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

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

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

590590
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
591-
ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs) == ETHR_RWMTX_W_WAIT_FLG__);
591+
ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs) == ETHR_RWMTX_W_WAIT_FLG__);
592592
#ifdef ETHR_MTX_HARD_DEBUG_WSQ
593593
mtxb->ws--;
594594
#endif
@@ -598,7 +598,7 @@ wake_writer(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
598598

599599
ETHR_MTX_Q_UNLOCK(&mtxb->qlck);
600600

601-
ethr_atomic_set(&tse->uaflgs, 0);
601+
ethr_atomic32_set(&tse->uaflgs, 0);
602602
ethr_event_set(&tse->event);
603603
}
604604

@@ -973,7 +973,7 @@ enqueue_mtx(ethr_mutex *mtx, ethr_ts_event *tse_start, ethr_ts_event *tse_end)
973973
ETHR_MTX_HARD_DEBUG_CHK_Q(mtx);
974974
ETHR_MTX_Q_UNLOCK(&mtx->mtxb.qlck);
975975

976-
ethr_atomic_set(&tse_start->uaflgs, 0);
976+
ethr_atomic32_set(&tse_start->uaflgs, 0);
977977
ethr_event_set(&tse_start->event);
978978
}
979979
break;
@@ -1064,9 +1064,9 @@ ethr_cond_signal(ethr_cond *cnd)
10641064

10651065
ETHR_MTX_HARD_DEBUG_FENCE_CHK(mtx);
10661066
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
1067-
ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs) == ETHR_CND_WAIT_FLG__);
1067+
ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs) == ETHR_CND_WAIT_FLG__);
10681068

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

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

@@ -1117,11 +1117,11 @@ ethr_cond_broadcast(ethr_cond *cnd)
11171117
/* The normal case */
11181118

11191119
ETHR_ASSERT(tse_tmp->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
1120-
ETHR_ASSERT(ethr_atomic_read(&tse_tmp->uaflgs)
1120+
ETHR_ASSERT(ethr_atomic32_read(&tse_tmp->uaflgs)
11211121
== ETHR_CND_WAIT_FLG__);
11221122

1123-
ethr_atomic_set(&tse_tmp->uaflgs,
1124-
ETHR_RWMTX_W_WAIT_FLG__);
1123+
ethr_atomic32_set(&tse_tmp->uaflgs,
1124+
ETHR_RWMTX_W_WAIT_FLG__);
11251125
}
11261126
else {
11271127
/* Should be very unusual */
@@ -1174,7 +1174,7 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
11741174
tse->udata = (void *) mtx;
11751175

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

11791179
ETHR_MTX_Q_LOCK(&cnd->qlck);
11801180

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

11921192
ethr_event_reset(&tse->event);
11931193

1194-
act = ethr_atomic_read_acqb(&tse->uaflgs);
1194+
act = ethr_atomic32_read_acqb(&tse->uaflgs);
11951195
if (!act)
11961196
break; /* Mtx locked */
11971197

@@ -1207,7 +1207,7 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
12071207
*/
12081208
if (act == ETHR_CND_WAIT_FLG__) {
12091209
ETHR_MTX_Q_LOCK(&cnd->qlck);
1210-
act = ethr_atomic_read(&tse->uaflgs);
1210+
act = ethr_atomic32_read(&tse->uaflgs);
12111211
ETHR_ASSERT(act == ETHR_CND_WAIT_FLG__
12121212
|| act == ETHR_RWMTX_W_WAIT_FLG__);
12131213
/*
@@ -1409,7 +1409,7 @@ wake_readers(ethr_rwmutex *rwmtx, int rs)
14091409
rwmtx->rq_end = NULL;
14101410

14111411
ETHR_ASSERT(!rwmtx->mtxb.q
1412-
|| (ethr_atomic_read(&rwmtx->mtxb.q->uaflgs)
1412+
|| (ethr_atomic32_read(&rwmtx->mtxb.q->uaflgs)
14131413
== ETHR_RWMTX_W_WAIT_FLG__));
14141414

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

14211421
#ifdef ETHR_DEBUG
14221422
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_R_WAIT_FLG__);
1423-
ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs)
1423+
ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs)
14241424
== ETHR_RWMTX_R_WAIT_FLG__);
14251425
drs++;
14261426
#endif
14271427

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

1431-
ethr_atomic_set(&tse->uaflgs, 0);
1431+
ethr_atomic32_set(&tse->uaflgs, 0);
14321432
ethr_event_set(&tse->event);
14331433
tse = tse_next;
14341434
}
@@ -2812,7 +2812,7 @@ hard_debug_chk_q__(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
28122812
ETHR_MTX_HARD_ASSERT(tse->next->prev == tse);
28132813
ETHR_MTX_HARD_ASSERT(tse->prev->next == tse);
28142814

2815-
type = ethr_atomic_read(&tse->uaflgs);
2815+
type = ethr_atomic32_read(&tse->uaflgs);
28162816
ETHR_MTX_HARD_ASSERT(type == tse->uflgs);
28172817
switch (type) {
28182818
case ETHR_RWMTX_W_WAIT_FLG__:

0 commit comments

Comments
 (0)