summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
author Andrew Walbran <qwandor@google.com> 2021-03-09 15:03:52 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2021-03-09 15:03:52 +0000
commitc9c0dfbfc574a746c5dad93fe51c95ca10a26aaa (patch)
treef57919d1c83edce17e3401afa3f460a05ac35003 /libs
parent5dc18f28e3630fd66253b17c167b115f052f752f (diff)
parente25ed4b95710a9028c1f4a7bdcb6698a59825789 (diff)
Merge "Mark Status as Sync and Send."
Diffstat (limited to 'libs')
-rw-r--r--libs/binder/rust/src/error.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/libs/binder/rust/src/error.rs b/libs/binder/rust/src/error.rs
index 4492cf72f4..2598ebc804 100644
--- a/libs/binder/rust/src/error.rs
+++ b/libs/binder/rust/src/error.rs
@@ -77,9 +77,7 @@ fn parse_exception_code(code: i32) -> ExceptionCode {
e if e == ExceptionCode::ILLEGAL_ARGUMENT as i32 => ExceptionCode::ILLEGAL_ARGUMENT,
e if e == ExceptionCode::NULL_POINTER as i32 => ExceptionCode::NULL_POINTER,
e if e == ExceptionCode::ILLEGAL_STATE as i32 => ExceptionCode::ILLEGAL_STATE,
- e if e == ExceptionCode::NETWORK_MAIN_THREAD as i32 => {
- ExceptionCode::NETWORK_MAIN_THREAD
- }
+ e if e == ExceptionCode::NETWORK_MAIN_THREAD as i32 => ExceptionCode::NETWORK_MAIN_THREAD,
e if e == ExceptionCode::UNSUPPORTED_OPERATION as i32 => {
ExceptionCode::UNSUPPORTED_OPERATION
}
@@ -96,6 +94,16 @@ fn parse_exception_code(code: i32) -> ExceptionCode {
/// Used in AIDL transactions to represent failed transactions.
pub struct Status(*mut sys::AStatus);
+// Safety: The `AStatus` that the `Status` points to must have an entirely thread-safe API for the
+// duration of the `Status` object's lifetime. We ensure this by not allowing mutation of a `Status`
+// in Rust, and the NDK API says we're the owner of our `AStatus` objects so outside code should not
+// be mutating them underneath us.
+unsafe impl Sync for Status {}
+
+// Safety: `Status` always contains an owning pointer to a global, immutable, interned `AStatus`.
+// A thread-local `AStatus` would not be valid.
+unsafe impl Send for Status {}
+
impl Status {
/// Create a status object representing a successful transaction.
pub fn ok() -> Self {