#memory-allocator #memory #vulkan #allocator #suballocator #tlsf

xalloc

Suballocators for external memory (e.g., Vulkan device memory)

9 releases

Uses old Rust 2015

0.2.7 Dec 9, 2020
0.2.6 Feb 28, 2019
0.2.5 Dec 5, 2018
0.2.4 Nov 7, 2018
0.1.0 Oct 27, 2017

#293 in Memory management

Download history 58/week @ 2024-07-21 89/week @ 2024-07-28 71/week @ 2024-08-04 30/week @ 2024-08-11 22/week @ 2024-08-18 40/week @ 2024-08-25 72/week @ 2024-09-01 66/week @ 2024-09-08 53/week @ 2024-09-15 131/week @ 2024-09-22 141/week @ 2024-09-29 80/week @ 2024-10-06 136/week @ 2024-10-13 33/week @ 2024-10-20 81/week @ 2024-10-27 68/week @ 2024-11-03

330 downloads per month
Used in phosphor

MIT license

93KB
2K SLoC

xalloc

docs.rs

Dynamic suballocators for external memory (e.g., Vulkan device memory).

Provided Algorithms

Generic

Name Time Complexity Space Complexity
TLSF (Two-Level Segregated Fit) O(1) O(N + log size)
Free space bitmap O(size) O(size)

Specialized

Name Time Complexity Space Complexity
Ring buffer O(1) O(N)

(size: heap size measured by the number of allocation units, N: number of allocations)

Examples

use xalloc::{SysTlsf, SysTlsfRegion};
let mut tlsf = xalloc::SysTlsf::new(8u32);

// Allocate regions
let alloc1: (SysTlsfRegion, u32) = tlsf.alloc(4).unwrap();
let alloc2: (SysTlsfRegion, u32) = tlsf.alloc(4).unwrap();
let (region1, offset1) = alloc1;
let (region2, offset2) = alloc2;
println!("allocated #1: {:?}", (&region1, offset1));
println!("allocated #2: {:?}", (&region2, offset2));

// Deallocate a region
tlsf.dealloc(region1).unwrap();

// Now we can allocate again
tlsf.alloc(2).unwrap();
tlsf.alloc(2).unwrap();

Feature Flags

  • nightly — Enables optimizations which currently require a Nightly Rust compiler. This flag is now unused due to the stabilization of NonNull in Rust 1.25.

License: MIT

Dependencies

~485KB