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 *(&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 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}