microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.8.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

allocator/src/mimalloc.rs

79lines · modeblame

93f01d0dIan Davis2 years ago1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use core::alloc::{GlobalAlloc, Layout};
5use core::ffi::c_void;
6
7use mimalloc_sys::{mi_free, mi_malloc_aligned, mi_realloc_aligned, mi_zalloc_aligned};
8
9pub struct Mimalloc;
10
11unsafe impl GlobalAlloc for Mimalloc {
12#[inline]
13unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
14debug_assert!(layout.align() < mimalloc_sys::MI_ALIGNMENT_MAX);
15mi_malloc_aligned(layout.size(), layout.align()).cast::<u8>()
16}
17
18#[inline]
19unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
20mi_free(ptr.cast::<c_void>());
21}
22
23#[inline]
24unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
25debug_assert!(layout.align() < mimalloc_sys::MI_ALIGNMENT_MAX);
26mi_zalloc_aligned(layout.size(), layout.align()).cast::<u8>()
27}
28
29#[inline]
30unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
31debug_assert!(layout.align() < mimalloc_sys::MI_ALIGNMENT_MAX);
32mi_realloc_aligned(ptr.cast::<c_void>(), new_size, layout.align()).cast::<u8>()
33}
34}
35
36#[cfg(test)]
37mod tests {
38use super::*;
39use std::error::Error;
40
41#[test]
42fn memory_can_be_allocated_and_freed() -> Result<(), Box<dyn Error>> {
43let layout = Layout::from_size_align(8, 8)?;
44let alloc = Mimalloc;
45
46unsafe {
47let ptr = alloc.alloc(layout);
48assert!(!ptr.cast::<c_void>().is_null());
49alloc.dealloc(ptr, layout);
50}
51Ok(())
52}
53
54#[test]
55fn memory_can_be_alloc_zeroed_and_freed() -> Result<(), Box<dyn Error>> {
56let layout = Layout::from_size_align(8, 8)?;
57let alloc = Mimalloc;
58
59unsafe {
60let ptr = alloc.alloc_zeroed(layout);
61assert!(!ptr.cast::<c_void>().is_null());
62alloc.dealloc(ptr, layout);
63}
64Ok(())
65}
66
67#[test]
68fn large_chunks_of_memory_can_be_allocated_and_freed() -> Result<(), Box<dyn Error>> {
69let layout = Layout::from_size_align(2 * 1024 * 1024 * 1024, 8)?;
70let alloc = Mimalloc;
71
72unsafe {
73let ptr = alloc.alloc(layout);
74assert!(!ptr.cast::<c_void>().is_null());
75alloc.dealloc(ptr, layout);
76}
77Ok(())
78}
79}