Skip to content

Commit 951db98

Browse files
committed
feat: Use try_reserve to handle allocation error in lender
1 parent db51a3a commit 951db98

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ impl Counter {
3434
/// Ownership will NOT control the heap-allocated memory until own it back.
3535
#[no_mangle]
3636
pub extern fn counter_new(value: u8) -> *mut Counter {
37-
return opaque_pointer::raw(Counter::new());
37+
return opaque_pointer::raw(Counter::new())
38+
.expect("Error trying to lend a pointer");
3839
}
3940

4041
/// Drop (free memory of) Rust's Counter object as usually.

src/lender.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ use lazy_static::lazy_static;
99
use std::collections::HashSet;
1010
use std::sync::{RwLock, RwLockWriteGuard};
1111

12+
use crate::error::PointerError;
13+
1214
lazy_static! {
1315
static ref LENT_POINTERS: RwLock<HashSet<usize>> = RwLock::new(HashSet::new());
1416
}
@@ -35,9 +37,14 @@ pub(super) fn is_lent<T>(pointer: *const T) -> bool {
3537
/// If the [`RwLock`] used is poisoned, but it only happens if a panic happens
3638
/// while holding it. And it's specially reviewed and in a small module to
3739
/// avoid panics while holding it.
38-
pub(super) fn lend<T>(pointer: *const T) {
39-
// Use try_reserve in nightly until it is available in stable
40-
writable_lent_pointers().insert(pointer as usize);
40+
pub(super) fn lend<T>(pointer: *const T) -> Result<(), PointerError> {
41+
let mut lent_pointers = writable_lent_pointers();
42+
if let Err(error) = lent_pointers.try_reserve(1) {
43+
log::error!("Can not alloc memory to lent a pointer: {error}");
44+
return Err(PointerError::from(error));
45+
}
46+
lent_pointers.insert(pointer as usize);
47+
return Ok(());
4148
}
4249

4350
/// Use only when [`own_back`](crate::own_back) memory.

src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ mod validation;
3434
/// To back to manage the memory with ownership use [`own_back<T>()`].
3535
#[cfg(any(feature = "alloc", feature = "std"))]
3636
#[inline]
37-
pub fn raw<T>(data: T) -> *mut T {
37+
pub fn raw<T>(data: T) -> Result<*mut T, PointerError> {
3838
let pointer = Box::into_raw(Box::new(data));
3939
#[cfg(all(feature = "std", feature = "lender"))]
40-
lender::lend(pointer);
41-
return pointer;
40+
lender::lend(pointer)?;
41+
return Ok(pointer);
4242
}
4343

4444
/// Call to [`own_back<T>()`] ignoring the result.
@@ -47,7 +47,7 @@ pub fn raw<T>(data: T) -> *mut T {
4747
///
4848
/// ```no_run
4949
/// # let value = 0;
50-
/// # let pointer = opaque_pointer::raw(value);
50+
/// # let pointer = opaque_pointer::raw(value).unwrap();
5151
/// std::mem::drop(unsafe { opaque_pointer::own_back(pointer) });
5252
/// ```
5353
///

tests/pointer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl TestIt {
1919

2020
#[test]
2121
fn own_back() {
22-
let pointer = opaque_pointer::raw(TestIt::new(2));
22+
let pointer = opaque_pointer::raw(TestIt::new(2)).unwrap();
2323
let test_it = unsafe { opaque_pointer::own_back(pointer).unwrap() };
2424
assert_eq!(test_it.get(), 2);
2525
}
@@ -37,15 +37,15 @@ fn own_back_invalid_pointer() {
3737

3838
#[test]
3939
fn immutable_reference() {
40-
let pointer = opaque_pointer::raw(TestIt::new(2));
40+
let pointer = opaque_pointer::raw(TestIt::new(2)).unwrap();
4141
let object = unsafe { opaque_pointer::object(pointer).unwrap() };
4242
assert_eq!(object.get(), 2);
4343
unsafe { opaque_pointer::own_back(pointer).unwrap() };
4444
}
4545

4646
#[test]
4747
fn mutable_reference() {
48-
let pointer = opaque_pointer::raw(TestIt::new(2));
48+
let pointer = opaque_pointer::raw(TestIt::new(2)).unwrap();
4949
let object = unsafe { opaque_pointer::mut_object(pointer).unwrap() };
5050
object.add(3);
5151
assert_eq!(object.get(), 5);

0 commit comments

Comments
 (0)