6 Commits

Author SHA1 Message Date
Yota Toyama
f52f6dcfaf Refactor 2023-05-21 13:55:17 +10:00
Yota Toyama
3de34a77e9 Fix 2023-05-21 13:53:09 +10:00
Yota Toyama
81df12684f Fix 2023-05-21 13:52:34 +10:00
Yota Toyama
a3a13f061f Fix 2023-05-21 13:41:26 +10:00
Yota Toyama
085028a8e1 Fix 2023-05-21 13:39:31 +10:00
Yota Toyama
04f5f88b33 Fix 2023-05-21 13:38:27 +10:00
18 changed files with 54 additions and 76 deletions

View File

@@ -1,18 +1,11 @@
{ {
"words": [ "words": [
"autogen",
"autotools",
"bdwgc",
"cflag",
"dealloc", "dealloc",
"finalizer", "finalizer",
"gcollect", "gcollect",
"libatomic",
"libc", "libc",
"realloc", "realloc",
"repr", "repr",
"rustc", "stackbottom"
"stackbottom",
"unregisters"
] ]
} }

View File

@@ -8,7 +8,7 @@ jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
@@ -16,19 +16,19 @@ jobs:
format: format:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- run: cargo fmt -- --check - run: cargo fmt -- --check
spell-check: spell-check:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: streetsidesoftware/cspell-action@main - uses: streetsidesoftware/cspell-action@main
with: with:
files: "**/*.{md,rs}" files: "**/*.{md,rs}"
readme: readme:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
- uses: lycheeverse/lychee-action@v1 - uses: lycheeverse/lychee-action@v1
with: with:
fail: true fail: true

View File

@@ -8,7 +8,7 @@ jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
@@ -16,7 +16,7 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
@@ -24,15 +24,17 @@ jobs:
examples: examples:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
- run: examples/test.sh - run: |
cd examples
./test.sh
cmake: cmake:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v3
with: with:
submodules: true submodules: true
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "bdwgc-alloc" name = "bdwgc-alloc"
description = "impl GlobalAlloc for bdwgc" description = "impl GlobalAlloc for bdwgc"
version = "0.6.7" version = "0.6.5"
authors = [ authors = [
"swgillespie <sean.william.g@gmail.com>", "swgillespie <sean.william.g@gmail.com>",
"Yota Toyama <raviqqe@gmail.com>", "Yota Toyama <raviqqe@gmail.com>",
@@ -9,6 +9,7 @@ authors = [
repository = "https://github.com/raviqqe/bdwgc-alloc" repository = "https://github.com/raviqqe/bdwgc-alloc"
edition = "2021" edition = "2021"
license = "MIT" license = "MIT"
build = "build.rs"
[features] [features]
default = ["autotools"] default = ["autotools"]

View File

@@ -23,7 +23,7 @@ fn main() {
let dst = autotools::Config::new(LIB_GC_DIR) let dst = autotools::Config::new(LIB_GC_DIR)
.cflag(format!( .cflag(format!(
"-I{} -L/lib/x86_64-linux-gnu -lpthread -fPIC -D POINTER_MASK=0x7", "-I{} -L/lib/x86_64-linux-gnu -lpthread -fPIC",
dst.join("include").display() dst.join("include").display()
)) ))
.build(); .build();
@@ -59,10 +59,7 @@ fn main() {
let dst = Config::new(LIB_GC_DIR) let dst = Config::new(LIB_GC_DIR)
.profile("Release") .profile("Release")
.define("BUILD_SHARED_LIBS", "FALSE") .define("BUILD_SHARED_LIBS", "FALSE")
.cflag(format!( .cflag(format!("-I{}", libatomic_include_path))
"-I{} -DPOINTER_MASK=0x7",
libatomic_include_path, foo
))
.build(); .build();
println!( println!(

View File

@@ -1,5 +1,4 @@
[workspace] [workspace]
resolver = "2"
members = [ members = [
"dynamic_threads", "dynamic_threads",
"free_by_borrow", "free_by_borrow",

View File

@@ -2,7 +2,7 @@
name = "dynamic_threads" name = "dynamic_threads"
version = "0.1.0" version = "0.1.0"
authors = ["Yota Toyama <raviqqe@gmail.com>"] authors = ["Yota Toyama <raviqqe@gmail.com>"]
edition = "2021" edition = "2018"
publish = false publish = false
[dependencies] [dependencies]

View File

@@ -1,3 +1,5 @@
extern crate bdwgc_alloc;
use bdwgc_alloc::Allocator; use bdwgc_alloc::Allocator;
use std::alloc::Layout; use std::alloc::Layout;
@@ -12,7 +14,7 @@ fn main() {
unsafe { Allocator::register_current_thread().unwrap() } unsafe { Allocator::register_current_thread().unwrap() }
for _ in 0..100 { for _ in 0..100 {
let _ = unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) }; unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) };
} }
unsafe { Allocator::unregister_current_thread() } unsafe { Allocator::unregister_current_thread() }

View File

@@ -2,7 +2,7 @@
name = "free_by_borrow" name = "free_by_borrow"
version = "0.1.0" version = "0.1.0"
authors = ["Yota Toyama <raviqqe@gmail.com>"] authors = ["Yota Toyama <raviqqe@gmail.com>"]
edition = "2021" edition = "2018"
publish = false publish = false
[dependencies] [dependencies]

View File

@@ -1,3 +1,5 @@
extern crate bdwgc_alloc;
use bdwgc_alloc::Allocator; use bdwgc_alloc::Allocator;
#[global_allocator] #[global_allocator]

View File

@@ -2,7 +2,7 @@
name = "free_by_gc" name = "free_by_gc"
version = "0.1.0" version = "0.1.0"
authors = ["Yota Toyama <raviqqe@gmail.com>"] authors = ["Yota Toyama <raviqqe@gmail.com>"]
edition = "2021" edition = "2018"
publish = false publish = false
[dependencies] [dependencies]

View File

@@ -1,3 +1,5 @@
extern crate bdwgc_alloc;
use bdwgc_alloc::Allocator; use bdwgc_alloc::Allocator;
use std::alloc::Layout; use std::alloc::Layout;
@@ -8,6 +10,6 @@ fn main() {
unsafe { Allocator::initialize() } unsafe { Allocator::initialize() }
loop { loop {
let _ = unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) }; unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) };
} }
} }

View File

@@ -2,7 +2,7 @@
name = "static_threads" name = "static_threads"
version = "0.1.0" version = "0.1.0"
authors = ["Yota Toyama <raviqqe@gmail.com>"] authors = ["Yota Toyama <raviqqe@gmail.com>"]
edition = "2021" edition = "2018"
publish = false publish = false
[dependencies] [dependencies]

View File

@@ -1,3 +1,5 @@
extern crate bdwgc_alloc;
use bdwgc_alloc::Allocator; use bdwgc_alloc::Allocator;
use std::alloc::Layout; use std::alloc::Layout;
@@ -11,7 +13,7 @@ fn main() {
unsafe { Allocator::register_current_thread().unwrap() } unsafe { Allocator::register_current_thread().unwrap() }
loop { loop {
let _ = unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) }; unsafe { std::alloc::alloc(Layout::from_size_align(2 ^ 8, 8).unwrap()) };
} }
}); });

View File

@@ -2,11 +2,12 @@
set -ex set -ex
cd $(dirname $0) cargo build
for cargo_file in */Cargo.toml; do for cargo_file in */Cargo.toml
cargo run --bin $(dirname $cargo_file) & do
target/debug/$(dirname $cargo_file) &
pid=$! pid=$!
sleep 20 sleep 10
kill $pid kill $pid
done done

View File

@@ -25,7 +25,6 @@ extern "C" {
fn GC_get_stack_base(stack_base: *mut GcStackBase) -> c_int; fn GC_get_stack_base(stack_base: *mut GcStackBase) -> c_int;
fn GC_init(); fn GC_init();
fn GC_malloc(size: size_t) -> *mut c_void; fn GC_malloc(size: size_t) -> *mut c_void;
fn GC_memalign(align: size_t, size: size_t) -> *mut c_void;
fn GC_realloc(ptr: *mut c_void, size: size_t) -> *mut c_void; fn GC_realloc(ptr: *mut c_void, size: size_t) -> *mut c_void;
fn GC_register_my_thread(stack_base: *const GcStackBase) -> c_int; fn GC_register_my_thread(stack_base: *const GcStackBase) -> c_int;
fn GC_set_stackbottom(thread: *const c_void, stack_bottom: *const GcStackBase); fn GC_set_stackbottom(thread: *const c_void, stack_bottom: *const GcStackBase);
@@ -43,31 +42,19 @@ extern "C" {
pub struct Allocator; pub struct Allocator;
impl Allocator { impl Allocator {
/// Locks a collector.
pub fn lock() { pub fn lock() {
unsafe { GC_alloc_lock() } unsafe { GC_alloc_lock() }
} }
/// Unlocks a collector.
pub fn unlock() { pub fn unlock() {
unsafe { GC_alloc_unlock() } unsafe { GC_alloc_unlock() }
} }
/// Initializes a collector.
///
/// # Safety
///
/// This function must be called in a main thread.
pub unsafe fn initialize() { pub unsafe fn initialize() {
GC_init(); GC_init();
GC_allow_register_threads(); GC_allow_register_threads();
} }
/// Registers a current thread to a collector.
///
/// # Safety
///
/// This function must not be called in a main thread.
pub unsafe fn register_current_thread() -> Result<(), error::Error> { pub unsafe fn register_current_thread() -> Result<(), error::Error> {
let mut base = GcStackBase { mem_base: null() }; let mut base = GcStackBase { mem_base: null() };
@@ -80,14 +67,6 @@ impl Allocator {
Ok(()) Ok(())
} }
/// Sets a bottom of a stack.
///
/// You do not have to call this function in most cases.
/// A collector detects the bottom on initialization automatically.
///
/// # Safety
///
/// The bottom address must be valid.
pub unsafe fn set_stack_bottom(bottom: *const u8) { pub unsafe fn set_stack_bottom(bottom: *const u8) {
GC_set_stackbottom( GC_set_stackbottom(
null(), null(),
@@ -97,37 +76,35 @@ impl Allocator {
) )
} }
/// Unregisters a current thread from a collector.
///
/// # Safety
///
/// The thread must be registered already.
pub unsafe fn unregister_current_thread() { pub unsafe fn unregister_current_thread() {
GC_unregister_my_thread() GC_unregister_my_thread()
} }
/// Runs a garbage collection forcibly.
pub fn force_collect() { pub fn force_collect() {
unsafe { GC_gcollect() } unsafe { GC_gcollect() }
} }
/// Registers a finalizer of an object. pub unsafe fn register_finalizer<F: FnOnce(*mut c_void) + 'static>(
///
/// # Safety
///
/// The given finalizer must not be null and handle pointers properly.
pub unsafe fn register_finalizer(
ptr: *const c_void, ptr: *const c_void,
finalizer: extern "C" fn(*mut c_void, *mut c_void), finalizer: F,
client_data: *const c_void,
) { ) {
GC_register_finalizer(ptr, finalizer, client_data, null(), null()); extern "C" fn finalize<F: FnOnce(*mut c_void)>(ptr: *mut c_void, data: *mut c_void) {
(unsafe { Box::from_raw(data as *mut F) })(ptr)
}
GC_register_finalizer(
ptr,
finalize::<F>,
Box::into_raw(Box::new(finalizer)) as *const _,
null(),
null(),
);
} }
} }
unsafe impl GlobalAlloc for Allocator { unsafe impl GlobalAlloc for Allocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 { unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
GC_memalign(layout.align(), layout.size()) as *mut u8 GC_malloc(layout.size()) as *mut u8
} }
unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) { unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {

2
vendor/bdwgc vendored