Skip to content

Commit

Permalink
Merge #87
Browse files Browse the repository at this point in the history
87: Fix incorrect finalizer registration r=ltratt a=jacob-hughes

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.

Co-authored-by: Jake Hughes <jh@jakehughes.uk>
  • Loading branch information
bors[bot] and jacob-hughes authored Sep 14, 2023
2 parents c56e16c + 6efe94f commit edd8099
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 edd8099

Please sign in to comment.