• Harris Hancock's avatar
    Implement atomic operations for MSVC · d6d06e54
    Harris Hancock authored
    Reads and writes of volatile aligned words are automatically blessed with
    atomic acquire and release semantics at compile-time by MSVC, leaving only
    CPU operation reordering to worry about. x86 and x64 CPUs will not reorder
    the operations, but MSVC targets Xbox, which notably will reorder them,
    thus I added fences out of an abundance of caution. While Cap'n Proto
    likely will not compile for Xbox as-is, I would hate for someone to port
    it only to have to debug obscure atomic-operation-related crashes later.
    
    I implemented the fences using std::atomic_thread_fence rather than
    MemoryBarrier(), because including windows.h in raw-schema.h is a
    non-starter, and it would be silly to reimplement it with in-line assembly
    and intrinsics for every targeted CPU when <atomic> is available.
    
    Another possible implementation could have been to use the InterlockedXxx
    functions, however they present a few issues:
    
    1. They're defined in windows.h. We could define them in terms of their
       underlying _InterlockedXxx intrinsics, but we'd need more #if blocks to
       handle both 32-bit and 64-bit pointers. If we go this route, it'd
       probably be better to go all-in and define some kj::atomic{Load,Store}
       functions.
    2. We cannot implement atomic load-acquire semantics with them for const
       variables without const_casting.
    d6d06e54
Name
Last commit
Last update
..
compat Loading commit data...
compiler Loading commit data...
testdata Loading commit data...
CMakeLists.txt Loading commit data...
any-test.c++ Loading commit data...
any.c++ Loading commit data...
any.h Loading commit data...
arena.c++ Loading commit data...
arena.h Loading commit data...
blob-test.c++ Loading commit data...
blob.c++ Loading commit data...
blob.h Loading commit data...
bootstrap-test.ekam-rule Loading commit data...
c++.capnp Loading commit data...
c++.capnp.c++ Loading commit data...
c++.capnp.h Loading commit data...
canonicalize-test.c++ Loading commit data...
capability-test.c++ Loading commit data...
capability.c++ Loading commit data...
capability.h Loading commit data...
capnpc.ekam-rule Loading commit data...
common-test.c++ Loading commit data...
common.h Loading commit data...
dynamic-capability.c++ Loading commit data...
dynamic-test.c++ Loading commit data...
dynamic.c++ Loading commit data...
dynamic.h Loading commit data...
encoding-test.c++ Loading commit data...
endian-fallback-test.c++ Loading commit data...
endian-reverse-test.c++ Loading commit data...
endian-test.c++ Loading commit data...
endian.h Loading commit data...
ez-rpc-test.c++ Loading commit data...
ez-rpc.c++ Loading commit data...
ez-rpc.h Loading commit data...
fuzz-test.c++ Loading commit data...
generated-header-support.h Loading commit data...
layout-test.c++ Loading commit data...
layout.c++ Loading commit data...
layout.h Loading commit data...
list.c++ Loading commit data...
list.h Loading commit data...
membrane-test.c++ Loading commit data...
membrane.c++ Loading commit data...
membrane.h Loading commit data...
message-test.c++ Loading commit data...
message.c++ Loading commit data...
message.h Loading commit data...
orphan-test.c++ Loading commit data...
orphan.h Loading commit data...
persistent.capnp Loading commit data...
persistent.capnp.c++ Loading commit data...
persistent.capnp.h Loading commit data...
pointer-helpers.h Loading commit data...
pretty-print.h Loading commit data...
raw-schema.h Loading commit data...
rpc-prelude.h Loading commit data...
rpc-test.c++ Loading commit data...
rpc-twoparty-test.c++ Loading commit data...
rpc-twoparty.c++ Loading commit data...
rpc-twoparty.capnp Loading commit data...
rpc-twoparty.capnp.c++ Loading commit data...
rpc-twoparty.capnp.h Loading commit data...
rpc-twoparty.h Loading commit data...
rpc.c++ Loading commit data...
rpc.capnp Loading commit data...
rpc.capnp.c++ Loading commit data...
rpc.capnp.h Loading commit data...
rpc.h Loading commit data...
schema-lite.h Loading commit data...
schema-loader-test.c++ Loading commit data...
schema-loader.c++ Loading commit data...
schema-loader.h Loading commit data...
schema-parser-test.c++ Loading commit data...
schema-parser.c++ Loading commit data...
schema-parser.h Loading commit data...
schema-test.c++ Loading commit data...
schema.c++ Loading commit data...
schema.capnp Loading commit data...
schema.capnp.c++ Loading commit data...
schema.capnp.h Loading commit data...
schema.h Loading commit data...
serialize-async-test.c++ Loading commit data...
serialize-async.c++ Loading commit data...
serialize-async.h Loading commit data...
serialize-packed-test.c++ Loading commit data...
serialize-packed.c++ Loading commit data...
serialize-packed.h Loading commit data...
serialize-test.c++ Loading commit data...
serialize-text-test.c++ Loading commit data...
serialize-text.c++ Loading commit data...
serialize-text.h Loading commit data...
serialize.c++ Loading commit data...
serialize.h Loading commit data...
stringify-test.c++ Loading commit data...
stringify.c++ Loading commit data...
test-import.capnp Loading commit data...
test-import2.capnp Loading commit data...
test-util.c++ Loading commit data...
test-util.h Loading commit data...
test.capnp Loading commit data...