1
1
use std:: any:: { type_name, TypeId } ;
2
- use std:: cell:: { Cell , RefCell , UnsafeCell } ;
2
+ use std:: cell:: { RefCell , UnsafeCell } ;
3
3
use std:: fmt;
4
4
use std:: ops:: { Deref , DerefMut } ;
5
5
use std:: os:: raw:: c_int;
@@ -91,20 +91,20 @@ impl<T> UserDataVariant<T> {
91
91
}
92
92
93
93
#[ inline( always) ]
94
- fn raw_lock ( & self ) -> & RawLock {
94
+ fn strong_count ( & self ) -> usize {
95
95
match self {
96
- Self :: Default ( inner) => & inner. raw_lock ,
96
+ Self :: Default ( inner) => XRc :: strong_count ( inner) ,
97
97
#[ cfg( feature = "serialize" ) ]
98
- Self :: Serializable ( inner) => & inner. raw_lock ,
98
+ Self :: Serializable ( inner) => XRc :: strong_count ( inner) ,
99
99
}
100
100
}
101
101
102
102
#[ inline( always) ]
103
- fn borrow_count ( & self ) -> & Cell < usize > {
103
+ fn raw_lock ( & self ) -> & RawLock {
104
104
match self {
105
- Self :: Default ( inner) => & inner. borrow_count ,
105
+ Self :: Default ( inner) => & inner. raw_lock ,
106
106
#[ cfg( feature = "serialize" ) ]
107
- Self :: Serializable ( inner) => & inner. borrow_count ,
107
+ Self :: Serializable ( inner) => & inner. raw_lock ,
108
108
}
109
109
}
110
110
@@ -139,7 +139,6 @@ impl Serialize for UserDataStorage<()> {
139
139
/// A type that provides interior mutability for a userdata value (thread-safe).
140
140
pub ( crate ) struct UserDataCell < T > {
141
141
raw_lock : RawLock ,
142
- borrow_count : Cell < usize > ,
143
142
value : UnsafeCell < T > ,
144
143
}
145
144
@@ -153,7 +152,6 @@ impl<T> UserDataCell<T> {
153
152
fn new ( value : T ) -> Self {
154
153
UserDataCell {
155
154
raw_lock : RawLock :: INIT ,
156
- borrow_count : Cell :: new ( 0 ) ,
157
155
value : UnsafeCell :: new ( value) ,
158
156
}
159
157
}
@@ -303,7 +301,6 @@ impl<T> Drop for UserDataBorrowRef<'_, T> {
303
301
#[ inline]
304
302
fn drop ( & mut self ) {
305
303
unsafe {
306
- self . 0 . borrow_count ( ) . set ( self . 0 . borrow_count ( ) . get ( ) - 1 ) ;
307
304
self . 0 . raw_lock ( ) . unlock_shared ( ) ;
308
305
}
309
306
}
@@ -331,7 +328,6 @@ impl<'a, T> TryFrom<&'a UserDataVariant<T>> for UserDataBorrowRef<'a, T> {
331
328
if !variant. raw_lock ( ) . try_lock_shared ( ) {
332
329
return Err ( Error :: UserDataBorrowError ) ;
333
330
}
334
- variant. borrow_count ( ) . set ( variant. borrow_count ( ) . get ( ) + 1 ) ;
335
331
Ok ( UserDataBorrowRef ( variant) )
336
332
}
337
333
}
@@ -342,7 +338,6 @@ impl<T> Drop for UserDataBorrowMut<'_, T> {
342
338
#[ inline]
343
339
fn drop ( & mut self ) {
344
340
unsafe {
345
- self . 0 . borrow_count ( ) . set ( self . 0 . borrow_count ( ) . get ( ) - 1 ) ;
346
341
self . 0 . raw_lock ( ) . unlock_exclusive ( ) ;
347
342
}
348
343
}
@@ -372,7 +367,6 @@ impl<'a, T> TryFrom<&'a UserDataVariant<T>> for UserDataBorrowMut<'a, T> {
372
367
if !variant. raw_lock ( ) . try_lock_exclusive ( ) {
373
368
return Err ( Error :: UserDataBorrowMutError ) ;
374
369
}
375
- variant. borrow_count ( ) . set ( variant. borrow_count ( ) . get ( ) + 1 ) ;
376
370
Ok ( UserDataBorrowMut ( variant) )
377
371
}
378
372
}
@@ -489,11 +483,15 @@ impl<T> UserDataStorage<T> {
489
483
Self :: Scoped ( ScopedUserDataVariant :: Boxed ( RefCell :: new ( data) ) )
490
484
}
491
485
486
+ /// Returns `true` if it's safe to destroy the container.
487
+ ///
488
+ /// It's safe to destroy the container if the reference count is greater than 1 or the lock is
489
+ /// not acquired.
492
490
#[ inline( always) ]
493
- pub ( crate ) fn is_borrowed ( & self ) -> bool {
491
+ pub ( crate ) fn is_safe_to_destroy ( & self ) -> bool {
494
492
match self {
495
- Self :: Owned ( variant) => variant. borrow_count ( ) . get ( ) > 0 ,
496
- Self :: Scoped ( _) => true ,
493
+ Self :: Owned ( variant) => variant. strong_count ( ) > 1 || !variant . raw_lock ( ) . is_locked ( ) ,
494
+ Self :: Scoped ( _) => false ,
497
495
}
498
496
}
499
497
0 commit comments