forked from GitHub/bdwgc-rust
54 lines
1.0 KiB
Rust
54 lines
1.0 KiB
Rust
//! A smoke test of the allocator.
|
|
|
|
use bdwgc_alloc::Allocator;
|
|
use core::hint::black_box;
|
|
use std::thread::spawn;
|
|
|
|
const OBJECT_SIZE: usize = 1 << 8;
|
|
const TOTAL_COUNT: usize = 1 << 16;
|
|
const THREAD_COUNT: usize = 1 << 6;
|
|
|
|
#[global_allocator]
|
|
static GLOBAL_ALLOCATOR: Allocator = Allocator;
|
|
|
|
fn main() {
|
|
unsafe { Allocator::initialize() }
|
|
|
|
free_by_gc();
|
|
free_by_drop();
|
|
static_thread();
|
|
dynamic_threads();
|
|
}
|
|
|
|
fn free_by_gc() {
|
|
for _ in 0..TOTAL_COUNT {
|
|
black_box(Box::leak(Box::new([0u8; OBJECT_SIZE])));
|
|
}
|
|
}
|
|
|
|
fn free_by_drop() {
|
|
for _ in 0..TOTAL_COUNT {
|
|
drop(black_box(Box::new([0u8; OBJECT_SIZE])));
|
|
}
|
|
}
|
|
|
|
fn static_thread() {
|
|
spawn_thread(free_by_gc);
|
|
}
|
|
|
|
fn dynamic_threads() {
|
|
for _ in 0..THREAD_COUNT {
|
|
spawn_thread(free_by_gc);
|
|
}
|
|
}
|
|
|
|
fn spawn_thread(allocate: fn()) {
|
|
spawn(move || {
|
|
unsafe { Allocator::register_current_thread() }.unwrap();
|
|
allocate();
|
|
unsafe { Allocator::unregister_current_thread() }
|
|
})
|
|
.join()
|
|
.unwrap();
|
|
}
|