File tree Expand file tree Collapse file tree 4 files changed +19
-11
lines changed Expand file tree Collapse file tree 4 files changed +19
-11
lines changed Original file line number Diff line number Diff line change @@ -34,7 +34,8 @@ impl Counter {
3434/// Ownership will NOT control the heap-allocated memory until own it back.
3535#[no_mangle]
3636pub 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.
Original file line number Diff line number Diff line change @@ -9,6 +9,8 @@ use lazy_static::lazy_static;
99use std:: collections:: HashSet ;
1010use std:: sync:: { RwLock , RwLockWriteGuard } ;
1111
12+ use crate :: error:: PointerError ;
13+
1214lazy_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.
Original file line number Diff line number Diff 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///
Original file line number Diff line number Diff line change @@ -19,7 +19,7 @@ impl TestIt {
1919
2020#[ test]
2121fn 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]
3939fn 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]
4747fn 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 ) ;
You can’t perform that action at this time.
0 commit comments