diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2018-08-15 10:51:24 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2018-09-24 15:55:35 -0700 |
| commit | b4877edd6750edc12aa2db1953a6551843bfa4b4 (patch) | |
| tree | 52362638c13b0d040828d3a72ccad38e9f7ad522 /src/libcore/sync | |
| parent | e5c6575801028f5e089ef2e7720aa1af9d452334 (diff) | |
| download | rust-b4877edd6750edc12aa2db1953a6551843bfa4b4.tar.gz rust-b4877edd6750edc12aa2db1953a6551843bfa4b4.zip | |
std: Start implementing wasm32 atomics
This commit is an initial start at implementing the standard library for wasm32-unknown-unknown with the experimental `atomics` feature enabled. None of these changes will be visible to users of the wasm32-unknown-unknown target because they all require recompiling the standard library. The hope with this is that we can get this support into the standard library and start iterating on it in-tree to enable experimentation. Currently there's a few components in this PR: * Atomic fences are disabled on wasm as there's no corresponding atomic op and it's not clear yet what the convention should be, but this will change in the future! * Implementations of `Mutex`, `Condvar`, and `RwLock` were all added based on the atomic intrinsics that wasm has. * The `ReentrantMutex` and thread-local-storage implementations panic currently as there's no great way to get a handle on the current thread's "id" yet. Right now the wasm32 target with atomics is unfortunately pretty unusable, requiring a lot of manual things here and there to actually get it operational. This will likely continue to evolve as the story for atomics and wasm unfolds, but we also need more LLVM support for some operations like custom `global` directives for this to work best.
Diffstat (limited to 'src/libcore/sync')
| -rw-r--r-- | src/libcore/sync/atomic.rs | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs index 69c524925fc..f130dbfb0e3 100644 --- a/src/libcore/sync/atomic.rs +++ b/src/libcore/sync/atomic.rs @@ -2251,7 +2251,15 @@ unsafe fn atomic_umin<T>(dst: *mut T, val: T, order: Ordering) -> T { /// [`Relaxed`]: enum.Ordering.html#variant.Relaxed #[inline] #[stable(feature = "rust1", since = "1.0.0")] +#[cfg_attr(target_arch = "wasm32", allow(unused_variables))] pub fn fence(order: Ordering) { + // On wasm32 it looks like fences aren't implemented in LLVM yet in that + // they will cause LLVM to abort. The wasm instruction set doesn't have + // fences right now. There's discussion online about the best way for tools + // to conventionally implement fences at + // https://github.com/WebAssembly/tool-conventions/issues/59. We should + // follow that discussion and implement a solution when one comes about! + #[cfg(not(target_arch = "wasm32"))] unsafe { match order { Acquire => intrinsics::atomic_fence_acq(), |
