particles/
glue.rs

1use std::os::raw::c_char;
2use std::ffi::CString;
3
4#[no_mangle]
5pub unsafe extern "C" fn g_destroy_cstring(s: *mut c_char) {
6    CString::from_raw(s);
7}
8
9#[no_mangle]
10pub unsafe extern "C" fn g_alloc(len: usize) -> *mut u8 {
11    let ptr_size = ::std::mem::size_of::<usize>();
12    let mut v: Vec<u8> = Vec::with_capacity(len + ptr_size);
13    v.set_len(len + ptr_size);
14
15    //eprintln!("alloc: {:?} {}+{}", &v[0] as *const u8, ptr_size, len);
16
17    *(&mut v[0] as *mut u8 as *mut usize) = len;
18    let mut v = v.into_boxed_slice();
19    let addr = &mut v[ptr_size] as *mut u8;
20    Box::into_raw(v);
21
22    addr
23}
24
25#[no_mangle]
26pub unsafe extern "C" fn g_free(mem: *mut u8) {
27    let ptr_size = ::std::mem::size_of::<usize>();
28    let mem = mem.offset(-(ptr_size as isize));
29    let len = *(mem as *const u8 as *const usize);
30
31    //eprintln!("free: {:?} {}+{}", mem, ptr_size, len);
32
33    Box::from_raw(::std::slice::from_raw_parts_mut(mem, len + ptr_size));
34}
35
36#[test]
37fn test_alloc_free() {
38    for i in 0..10000000 {
39        unsafe {
40            let m = g_alloc(i % 1024 + 1);
41            *m = 42;
42            g_free(m);
43        }
44    }
45}