Skip to content

Commit b80cc73

Browse files
committed
ref_count: add weak count
Needed for weakref support.
1 parent 8556318 commit b80cc73

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

src/ref_count.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff 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

4045
impl 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
}

src/sync/ref_count.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::sync::Arc;
88

99
pub 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
}

0 commit comments

Comments
 (0)