Conversation
There was a problem hiding this comment.
Pull request overview
This PR updates the DATUM protocol job tracking flags so they can be updated without acquiring a write lock, by switching the relevant fields to C11/C23 atomics.
Changes:
- Convert
server_has_merkle_branches,server_has_coinbase[*], andserver_has_coinbase_emptyfrombooltoatomic_bool. - Replace rwlock “upgrade-to-write” sections in
datum_protocol_pow()withatomic_store_explicit(..., memory_order_relaxed). - Remove initialization/reset under
datum_jobs_rwlockfor these flags (since they’re now atomic).
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| src/datum_protocol.h | Switch selected T_DATUM_PROTOCOL_JOB flags to atomic_bool and include <stdatomic.h>. |
| src/datum_protocol.c | Remove rwlock write-lock upgrades when toggling job flags; use relaxed atomic stores instead; reset flags without rwlock. |
Comments suppressed due to low confidence (3)
src/datum_protocol.c:1385
- This relaxed atomic store is good, but the corresponding read (
if (!datum_jobs[...].server_has_coinbase_empty)) will be an implicitseq_cstload. Consider usingatomic_load_explicit(..., memory_order_relaxed)for that check to avoid stronger-than-needed ordering and extra barriers.
atomic_store_explicit(&datum_jobs[pow->datum_job_id].server_has_coinbase_empty, true, memory_order_relaxed);
}
src/datum_protocol.c:1398
- The store uses
memory_order_relaxed, but the guard condition uses an implicitseq_cstload on theatomic_bool. Consider changing the check toatomic_load_explicit(..., memory_order_relaxed)so the load/store pair uses consistent relaxed semantics and avoids unnecessary ordering costs.
atomic_store_explicit(&datum_jobs[pow->datum_job_id].server_has_coinbase[pow->coinbase_id], true, memory_order_relaxed);
}
src/datum_protocol.c:1456
- These assignments are now writing to
atomic_boolfields, which makes them implicitseq_cststores. If these flags are intended to be relaxed (as in theatomic_store_explicit(..., memory_order_relaxed)updates), consider initializing/resetting them withatomic_store_explicit(..., false, memory_order_relaxed)for consistency and to avoid stronger-than-needed barriers.
for(i=0;i<MAX_DATUM_PROTOCOL_JOBS;i++) {
datum_jobs[i].server_has_merkle_branches = false;
datum_jobs[i].server_has_coinbase_empty = false;
for(n=0;n<8;n++) {
datum_jobs[i].server_has_coinbase[n] = false;
}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (2)
src/datum_protocol.c:1374
atomic_load_explicitrequires the address of the atomic object; this call is missing&and will not compile. Useatomic_load_explicit(&datum_jobs[pow->datum_job_id].server_has_coinbase_empty, …).
if (!atomic_load_explicit(datum_jobs[pow->datum_job_id].server_has_coinbase_empty, memory_order_relaxed)) {
src/datum_protocol.c:1387
atomic_load_explicitshould be passed a pointer to the atomic element; this call is missing&onserver_has_coinbase[pow->coinbase_id]and will fail to compile.
if (!atomic_load_explicit(datum_jobs[pow->datum_job_id].server_has_coinbase[pow->coinbase_id], memory_order_relaxed)) {
| atomic_bool server_has_merkle_branches; | ||
|
|
||
| bool server_has_coinbase[8]; | ||
| bool server_has_coinbase_empty; | ||
| bool server_has_short_txnlist; | ||
|
|
||
| bool server_has_validated_block; | ||
| atomic_bool server_has_coinbase[8]; | ||
| atomic_bool server_has_coinbase_empty; | ||
| } T_DATUM_PROTOCOL_JOB; |
| } | ||
|
|
||
| if (!datum_jobs[pow->datum_job_id].server_has_merkle_branches) { | ||
| if (!atomic_load_explicit(&datum_jobs[pow->datum_job_id].server_has_merkle_branches, memory_order_relaxed)) { |
| pthread_rwlock_wrlock(&datum_jobs_rwlock); | ||
| w = true; | ||
| datum_jobs[pow->datum_job_id].server_has_merkle_branches = true; | ||
| atomic_store_explicit(&datum_jobs[pow->datum_job_id].server_has_merkle_branches, true, memory_order_relaxed); |
|
|
||
| if (pow->subsidy_only) { | ||
| if (!datum_jobs[pow->datum_job_id].server_has_coinbase_empty) { | ||
| if (!atomic_load_explicit(&datum_jobs[pow->datum_job_id].server_has_coinbase_empty, memory_order_relaxed)) { |
| atomic_store_explicit(&datum_jobs[pow->datum_job_id].server_has_coinbase_empty, true, memory_order_relaxed); | ||
| } | ||
| } else { | ||
| if (!datum_jobs[pow->datum_job_id].server_has_coinbase[pow->coinbase_id]) { | ||
| if (!atomic_load_explicit(&datum_jobs[pow->datum_job_id].server_has_coinbase[pow->coinbase_id], memory_order_relaxed)) { |
| } | ||
|
|
||
| datum_jobs[pow->datum_job_id].server_has_coinbase[pow->coinbase_id] = true; | ||
| atomic_store_explicit(&datum_jobs[pow->datum_job_id].server_has_coinbase[pow->coinbase_id], true, memory_order_relaxed); |
| for(i=0;i<MAX_DATUM_PROTOCOL_JOBS;i++) { | ||
| datum_jobs[i].server_has_merkle_branches = false; | ||
| datum_jobs[i].server_has_coinbase_empty = false; | ||
| datum_jobs[i].server_has_short_txnlist = false; | ||
| datum_jobs[i].server_has_validated_block = false; | ||
| atomic_store_explicit(&datum_jobs[i].server_has_merkle_branches, false, memory_order_relaxed); | ||
| atomic_store_explicit(&datum_jobs[i].server_has_coinbase_empty, false, memory_order_relaxed); | ||
| for(n=0;n<8;n++) { | ||
| datum_jobs[i].server_has_coinbase[n] = false; | ||
| atomic_store_explicit(&datum_jobs[i].server_has_coinbase[n], false, memory_order_relaxed); | ||
| } | ||
| } |
| datum_jobs[i].server_has_coinbase_empty = false; | ||
| datum_jobs[i].server_has_short_txnlist = false; | ||
| datum_jobs[i].server_has_validated_block = false; | ||
| atomic_store_explicit(&datum_jobs[i].server_has_merkle_branches, false, memory_order_relaxed); |
There was a problem hiding this comment.
Dropping this loop's wrlock races the non-atomic memset still done under wrlock in datum_protocol_setup_new_job_idx. keep the lock.
No description provided.