summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
author Andrew Walbran <qwandor@google.com> 2021-03-09 16:20:41 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2021-03-09 16:20:41 +0000
commite1453c1656c65ab2deb30aac13164534e41f4020 (patch)
treef57919d1c83edce17e3401afa3f460a05ac35003 /libs
parent62c950a8afc4e4d048e6bb612cd0056ff7948557 (diff)
parent241b62b26d76ceab5c3e731ce926f9688178b8d7 (diff)
Merge "Mark Status as Sync and Send." am: c9c0dfbfc5 am: 241b62b26d
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1620972 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Ib6281a203849d431eb70b8f052b4e9933dc67f71
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 {