Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generic atomic v2 #1477

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions text/0000-generic-atomic.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
- Feature Name:
- Start Date: 2016-01-22
- RFC PR: (leave this empty)
- Rust Issue: (leave this empty)

# Summary
[summary]: #summary

Add compiler support for generic atomic operations.

# Motivation
[motivation]: #motivation

It is sometimes necessary or useful to use atomic operations in a generic
context.

```rust
Atomic<T>
```

where `T` is any type. This is currently possible but fails to compile if `T` is
too large for the native atomic operations of the target architecture.

# Detailed design
[design]: #detailed-design

The behavior of each of the atomic intrinsics in appendix A is changed as
follows: When a call to one of the atomic intrinsics cannot be translated to a
native operation, it is translated to an unspecified but valid instruction. If
it is executed, the behavior is undefined at runtime.

One intrinsic is added:

```rust
fn has_native_atomic_ops<T>() -> bool;
```

This intrinsic returns `false` iff a call to one of the aforementioned atomic
operations cannot be translated to a native operation.

# Drawbacks
[drawbacks]: #drawbacks

None.

# Alternatives
[alternatives]: #alternatives

None.

# Unresolved questions
[unresolved]: #unresolved-questions

None.

# Appendix A

```rust
fn atomic_cxchg<T>(dst: *mut T, old: T, src: T) -> T;
fn atomic_cxchg_acq<T>(dst: *mut T, old: T, src: T) -> T;
fn atomic_cxchg_rel<T>(dst: *mut T, old: T, src: T) -> T;
fn atomic_cxchg_acqrel<T>(dst: *mut T, old: T, src: T) -> T;
fn atomic_cxchg_relaxed<T>(dst: *mut T, old: T, src: T) -> T;

fn atomic_load<T>(src: *const T) -> T;
fn atomic_load_acq<T>(src: *const T) -> T;
fn atomic_load_relaxed<T>(src: *const T) -> T;
fn atomic_load_unordered<T>(src: *const T) -> T;

fn atomic_store<T>(dst: *mut T, val: T);
fn atomic_store_rel<T>(dst: *mut T, val: T);
fn atomic_store_relaxed<T>(dst: *mut T, val: T);
fn atomic_store_unordered<T>(dst: *mut T, val: T);

fn atomic_xchg<T>(dst: *mut T, src: T) -> T;
fn atomic_xchg_acq<T>(dst: *mut T, src: T) -> T;
fn atomic_xchg_rel<T>(dst: *mut T, src: T) -> T;
fn atomic_xchg_acqrel<T>(dst: *mut T, src: T) -> T;
fn atomic_xchg_relaxed<T>(dst: *mut T, src: T) -> T;
```