#binding #mi-malloc #pull-request #requests #allocator #open #functionalities

yanked mimalloc2-rust

the fork of the best binding for mimalloc in rust

3 releases

new 0.3.2 Jun 4, 2024
0.3.1 Apr 24, 2024
0.3.0 Feb 26, 2024

#2 in #mi-malloc

Download history 273/week @ 2024-02-22 499/week @ 2024-02-29 385/week @ 2024-03-07 96/week @ 2024-03-14 31/week @ 2024-03-21 40/week @ 2024-03-28 72/week @ 2024-04-04 175/week @ 2024-04-11 219/week @ 2024-04-18 227/week @ 2024-04-25 430/week @ 2024-05-02 74/week @ 2024-05-09 77/week @ 2024-05-16 118/week @ 2024-05-23 248/week @ 2024-05-30

636 downloads per month

MIT license

17KB
395 lines

The Best and Highest-Leveled and Newest binding for MiMalloc Ever Existed in Rust

mimalloc 2.1.7 stable

Why create this

  • in repo https://github.com/LemonHX/mimalloc-rust/pulls there're many pull requests open for a long time, in other words it's garbage. Once these pull requests are merged, I am going to yank this crate.
  • in repo https://github.com/purpleprotocol/mimalloc_rust i didn't see any data types and it neither has all the functionalities which mimalloc has provided, in other words it's garbage.

Usage

first add to dependencies

[dependencies]
mimalloc2-rust = "0.3"

then set the global allocator

use mimalloc2_rust::*;

#[global_allocator]
static GLOBAL_MIMALLOC: GlobalMiMalloc = GlobalMiMalloc;

lib.rs:

this crate provides the best binding for mimalloc

Example Usage

first add to dependencies

[dependencies]
mimalloc2-rust = "0.3"

then set the global allocator

use mimalloc2_rust::*;

#[global_allocator]
static GLOBAL_MIMALLOC: GlobalMiMalloc = GlobalMiMalloc;

Allocator API!

#![feature(allocator_api)]
use std::{ffi::c_void, mem::ManuallyDrop};

use mimalloc2_rust::{
    heap::{HeapVisitor, MiMallocHeap},
    raw::{
        heap::{mi_heap_area_t, mi_heap_delete, mi_heap_new},
        types::mi_heap_t,
    },
    with_heap, GlobalMiMalloc,
};

#[derive(Debug, Clone)]
struct TestHeap {
    heap: *mut mi_heap_t,
}
use std::ops::Deref;
impl Deref for TestHeap {
    type Target = *mut mi_heap_t;

    fn deref(&self) -> &Self::Target {
        &self.heap
    }
}

impl TestHeap {
    fn new() -> Self {
        Self {
            heap: unsafe { mi_heap_new() },
        }
    }
}

impl Drop for TestHeap {
    fn drop(&mut self) {
        unsafe { mi_heap_delete(self.heap) }
    }
}

#[test]
fn test_allocator_api() {
    let allocator = MiMallocHeap::new(TestHeap::new());
    let mut b: Vec<u8, &MiMallocHeap<TestHeap>> = Vec::new_in(&allocator);
    b.push(1);
    b.push(2);
    assert_eq!(b[0], 1);
    assert_eq!(b[1], 2);
}

Dependencies

~700KB
~13K SLoC