From 626a887480c3e823323f51d82713c830d754f5b6 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Wed, 7 May 2025 08:53:49 +0200 Subject: [PATCH] move heap functions to own mod --- src/commands/bitmap_command.rs | 2 +- src/commands/bitvec_command.rs | 2 +- src/commands/brightness_grid_command.rs | 2 +- src/commands/cc_only_commands.rs | 2 +- src/commands/char_grid_command.rs | 2 +- src/commands/cp437_grid_command.rs | 2 +- src/commands/generic_command.rs | 22 ++++++++-------- src/commands/global_brightness_command.rs | 2 +- src/containers/bitmap.rs | 7 +++-- src/containers/bitvec.rs | 6 +++-- src/containers/brightness_grid.rs | 7 +++-- src/containers/char_grid.rs | 6 +++-- src/containers/cp437_grid.rs | 7 +++-- src/lib.rs | 31 +---------------------- src/mem.rs | 29 +++++++++++++++++++++ src/packet.rs | 4 +-- src/udp.rs | 14 ++++++---- 17 files changed, 82 insertions(+), 65 deletions(-) create mode 100644 src/mem.rs diff --git a/src/commands/bitmap_command.rs b/src/commands/bitmap_command.rs index 2adf9a8..d67a59f 100644 --- a/src/commands/bitmap_command.rs +++ b/src/commands/bitmap_command.rs @@ -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}; diff --git a/src/commands/bitvec_command.rs b/src/commands/bitvec_command.rs index bfe2d33..a717e0c 100644 --- a/src/commands/bitvec_command.rs +++ b/src/commands/bitvec_command.rs @@ -1,4 +1,4 @@ -use crate::{ +use crate::mem::{ heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove, }; use servicepoint::{ diff --git a/src/commands/brightness_grid_command.rs b/src/commands/brightness_grid_command.rs index bd975d6..ac4b302 100644 --- a/src/commands/brightness_grid_command.rs +++ b/src/commands/brightness_grid_command.rs @@ -1,4 +1,4 @@ -use crate::{ +use crate::mem::{ heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove, }; use servicepoint::{ diff --git a/src/commands/cc_only_commands.rs b/src/commands/cc_only_commands.rs index 751a6ab..ca24f7d 100644 --- a/src/commands/cc_only_commands.rs +++ b/src/commands/cc_only_commands.rs @@ -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; diff --git a/src/commands/char_grid_command.rs b/src/commands/char_grid_command.rs index bc078cd..d3f6816 100644 --- a/src/commands/char_grid_command.rs +++ b/src/commands/char_grid_command.rs @@ -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}; diff --git a/src/commands/cp437_grid_command.rs b/src/commands/cp437_grid_command.rs index eb42d15..2ab4e54 100644 --- a/src/commands/cp437_grid_command.rs +++ b/src/commands/cp437_grid_command.rs @@ -1,4 +1,4 @@ -use crate::{ +use crate::mem::{ heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove, }; use servicepoint::{ diff --git a/src/commands/generic_command.rs b/src/commands/generic_command.rs index 2b5327d..59eb8f8 100644 --- a/src/commands/generic_command.rs +++ b/src/commands/generic_command.rs @@ -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, @@ -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, diff --git a/src/commands/global_brightness_command.rs b/src/commands/global_brightness_command.rs index 29e7c19..9d1690c 100644 --- a/src/commands/global_brightness_command.rs +++ b/src/commands/global_brightness_command.rs @@ -1,4 +1,4 @@ -use crate::{ +use crate::mem::{ heap_clone, heap_drop, heap_move_nonnull, heap_move_ok, heap_remove, }; use servicepoint::{ diff --git a/src/containers/bitmap.rs b/src/containers/bitmap.rs index f928596..7a1b633 100644 --- a/src/containers/bitmap.rs +++ b/src/containers/bitmap.rs @@ -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, diff --git a/src/containers/bitvec.rs b/src/containers/bitvec.rs index fd1132d..e9eeb68 100644 --- a/src/containers/bitvec.rs +++ b/src/containers/bitvec.rs @@ -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, diff --git a/src/containers/brightness_grid.rs b/src/containers/brightness_grid.rs index b6b3f04..3a7ae5f 100644 --- a/src/containers/brightness_grid.rs +++ b/src/containers/brightness_grid.rs @@ -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, diff --git a/src/containers/char_grid.rs b/src/containers/char_grid.rs index 4e11e19..3363d43 100644 --- a/src/containers/char_grid.rs +++ b/src/containers/char_grid.rs @@ -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; diff --git a/src/containers/cp437_grid.rs b/src/containers/cp437_grid.rs index 3d3885a..a636295 100644 --- a/src/containers/cp437_grid.rs +++ b/src/containers/cp437_grid.rs @@ -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, diff --git a/src/lib.rs b/src/lib.rs index 8196e3b..14b172d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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(x: T) -> *mut T { - Box::into_raw(Box::new(x)) -} - -pub(crate) fn heap_move_nonnull(x: T) -> NonNull { - NonNull::from(Box::leak(Box::new(x))) -} - -pub(crate) fn heap_move_ok(x: Result) -> *mut T { - x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut()) -} - -pub(crate) fn heap_move_some(x: Option) -> *mut T { - x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut()) -} - -pub(crate) unsafe fn heap_drop(x: NonNull) { - drop(unsafe { heap_remove(x) }); -} - -pub(crate) unsafe fn heap_remove(x: NonNull) -> T { - unsafe { *Box::from_raw(x.as_ptr()) } -} - -unsafe fn heap_clone(source: NonNull) -> NonNull { - 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; diff --git a/src/mem.rs b/src/mem.rs new file mode 100644 index 0000000..6555999 --- /dev/null +++ b/src/mem.rs @@ -0,0 +1,29 @@ +use std::ptr::NonNull; + +pub(crate) fn heap_move(x: T) -> *mut T { + Box::into_raw(Box::new(x)) +} + +pub(crate) fn heap_move_nonnull(x: T) -> NonNull { + NonNull::from(Box::leak(Box::new(x))) +} + +pub(crate) fn heap_move_ok(x: Result) -> *mut T { + x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut()) +} + +pub(crate) fn heap_move_some(x: Option) -> *mut T { + x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut()) +} + +pub(crate) unsafe fn heap_drop(x: NonNull) { + drop(unsafe { heap_remove(x) }); +} + +pub(crate) unsafe fn heap_remove(x: NonNull) -> T { + unsafe { *Box::from_raw(x.as_ptr()) } +} + +pub(crate) unsafe fn heap_clone(source: NonNull) -> NonNull { + heap_move_nonnull(unsafe { source.as_ref().clone() }) +} diff --git a/src/packet.rs b/src/packet.rs index a6fde16..5fe7572 100644 --- a/src/packet.rs +++ b/src/packet.rs @@ -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; diff --git a/src/udp.rs b/src/udp.rs index 4f778b0..7c2ab2f 100644 --- a/src/udp.rs +++ b/src/udp.rs @@ -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]. ///