File tree Expand file tree Collapse file tree 2 files changed +43
-2
lines changed Expand file tree Collapse file tree 2 files changed +43
-2
lines changed Original file line number Diff line number Diff line change @@ -33,14 +33,19 @@ pub trait RefCount: 'static {
3333 ) -> Option < parking_lot:: lock_api:: RwLockReadGuard < ' _ , parking_lot:: RawRwLock , ( ) > > {
3434 None
3535 }
36+
37+ // Weakref support.
38+ fn inc_weak ( & self ) -> usize ;
39+ fn dec_weak ( & self ) -> usize ;
40+ fn weak_count ( & self ) -> usize ;
3641}
3742
38- pub struct SingleThreadRefCount ( Cell < usize > ) ;
43+ pub struct SingleThreadRefCount ( Cell < usize > , Cell < usize > ) ;
3944
4045impl SingleThreadRefCount {
4146 pub fn new ( tracked : bool ) -> Self {
4247 let value = ( 1 << REF_COUNT_SHIFT ) | if tracked { REF_COUNT_MASK_TRACKED } else { 0 } ;
43- Self ( Cell :: new ( value) )
48+ Self ( Cell :: new ( value) , Cell :: new ( 0 ) )
4449 }
4550}
4651
@@ -80,4 +85,23 @@ impl RefCount for SingleThreadRefCount {
8085 self . 0 . set ( value - ( 1 << REF_COUNT_SHIFT ) ) ;
8186 value >> REF_COUNT_SHIFT
8287 }
88+
89+ #[ inline]
90+ fn inc_weak ( & self ) -> usize {
91+ let value = Cell :: get ( & self . 1 ) ;
92+ self . 1 . set ( value + 1 ) ;
93+ value
94+ }
95+
96+ #[ inline]
97+ fn dec_weak ( & self ) -> usize {
98+ let value = Cell :: get ( & self . 1 ) ;
99+ self . 1 . set ( value - 1 ) ;
100+ value
101+ }
102+
103+ #[ inline]
104+ fn weak_count ( & self ) -> usize {
105+ Cell :: get ( & self . 1 )
106+ }
83107}
Original file line number Diff line number Diff line change @@ -8,6 +8,7 @@ use std::sync::Arc;
88
99pub struct ThreadedRefCount {
1010 ref_count : AtomicUsize ,
11+ weak_count : AtomicUsize ,
1112 pub ( crate ) collector_lock : Arc < RwLock < ( ) > > ,
1213}
1314
@@ -19,6 +20,7 @@ impl ThreadedRefCount {
1920 ref_count : AtomicUsize :: new (
2021 ( 1 << REF_COUNT_SHIFT ) | if tracked { REF_COUNT_MASK_TRACKED } else { 0 } ,
2122 ) ,
23+ weak_count : AtomicUsize :: new ( 0 ) ,
2224 }
2325 }
2426}
@@ -59,4 +61,19 @@ impl RefCount for ThreadedRefCount {
5961 fn locked ( & self ) -> Option < RwLockReadGuard < ' _ , RawRwLock , ( ) > > {
6062 Some ( self . collector_lock . read_recursive ( ) )
6163 }
64+
65+ #[ inline]
66+ fn inc_weak ( & self ) -> usize {
67+ self . weak_count . fetch_add ( 1 , AcqRel )
68+ }
69+
70+ #[ inline]
71+ fn dec_weak ( & self ) -> usize {
72+ self . weak_count . fetch_sub ( 1 , AcqRel )
73+ }
74+
75+ #[ inline]
76+ fn weak_count ( & self ) -> usize {
77+ self . weak_count . load ( Acquire )
78+ }
6279}
You can’t perform that action at this time.
0 commit comments