Skip to content

Commit 0cb2510

Browse files
committed
no need for XCHGL, MOVL is enough?
1 parent 1291568 commit 0cb2510

2 files changed

Lines changed: 8 additions & 6 deletions

File tree

Python/gc.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,9 +1400,10 @@ static void
14001400
add_stats(GCState *gcstate, int gen, struct gc_generation_stats *stats)
14011401
{
14021402
struct gc_stats *generation_stats = gcstate->generation_stats;
1403-
uint32_t seq = _Py_atomic_load_uint32(&generation_stats->update_seq);
1403+
uint32_t seq = _Py_atomic_load_uint32_relaxed(&generation_stats->update_seq);
14041404
assert((seq & 1) == 0);
1405-
_Py_atomic_store_uint32(&generation_stats->update_seq, seq + 1);
1405+
/* Odd seq tells the reader that an update is in progress. */
1406+
_Py_atomic_store_uint32_relaxed(&generation_stats->update_seq, seq + 1);
14061407
_Py_atomic_fence_seq_cst();
14071408

14081409
struct gc_generation_stats *prev_stats = gc_get_prev_stats(gcstate, gen);
@@ -1419,7 +1420,7 @@ add_stats(GCState *gcstate, int gen, struct gc_generation_stats *stats)
14191420
cur_stats->duration += stats->duration;
14201421
cur_stats->heap_size = stats->heap_size;
14211422
cur_stats->ts_stop = stats->ts_stop;
1422-
_Py_atomic_store_uint32(&generation_stats->update_seq, seq + 2);
1423+
_Py_atomic_store_uint32_release(&generation_stats->update_seq, seq + 2);
14231424
}
14241425

14251426
/* This is the main function. Read this to understand how the

Python/gc_free_threading.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,9 +2284,10 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
22842284
/* Update stats. */
22852285
PyMutex_Lock(&gcstate->stats_mutex);
22862286
struct gc_stats *generation_stats = gcstate->generation_stats;
2287-
uint32_t seq = _Py_atomic_load_uint32(&generation_stats->update_seq);
2287+
uint32_t seq = _Py_atomic_load_uint32_relaxed(&generation_stats->update_seq);
22882288
assert((seq & 1) == 0);
2289-
_Py_atomic_store_uint32(&generation_stats->update_seq, seq + 1);
2289+
/* Odd seq tells the reader that an update is in progress. */
2290+
_Py_atomic_store_uint32_relaxed(&generation_stats->update_seq, seq + 1);
22902291
_Py_atomic_fence_seq_cst();
22912292
struct gc_generation_stats *stats = get_stats(gcstate, generation);
22922293
stats->ts_start = start;
@@ -2296,7 +2297,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
22962297
stats->uncollectable += n;
22972298
stats->duration += duration;
22982299
stats->candidates += state.candidates;
2299-
_Py_atomic_store_uint32(&generation_stats->update_seq, seq + 2);
2300+
_Py_atomic_store_uint32_release(&generation_stats->update_seq, seq + 2);
23002301
PyMutex_Unlock(&gcstate->stats_mutex);
23012302

23022303
GC_STAT_ADD(generation, objects_collected, m);

0 commit comments

Comments
 (0)