Skip to content

Commit

Permalink
Fix incorrect finalizer registration
Browse files Browse the repository at this point in the history
This fixes a bug in finalizer registration in Alloy were the wrong
pointer was being passed to Boehm. A pointer to underlying `GcBox`
should be passed instead of the `Gc` smart pointer.
  • Loading branch information
jacob-hughes committed Oct 4, 2023
1 parent 48391ba commit fafbab3
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
2 changes: 1 addition & 1 deletion library/alloc/src/gc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ impl<T> Gc<T> {

unsafe {
ALLOCATOR.register_finalizer(
self as *mut _ as *mut u8,
self.ptr.as_ptr() as *mut u8,
Some(finalizer::<T>),
null_mut(),
null_mut(),
Expand Down
35 changes: 35 additions & 0 deletions tests/ui/runtime/gc/run_finalizers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// run-pass
// ignore-tidy-linelength
#![feature(gc)]
#![feature(rustc_private)]

use std::gc::{Gc, GcAllocator};
use std::sync::atomic::{self, AtomicUsize};

struct Finalizable(usize);

impl Drop for Finalizable {
fn drop(&mut self) {
FINALIZER_COUNT.fetch_add(1, atomic::Ordering::Relaxed);
}
}

static FINALIZER_COUNT: AtomicUsize = AtomicUsize::new(0);
static ALLOCATED_COUNT: usize = 100;

fn foo() {
for i in 0..ALLOCATED_COUNT {
{
let mut _gc = Some(Gc::new(Finalizable(i)));

// Zero the root to the GC object.
_gc = None;
}
}
}

fn main() {
foo();
GcAllocator::force_gc();
assert_eq!(FINALIZER_COUNT.load(atomic::Ordering::Relaxed), ALLOCATED_COUNT);
}

0 comments on commit fafbab3

Please sign in to comment.