Skip to content

Commit a3e9c03

Browse files
Merge pull request #250 from insertinterestingnamehere/fences
Adjust FEB Fences
2 parents 62f0395 + b16ee48 commit a3e9c03

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

src/feb.c

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,8 @@ static QINLINE void qthread_gotlock_empty_inner(qthread_shepherd_t *shep,
422422
/* op */
423423
if (maddr && (maddr != X->addr)) {
424424
*(aligned_t *)maddr = *(X->addr);
425-
MACHINE_FENCE;
426425
}
426+
MACHINE_FENCE;
427427
/* requeue */
428428
qthread_debug(FEB_DETAILS, "m(%p), maddr(%p), recursive(%u): dQ 1 EFQ (%u releasing tid %u with %u), will fill\n", m, maddr, recursive, qthread_id(), X->waiter->thread_id, *(X->addr));
429429
qt_feb_schedule(X->waiter, shep);
@@ -478,8 +478,8 @@ static QINLINE void qthread_gotlock_fill_inner(qthread_shepherd_t *shep,
478478
/* op */
479479
if (maddr && (maddr != X->addr)) {
480480
*(aligned_t *)maddr = *(X->addr);
481-
MACHINE_FENCE;
482481
}
482+
MACHINE_FENCE;
483483
/* schedule */
484484
qthread_t *waiter = X->waiter;
485485
qthread_debug(FEB_DETAILS, "shep(%u), m(%p), maddr(%p), recursive(%u): dQ one from FFWQ (%u releasing tid %u with %u)\n", shep->shepherd_id, m, maddr, recursive, qthread_id(), waiter->thread_id, *(aligned_t *)maddr);
@@ -517,8 +517,8 @@ static QINLINE void qthread_gotlock_fill_inner(qthread_shepherd_t *shep,
517517
/* op */
518518
if (X->addr && (X->addr != maddr)) {
519519
*(aligned_t *)(X->addr) = *(aligned_t *)maddr;
520-
MACHINE_FENCE;
521520
}
521+
MACHINE_FENCE;
522522
/* schedule */
523523
qthread_t *waiter = X->waiter;
524524
qthread_debug(FEB_DETAILS, "shep(%u), m(%p), maddr(%p), recursive(%u): dQ one from FFQ (%u releasing tid %u with %u)\n", shep->shepherd_id, m, maddr, recursive, qthread_id(), waiter->thread_id, *(aligned_t *)maddr);
@@ -542,8 +542,8 @@ static QINLINE void qthread_gotlock_fill_inner(qthread_shepherd_t *shep,
542542
/* op */
543543
if (X->addr && (X->addr != maddr)) {
544544
*(aligned_t *)(X->addr) = *(aligned_t *)maddr;
545-
MACHINE_FENCE;
546545
}
546+
MACHINE_FENCE;
547547
qthread_debug(FEB_DETAILS, "m(%p), maddr(%p), recursive(%u): dQ 1 EFQ (%u releasing tid %u with %u), will empty\n", m, maddr, recursive, qthread_id(), X->waiter->thread_id, *(aligned_t *)maddr);
548548
qt_feb_schedule(X->waiter, shep);
549549
FREE_ADDRRES(X);
@@ -776,8 +776,9 @@ int API_FUNC qthread_writeF(aligned_t *dest,
776776
#endif /* ifdef LOCK_FREE_FEBS */
777777
/* we have the lock on m, so... */
778778
if (dest && (dest != src)) {
779-
memcpy(dest, src, sizeof(aligned_t));
779+
*(aligned_t *)dest = *(aligned_t *)src;
780780
}
781+
MACHINE_FENCE;
781782
qthread_debug(FEB_BEHAVIOR, "tid %u succeeded on %p=%p\n", (shep->current) ? (shep->current->thread_id) : UINT_MAX, dest, src);
782783
if (m) {
783784
qthread_gotlock_fill(shep, m, alignedaddr);
@@ -877,9 +878,9 @@ int API_FUNC qthread_purge_to(aligned_t *restrict dest,
877878
} /* END CRITICAL SECTION */
878879
qt_hash_unlock(FEBbin);
879880
#endif /* ifdef LOCK_FREE_FEBS */
881+
MACHINE_FENCE;
880882
if (dest && (dest != src)) {
881883
*(aligned_t *)dest = *(aligned_t *)src;
882-
MACHINE_FENCE;
883884
}
884885
if (m) {
885886
qthread_debug(FEB_BEHAVIOR, "dest=%p src=%p (tid=%i): waking waiters\n", dest, src, qthread_id());
@@ -1006,6 +1007,7 @@ int API_FUNC qthread_writeEF(aligned_t *restrict dest,
10061007
atomic_store_explicit(&me->thread_state, QTHREAD_STATE_FEB_BLOCKED, memory_order_relaxed);
10071008
me->rdata->blockedon.addr = m;
10081009
QTHREAD_WAIT_TIMER_START();
1010+
MACHINE_FENCE;
10091011
qthread_back_to_master(me);
10101012
QTHREAD_WAIT_TIMER_STOP(me, febwait);
10111013
#ifdef QTHREAD_USE_EUREKAS
@@ -1015,8 +1017,8 @@ int API_FUNC qthread_writeEF(aligned_t *restrict dest,
10151017
} else {
10161018
if (dest && (dest != src)) {
10171019
*(aligned_t *)dest = *(aligned_t *)src;
1018-
MACHINE_FENCE;
10191020
}
1021+
MACHINE_FENCE;
10201022
qthread_debug(FEB_BEHAVIOR, "dest=%p, src=%p (tid=%i): succeeded! waking waiters...\n", dest, src, me->thread_id);
10211023
qthread_gotlock_fill(me->rdata->shepherd_ptr, m, alignedaddr);
10221024
}
@@ -1083,8 +1085,8 @@ int API_FUNC qthread_writeEF_nb(aligned_t *restrict dest,
10831085
} else {
10841086
if (dest && (dest != src)) {
10851087
*(aligned_t *)dest = *(aligned_t *)src;
1086-
MACHINE_FENCE;
10871088
}
1089+
MACHINE_FENCE;
10881090
qthread_debug(FEB_BEHAVIOR, "tid %u succeeded on %p=%p\n", me->thread_id, dest, src);
10891091
qthread_gotlock_fill(me->rdata->shepherd_ptr, m, alignedaddr);
10901092
}
@@ -1153,8 +1155,8 @@ int API_FUNC qthread_writeFF(aligned_t *restrict dest,
11531155
if (m == NULL) { /* already full! */
11541156
if (dest && (dest != src)) {
11551157
*(aligned_t *)dest = *(aligned_t *)src;
1156-
MACHINE_FENCE;
11571158
}
1159+
MACHINE_FENCE;
11581160
qthread_debug(FEB_BEHAVIOR, "dest=%p, src=%p (tid=%u): non-blocking success!\n", dest, src, me->thread_id);
11591161
} else if (m->full != 1) { /* not full... so we must block */
11601162
QTHREAD_WAIT_TIMER_DECLARATION;
@@ -1171,6 +1173,7 @@ int API_FUNC qthread_writeFF(aligned_t *restrict dest,
11711173
atomic_store_explicit(&me->thread_state, QTHREAD_STATE_FEB_BLOCKED, memory_order_relaxed);
11721174
me->rdata->blockedon.addr = m;
11731175
QTHREAD_WAIT_TIMER_START();
1176+
MACHINE_FENCE;
11741177
qthread_back_to_master(me);
11751178
QTHREAD_WAIT_TIMER_STOP(me, febwait);
11761179
#ifdef QTHREAD_USE_EUREKAS
@@ -1180,8 +1183,8 @@ int API_FUNC qthread_writeFF(aligned_t *restrict dest,
11801183
} else { /* exists AND is empty... weird, but that's life */
11811184
if (dest && (dest != src)) {
11821185
*(aligned_t *)dest = *(aligned_t *)src;
1183-
MACHINE_FENCE;
11841186
}
1187+
MACHINE_FENCE;
11851188
qthread_debug(FEB_BEHAVIOR, "dest=%p, src=%p (tid=%u): succeeded!\n", dest, src, me->thread_id);
11861189
QTHREAD_FASTLOCK_UNLOCK(&m->lock);
11871190
}
@@ -1250,9 +1253,9 @@ int API_FUNC qthread_readFF(aligned_t *restrict dest,
12501253
qthread_debug(FEB_DETAILS, "dest=%p, src=%p (tid=%u): data structure locked or null (m=%p)\n", dest, src, me->thread_id, m);
12511254
/* now m, if it exists, is locked - if m is NULL, then we're done! */
12521255
if (m == NULL) { /* already full! */
1256+
MACHINE_FENCE;
12531257
if (dest && (dest != src)) {
12541258
*(aligned_t *)dest = *(aligned_t *)src;
1255-
MACHINE_FENCE;
12561259
}
12571260
qthread_debug(FEB_BEHAVIOR, "dest=%p, src=%p (tid=%u): non-blocking success!\n", dest, src, me->thread_id);
12581261
} else if (m->full != 1) { /* not full... so we must block */
@@ -1271,15 +1274,16 @@ int API_FUNC qthread_readFF(aligned_t *restrict dest,
12711274
me->rdata->blockedon.addr = m;
12721275
QTHREAD_WAIT_TIMER_START();
12731276
qthread_back_to_master(me);
1277+
MACHINE_FENCE;
12741278
QTHREAD_WAIT_TIMER_STOP(me, febwait);
12751279
#ifdef QTHREAD_USE_EUREKAS
12761280
qt_eureka_check(0);
12771281
#endif /* QTHREAD_USE_EUREKAS */
12781282
qthread_debug(FEB_BEHAVIOR, "dest=%p, src=%p (tid=%u): succeeded after waiting\n", dest, src, me->thread_id);
12791283
} else { /* exists AND is empty... weird, but that's life */
1284+
MACHINE_FENCE;
12801285
if (dest && (dest != src)) {
12811286
*(aligned_t *)dest = *(aligned_t *)src;
1282-
MACHINE_FENCE;
12831287
}
12841288
qthread_debug(FEB_BEHAVIOR, "dest=%p, src=%p (tid=%u): succeeded!\n", dest, src, me->thread_id);
12851289
QTHREAD_FASTLOCK_UNLOCK(&m->lock);
@@ -1337,19 +1341,19 @@ int API_FUNC qthread_readFF_nb(aligned_t *restrict dest,
13371341
qthread_debug(FEB_DETAILS, "data structure locked\n");
13381342
/* now m, if it exists, is locked - if m is NULL, then we're done! */
13391343
if (m == NULL) { /* already full! */
1344+
MACHINE_FENCE;
13401345
if (dest && (dest != src)) {
13411346
*(aligned_t *)dest = *(aligned_t *)src;
1342-
MACHINE_FENCE;
13431347
}
13441348
qthread_debug(FEB_BEHAVIOR, "tid %u succeeded on %p=%p\n", me->thread_id, dest, src);
13451349
} else if (m->full != 1) { /* not full... so we must block */
13461350
qthread_debug(FEB_BEHAVIOR, "tid %u non-blocking fail\n", me->thread_id);
13471351
QTHREAD_FASTLOCK_UNLOCK(&m->lock);
13481352
return QTHREAD_OPFAIL;
13491353
} else { /* exists AND is empty... weird, but that's life */
1354+
MACHINE_FENCE;
13501355
if (dest && (dest != src)) {
13511356
*(aligned_t *)dest = *(aligned_t *)src;
1352-
MACHINE_FENCE;
13531357
}
13541358
qthread_debug(FEB_BEHAVIOR, "tid %u succeeded on %p=%p\n", me->thread_id, dest, src);
13551359
QTHREAD_FASTLOCK_UNLOCK(&m->lock);
@@ -1455,15 +1459,16 @@ int API_FUNC qthread_readFE(aligned_t *restrict dest,
14551459
me->rdata->blockedon.addr = m;
14561460
QTHREAD_WAIT_TIMER_START();
14571461
qthread_back_to_master(me);
1462+
MACHINE_FENCE;
14581463
QTHREAD_WAIT_TIMER_STOP(me, febwait);
14591464
#ifdef QTHREAD_USE_EUREKAS
14601465
qt_eureka_check(0);
14611466
#endif /* QTHREAD_USE_EUREKAS */
14621467
qthread_debug(FEB_BEHAVIOR, "tid %u succeeded on %p=%p after waiting\n", me->thread_id, dest, src);
14631468
} else { /* full, thus IT IS OURS! MUAHAHAHA! */
1469+
MACHINE_FENCE;
14641470
if (dest && (dest != src)) {
14651471
*(aligned_t *)dest = *(aligned_t *)src;
1466-
MACHINE_FENCE;
14671472
}
14681473
qthread_debug(FEB_BEHAVIOR, "tid %u succeeded on %p=%p\n", me->thread_id, dest, src);
14691474
qthread_gotlock_empty(me->rdata->shepherd_ptr, m, (void *)alignedaddr);
@@ -1482,6 +1487,7 @@ int API_FUNC qthread_readXX(aligned_t *restrict dest,
14821487
{ /*{{{ */
14831488
qthread_debug(FEB_CALLS, "dest=%p, src=%p\n", dest, src);
14841489

1490+
MACHINE_FENCE;
14851491
if (dest && (dest != src)) {
14861492
*(aligned_t *)dest = *(aligned_t *)src;
14871493
}
@@ -1556,9 +1562,9 @@ int API_FUNC qthread_readFE_nb(aligned_t *restrict dest,
15561562
QTHREAD_FASTLOCK_UNLOCK(&m->lock);
15571563
return QTHREAD_OPFAIL;
15581564
} else { /* full, thus IT IS OURS! MUAHAHAHA! */
1565+
MACHINE_FENCE;
15591566
if (dest && (dest != src)) {
15601567
*(aligned_t *)dest = *(aligned_t *)src;
1561-
MACHINE_FENCE;
15621568
}
15631569
qthread_debug(FEB_BEHAVIOR, "tid %u succeeded on %p=%p\n", me->thread_id, dest, src);
15641570
qthread_gotlock_empty(me->rdata->shepherd_ptr, m, (void *)alignedaddr);

test/basics/hello_world.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ int main(int argc,
3030
iprintf("%i shepherds...\n", qthread_num_shepherds());
3131
iprintf(" %i threads total\n", qthread_num_workers());
3232

33-
status = qthread_fork(greeter, (void*)123456789, &return_value);
33+
status = qthread_fork(greeter, NULL, &return_value);
3434
assert(status == QTHREAD_SUCCESS);
3535

3636
int ret = qthread_readFF(NULL, &return_value);

0 commit comments

Comments
 (0)