mirror of
https://github.com/penpot/penpot.git
synced 2025-07-19 06:47:11 +02:00
🔧 Avoid using global static mut variables when possible
This commit is contained in:
parent
0279e75c4b
commit
3a8ba4cbee
6 changed files with 270 additions and 218 deletions
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue