You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix a Clang/LLVM sanitizer warning that scp_asynch_check is written
by both the AIO and main threads, one thread potentially clobbering the
other's value. The "scp_asynch_check = 0" at scp.c:239 is where the
thread sanitizer detects the issue.
"scp_asynch_check = 0" is supposed to cause the main thread to process
I/O updates on the next AIO_CHECK_EVENT code's execution. To preserve
that behavior, AIO_CHECK_EVENT now executes AIO_UPDATE_QUEUE when either
sim_asynch_check decrements below 0 or there is work to be done on the
AIO queue (sim_asynch_queue != QUEUE_HEAD.)
Code refactoring:
- AIO_ILOCK/AIO_IUNLOCK: As documented in sim_defs.h, these two macros
are empty in the lock-free code case. Minor performance improvement.
- AIO_QUEUE_VAL and AIO_QUEUE_SET are inlined static functions and directly
use compiler intrinsics for the lock-free implementation, when available.
- GCC/Clang: Use the __atomic intrinsics. __sync instrinsics have been
deprecated since the C++11 standard's publication. The __sync intrinsics
are still available and provide a fallback if GCC or Clang is really so
old that the __atomic intrinsics are unavailable (insert Wallace Shawn's
iconic "That's totally inconceivable!" here.)
- AIO_QUEUE_VAL: Leverages the processor's read fence when available.
Ensures that sim_asynch_queue's value is consistenly read across cores and
threads in the lock-free implementation for platforms without total store
ordering or strong consistency guarantees (i.e., anything other than Intel
and SPARC.)
- AIO_QUEUE_SET: Compare-exchange to set sim_asynch_queue's head. The return
value is a boolean (1/0) to reflect the success (1) or failure (0) of the
compare-exchange.
- AIO_CHECK_EVENT invokes AIO_ILOCK and AIO_IUNLOCK so that the lock-based
code cannot alter sim_asynch_queue when checking to see if there is pending
I/O work to be done. sim_asynch_lock is a recursive mutex in the lock-based
case, so AIO_ILOCK/AIO_IUNLOCK will succeed for the lock-based
implementation.
- New builder script flag to disable AIO lock-free, force AIO lock-based code:
- cmake-builder.ps1 -noaiointrinsics ...
- cmake-builder.sh -no-aio-intrinics ...
0 commit comments