🔧 Avoid using global static mut variables when possible

This commit is contained in:
elenatorro 2025-03-05 16:26:34 +01:00
parent 0279e75c4b
commit 3a8ba4cbee
6 changed files with 270 additions and 218 deletions

View file

@ -1,47 +1,57 @@
static mut BUFFERU8: Option<Box<Vec<u8>>> = None;
use std::sync::Mutex;
static BUFFERU8: Mutex<Option<Box<Vec<u8>>>> = Mutex::new(None);
#[no_mangle]
pub extern "C" fn alloc_bytes(len: usize) -> *mut u8 {
// TODO: Figure out how to deal with Result<T> from Emscripten
if unsafe { BUFFERU8.is_some() } {
let mut guard = BUFFERU8.lock().unwrap();
if guard.is_some() {
panic!("Bytes already allocated");
}
let mut buffer = Box::new(vec![0u8; len]);
let ptr = buffer.as_mut_ptr();
let mut new_buffer = Box::new(vec![0u8; len]);
let ptr = new_buffer.as_mut_ptr();
unsafe { BUFFERU8 = Some(buffer) };
return ptr;
*guard = Some(new_buffer);
ptr
}
pub fn write_bytes(bytes: Vec<u8>) -> *mut u8 {
if unsafe { BUFFERU8.is_some() } {
let mut guard = BUFFERU8.lock().unwrap();
if guard.is_some() {
panic!("Bytes already allocated");
}
let mut buffer = Box::new(bytes);
let ptr = buffer.as_mut_ptr();
let mut new_buffer = Box::new(bytes);
let ptr = new_buffer.as_mut_ptr();
unsafe { BUFFERU8 = Some(buffer) };
return ptr;
*guard = Some(new_buffer);
ptr
}
#[no_mangle]
pub extern "C" fn free_bytes() {
if unsafe { BUFFERU8.is_some() } {
let buffer = unsafe { BUFFERU8.take() }.expect("uninitialized buffer");
std::mem::drop(buffer);
}
let mut guard = BUFFERU8.lock().unwrap();
*guard = None;
std::mem::drop(guard);
}
pub fn buffer_ptr() -> *mut u8 {
let buffer = unsafe { BUFFERU8.as_mut() }.expect("uninitializied buffer");
buffer.as_mut_ptr()
let guard = BUFFERU8.lock().unwrap();
guard
.as_ref()
.map_or(std::ptr::null_mut(), |buffer| buffer.as_ptr() as *mut u8)
}
pub fn bytes() -> Vec<u8> {
let buffer = unsafe { BUFFERU8.take() }.expect("uninitialized buffer");
*buffer
let mut guard = BUFFERU8.lock().unwrap();
guard
.take()
.map_or_else(|| panic!("Buffer is not initialized"), |buffer| *buffer)
}
pub trait SerializableResult {