-
Notifications
You must be signed in to change notification settings - Fork 232
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
`Handle` is a u64 newtype that I hope to use to represent objects that get passed across the FFI. `HandleAlloc` is an ffi trait that converts between `Arc<>` and `Handle`.
- Loading branch information
Showing
5 changed files
with
157 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
/* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | ||
|
||
/// Object handle | ||
/// | ||
/// Handles opaque `u64` values used to pass objects across the FFI, both for objects implemented in | ||
/// Rust and ones implemented in the foreign language. | ||
/// | ||
/// Rust handles are generated by leaking a raw pointer | ||
/// Foreign handles are generated with a handle map that only generates odd values. | ||
/// For all currently supported architectures and hopefully any ones we add in the future: | ||
/// * 0 is an invalid value. | ||
/// * The lowest bit will always be set for foreign handles and never set for Rust ones (since the | ||
/// leaked pointer will be aligned). | ||
/// | ||
/// Rust handles are mainly managed is through the [crate::HandleAlloc] trait. | ||
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)] | ||
#[repr(transparent)] | ||
pub struct Handle(u64); | ||
|
||
impl Handle { | ||
pub fn from_pointer<T>(ptr: *const T) -> Self { | ||
Self(ptr as u64) | ||
} | ||
|
||
pub fn as_pointer<T>(&self) -> *const T { | ||
self.0 as *const T | ||
} | ||
|
||
pub fn from_raw(raw: u64) -> Option<Self> { | ||
if raw == 0 { | ||
None | ||
} else { | ||
Some(Self(raw)) | ||
} | ||
} | ||
|
||
pub fn as_raw(&self) -> u64 { | ||
self.0 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters