Open
Description
Hi, I was tring to use loom for a special ref counter. Here is the sample code, basically trying to deallocate a AtomicUsize when down to 0.
But I found that loom::AtomicUsize do not have api .as_mut_ptr()
to get the mutable pointer. What should I do in this case? I read the doc and found that we should implement API for std type if there is API difference. But for this case, it is the loom type that miss the function, how can I implement this? It seems not feasible via with_mut
.
Thanks!
#[repr(transparent)]
#[derive(Clone, Copy, Debug)]
pub struct TaskLocalBytesAllocated(Option<&'static AtomicUsize>);
impl TaskLocalBytesAllocated {
/// Subtracts from the counter value, and `drop` the counter while the count reaches zero.
#[inline(always)]
pub(crate) fn sub(&self, val: usize) {
if let Some(bytes) = self.0 {
// Use Release to synchronize with the below deletion.
let old_bytes = bytes.fetch_sub(val, Ordering::Release);
// If the counter reaches zero, delete the counter. Note that we've ensured there's no
// zero deltas in `wrap_layout`, so there'll be no more uses of the counter.
if old_bytes == val {
// This fence is needed to prevent reordering of use of the counter and deletion of
// the counter. Because it is marked `Release`, the decreasing of the counter
// synchronizes with this `Acquire` fence. This means that use of the counter
// happens before decreasing the counter, which happens before this fence, which
// happens before the deletion of the counter.
fence(Ordering::Acquire);
unsafe { Box::from_raw_in(bytes.as_mut_ptr(), System) };
}
}
}
}
Metadata
Metadata
Assignees
Labels
No labels