#macro-derive #drop #free #structs #memory #field #filecoin

macro drop_struct_macro_derive

A derive macro to free (drop) memory for structs that are used in the FFI

7 releases (4 breaking)

0.5.0 Jun 1, 2021
0.4.1 Jun 1, 2021
0.4.0 Oct 17, 2019
0.3.0 Jun 20, 2019
0.1.1 Jun 4, 2019

#1819 in Procedural macros


Used in 2 crates

MIT/Apache

8KB
93 lines

Drop struct macro derive

A derive macro to free (drop) memory for structs that are used in the FFI.

Currently only c-strings (libc::c_char) and arrays (represented as a pointer and a length field) are supported.

Example:

#[repr(C)]
#[derive(DropStructMacro)]
pub struct FFIStagedSectorMetadata {
    pub sector_access: *const libc::c_char,
    pub sector_id: u64,
    pub pieces_len: libc::size_t,
    pub pieces_ptr: *const FFIPieceMetadata,

    // must be one of: Pending, Failed, Sealing
    pub seal_status_code: FFISealStatus,

    // if sealing failed - here's the error
    pub seal_error_msg: *const libc::c_char,
}

Will automatically create:

impl Drop for FFIStagedSectorMetadata {
    fn drop(&mut self) {
        unsafe {
            free_c_str(self.sector_access as *mut libc::c_char);
            drop(Vec::from_raw_parts(
                self.pieces_ptr as *mut FFIPieceMetadata,
                self.pieces_len,
                self.pieces_len,
            ));
            free_c_str(self.seal_error_msg as *mut libc::c_char);
        };
    }
}

To view the generated output after the macro was applied, you can use cargo-expand:

$ cd filecoin-proofs
$ cargo expand --lib api::responses
    Checking filecoin-proofs v0.1.0 (/home/vmx/src/pl/filecoin/rust-fil-proofs/filecoin-proofs)
    Finished dev [unoptimized + debuginfo] target(s) in 0.70s

pub mod responses {
    use crate::sector_builder::errors::SectorBuilderErr;
    use crate::sector_builder::SectorBuilder;
    use crate::API_POREP_PROOF_BYTES;
    use drop_struct_macro_derive::DropStructMacro;
    use failure::Error;
…

License

MIT or Apache 2.0

Dependencies

~2MB
~46K SLoC