move heap functions to own mod

This commit is contained in:
Vinzenz Schroeter 2025-05-07 08:53:49 +02:00
parent cf6e6385ec
commit 626a887480
17 changed files with 82 additions and 65 deletions

View file

@ -1,4 +1,4 @@
use crate::{
use crate::mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
};
use servicepoint::{Bitmap, BitmapCommand, CompressionCode, Origin, Packet};

View file

@ -1,4 +1,4 @@
use crate::{
use crate::mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
};
use servicepoint::{

View file

@ -1,4 +1,4 @@
use crate::{
use crate::mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
};
use servicepoint::{

View file

@ -1,4 +1,4 @@
use crate::{heap_drop, heap_move_nonnull};
use crate::mem::{heap_drop, heap_move_nonnull};
use servicepoint::{ClearCommand, FadeOutCommand, HardResetCommand};
use std::ptr::NonNull;

View file

@ -1,4 +1,4 @@
use crate::{
use crate::mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
};
use servicepoint::{BitmapCommand, CharGrid, CharGridCommand, Origin, Packet};

View file

@ -1,4 +1,4 @@
use crate::{
use crate::mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
};
use servicepoint::{

View file

@ -1,4 +1,4 @@
use crate::{
use crate::mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
};
use servicepoint::{
@ -65,11 +65,11 @@ impl SPCommand {
};
}
/// Tries to turn a [Packet] into a [TypedCommand].
/// Tries to turn a [Packet] into a [SPCommand].
///
/// The packet is deallocated in the process.
/// The packet is dropped in the process.
///
/// Returns: pointer to new [TypedCommand] instance or NULL if parsing failed.
/// Returns: pointer to new [SPCommand] instance or NULL if parsing failed.
#[no_mangle]
pub unsafe extern "C" fn sp_cmd_generic_try_from_packet(
packet: NonNull<Packet>,
@ -142,9 +142,9 @@ pub unsafe extern "C" fn sp_cmd_generic_try_from_packet(
}))
}
/// Clones a [SPCommand] instance.
/// Clones an [SPCommand] instance.
///
/// returns: new [SPCommand] instance.
/// returns: a new [SPCommand] instance.
#[no_mangle]
pub unsafe extern "C" fn sp_cmd_generic_clone(command: SPCommand) -> SPCommand {
unsafe {
@ -217,12 +217,12 @@ pub unsafe extern "C" fn sp_cmd_generic_clone(command: SPCommand) -> SPCommand {
}
}
/// Deallocates a [SPCommand].
/// Deallocates an [SPCommand].
///
/// # Examples
///
/// ```C
/// TypedCommand c = sp_command_clear();
/// SPCommand c = sp_cmd_clear_into_generic(sp_cmd_clear_new());
/// sp_command_free(c);
/// ```
#[no_mangle]
@ -248,10 +248,10 @@ pub unsafe extern "C" fn sp_cmd_generic_free(command: SPCommand) {
}
}
/// Turns a [TypedCommand] into a [Packet].
/// The [TypedCommand] gets consumed.
/// Tries to turn a [SPCommand] into a [Packet].
/// The [SPCommand] gets consumed.
///
/// Returns NULL in case of an error.
/// Returns tag [CommandTag::Invalid] in case of an error.
#[no_mangle]
pub unsafe extern "C" fn sp_cmd_generic_into_packet(
command: SPCommand,

View file

@ -1,4 +1,4 @@
use crate::{
use crate::mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
};
use servicepoint::{

View file

@ -1,6 +1,9 @@
use crate::{
containers::ByteSlice, heap_clone, heap_drop, heap_move_nonnull,
heap_move_ok, heap_move_some, heap_remove,
containers::ByteSlice,
mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_move_some,
heap_remove,
},
};
use servicepoint::{
Bitmap, BitmapCommand, CompressionCode, DataRef, DisplayBitVec, Grid,

View file

@ -1,6 +1,8 @@
use crate::{
containers::ByteSlice, heap_clone, heap_drop, heap_move_nonnull,
heap_move_ok, heap_remove,
containers::ByteSlice,
mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
},
};
use servicepoint::{
BinaryOperation, BitVecCommand, CompressionCode, DisplayBitVec, Packet,

View file

@ -1,6 +1,9 @@
use crate::{
containers::ByteSlice, heap_clone, heap_drop, heap_move_nonnull,
heap_move_ok, heap_move_some, heap_remove,
containers::ByteSlice,
mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_move_some,
heap_remove,
},
};
use servicepoint::{
Brightness, BrightnessGrid, BrightnessGridCommand, ByteGrid, DataRef, Grid,

View file

@ -1,6 +1,8 @@
use crate::{
containers::ByteSlice, heap_clone, heap_drop, heap_move_nonnull,
heap_move_ok, heap_remove,
containers::ByteSlice,
mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove,
},
};
use servicepoint::{CharGrid, CharGridCommand, Grid, Origin, Packet};
use std::ptr::NonNull;

View file

@ -1,6 +1,9 @@
use crate::{
containers::ByteSlice, heap_clone, heap_drop, heap_move_nonnull,
heap_move_ok, heap_move_some, heap_remove,
containers::ByteSlice,
mem::{
heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_move_some,
heap_remove,
},
};
use servicepoint::{
Cp437Grid, Cp437GridCommand, DataRef, Grid, Origin, Packet,

View file

@ -25,10 +25,9 @@
//! }
//! ```
use std::ptr::NonNull;
pub mod commands;
pub mod containers;
pub mod mem;
pub mod packet;
pub mod udp;
@ -37,34 +36,6 @@ use std::time::Duration;
/// Actual hardware limit is around 28-29ms/frame. Rounded up for less dropped packets.
pub const SP_FRAME_PACING_MS: u128 = Duration::from_millis(30).as_millis();
pub(crate) fn heap_move<T>(x: T) -> *mut T {
Box::into_raw(Box::new(x))
}
pub(crate) fn heap_move_nonnull<T>(x: T) -> NonNull<T> {
NonNull::from(Box::leak(Box::new(x)))
}
pub(crate) fn heap_move_ok<T, E>(x: Result<T, E>) -> *mut T {
x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut())
}
pub(crate) fn heap_move_some<T>(x: Option<T>) -> *mut T {
x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut())
}
pub(crate) unsafe fn heap_drop<T>(x: NonNull<T>) {
drop(unsafe { heap_remove(x) });
}
pub(crate) unsafe fn heap_remove<T>(x: NonNull<T>) -> T {
unsafe { *Box::from_raw(x.as_ptr()) }
}
unsafe fn heap_clone<T: Clone>(source: NonNull<T>) -> NonNull<T> {
heap_move_nonnull(unsafe { source.as_ref().clone() })
}
/// This is a type only used by cbindgen to have a type for pointers.
pub struct UdpSocket;

29
src/mem.rs Normal file
View file

@ -0,0 +1,29 @@
use std::ptr::NonNull;
pub(crate) fn heap_move<T>(x: T) -> *mut T {
Box::into_raw(Box::new(x))
}
pub(crate) fn heap_move_nonnull<T>(x: T) -> NonNull<T> {
NonNull::from(Box::leak(Box::new(x)))
}
pub(crate) fn heap_move_ok<T, E>(x: Result<T, E>) -> *mut T {
x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut())
}
pub(crate) fn heap_move_some<T>(x: Option<T>) -> *mut T {
x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut())
}
pub(crate) unsafe fn heap_drop<T>(x: NonNull<T>) {
drop(unsafe { heap_remove(x) });
}
pub(crate) unsafe fn heap_remove<T>(x: NonNull<T>) -> T {
unsafe { *Box::from_raw(x.as_ptr()) }
}
pub(crate) unsafe fn heap_clone<T: Clone>(source: NonNull<T>) -> NonNull<T> {
heap_move_nonnull(unsafe { source.as_ref().clone() })
}

View file

@ -1,6 +1,6 @@
use crate::{
containers::ByteSlice, heap_clone, heap_drop, heap_move_nonnull,
heap_move_ok,
containers::ByteSlice,
mem::{heap_clone, heap_drop, heap_move_nonnull, heap_move_ok},
};
use servicepoint::{CommandCode, Header, Packet};
use std::ptr::NonNull;

View file

@ -1,9 +1,13 @@
use crate::commands::{CommandTag, SPCommand};
use crate::{heap_drop, heap_move_ok, heap_remove};
use crate::{
commands::{CommandTag, SPCommand},
mem::{heap_drop, heap_move_ok, heap_remove},
};
use servicepoint::{Header, Packet, UdpSocketExt};
use std::ffi::{c_char, CStr};
use std::net::{Ipv4Addr, SocketAddrV4, UdpSocket};
use std::ptr::NonNull;
use std::{
ffi::{c_char, CStr},
net::{Ipv4Addr, SocketAddrV4, UdpSocket},
ptr::NonNull,
};
/// Creates a new instance of [UdpSocket].
///