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 {
34
34
/// Ownership will NOT control the heap-allocated memory until own it back.
35
35
#[no_mangle]
36
36
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" );
38
39
}
39
40
40
41
/// 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;
9
9
use std:: collections:: HashSet ;
10
10
use std:: sync:: { RwLock , RwLockWriteGuard } ;
11
11
12
+ use crate :: error:: PointerError ;
13
+
12
14
lazy_static ! {
13
15
static ref LENT_POINTERS : RwLock <HashSet <usize >> = RwLock :: new( HashSet :: new( ) ) ;
14
16
}
@@ -35,9 +37,14 @@ pub(super) fn is_lent<T>(pointer: *const T) -> bool {
35
37
/// If the [`RwLock`] used is poisoned, but it only happens if a panic happens
36
38
/// while holding it. And it's specially reviewed and in a small module to
37
39
/// 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 ( ( ) ) ;
41
48
}
42
49
43
50
/// 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;
34
34
/// To back to manage the memory with ownership use [`own_back<T>()`].
35
35
#[ cfg( any( feature = "alloc" , feature = "std" ) ) ]
36
36
#[ inline]
37
- pub fn raw < T > ( data : T ) -> * mut T {
37
+ pub fn raw < T > ( data : T ) -> Result < * mut T , PointerError > {
38
38
let pointer = Box :: into_raw ( Box :: new ( data) ) ;
39
39
#[ cfg( all( feature = "std" , feature = "lender" ) ) ]
40
- lender:: lend ( pointer) ;
41
- return pointer;
40
+ lender:: lend ( pointer) ? ;
41
+ return Ok ( pointer) ;
42
42
}
43
43
44
44
/// Call to [`own_back<T>()`] ignoring the result.
@@ -47,7 +47,7 @@ pub fn raw<T>(data: T) -> *mut T {
47
47
///
48
48
/// ```no_run
49
49
/// # let value = 0;
50
- /// # let pointer = opaque_pointer::raw(value);
50
+ /// # let pointer = opaque_pointer::raw(value).unwrap() ;
51
51
/// std::mem::drop(unsafe { opaque_pointer::own_back(pointer) });
52
52
/// ```
53
53
///
Original file line number Diff line number Diff line change @@ -19,7 +19,7 @@ impl TestIt {
19
19
20
20
#[ test]
21
21
fn own_back ( ) {
22
- let pointer = opaque_pointer:: raw ( TestIt :: new ( 2 ) ) ;
22
+ let pointer = opaque_pointer:: raw ( TestIt :: new ( 2 ) ) . unwrap ( ) ;
23
23
let test_it = unsafe { opaque_pointer:: own_back ( pointer) . unwrap ( ) } ;
24
24
assert_eq ! ( test_it. get( ) , 2 ) ;
25
25
}
@@ -37,15 +37,15 @@ fn own_back_invalid_pointer() {
37
37
38
38
#[ test]
39
39
fn immutable_reference ( ) {
40
- let pointer = opaque_pointer:: raw ( TestIt :: new ( 2 ) ) ;
40
+ let pointer = opaque_pointer:: raw ( TestIt :: new ( 2 ) ) . unwrap ( ) ;
41
41
let object = unsafe { opaque_pointer:: object ( pointer) . unwrap ( ) } ;
42
42
assert_eq ! ( object. get( ) , 2 ) ;
43
43
unsafe { opaque_pointer:: own_back ( pointer) . unwrap ( ) } ;
44
44
}
45
45
46
46
#[ test]
47
47
fn mutable_reference ( ) {
48
- let pointer = opaque_pointer:: raw ( TestIt :: new ( 2 ) ) ;
48
+ let pointer = opaque_pointer:: raw ( TestIt :: new ( 2 ) ) . unwrap ( ) ;
49
49
let object = unsafe { opaque_pointer:: mut_object ( pointer) . unwrap ( ) } ;
50
50
object. add ( 3 ) ;
51
51
assert_eq ! ( object. get( ) , 5 ) ;
You can’t perform that action at this time.
0 commit comments