Usage and Configuration
Relevant source files
This document provides a comprehensive guide for integrating and configuring the allocator crate in your projects. It covers dependency management, feature selection, basic usage patterns, and integration with Rust's standard library allocator API.
For detailed information about specific allocator implementations and their algorithms, see Allocator Implementations. For testing and performance evaluation, see Testing and Benchmarks.
Adding the Dependency
The allocator crate is designed as a feature-gated library that allows you to compile only the allocator implementations you need. Add it to your Cargo.toml dependencies section:
[dependencies]
allocator = "0.1.1"
By default, this enables only the bitmap page allocator with 256MB memory space support through the page-alloc-256m feature as defined in Cargo.toml(L13)
Feature Configuration
The crate provides a flexible feature system that allows selective compilation of allocator types and memory space configurations.
Feature Selection Overview
flowchart TD
subgraph subGraph4["API Integration"]
ALLOC_API["allocator_api"]
end
subgraph subGraph3["Page Size Features"]
SIZE_1T["page-alloc-1t"]
SIZE_64G["page-alloc-64g"]
SIZE_4G["page-alloc-4g"]
SIZE_256M["page-alloc-256m"]
end
subgraph subGraph2["Allocator Features"]
BITMAP["bitmap"]
TLSF["tlsf"]
SLAB["slab"]
BUDDY["buddy"]
end
subgraph subGraph1["Preset Features"]
DEFAULT["default"]
FULL["full"]
end
subgraph subGraph0["Feature Categories"]
PRESET["Preset Configurations"]
ALLOCATORS["Allocator Types"]
PAGE_SIZES["Page Allocator Sizes"]
INTEGRATION["Standard Library Integration"]
end
ALLOCATORS --> BITMAP
ALLOCATORS --> BUDDY
ALLOCATORS --> SLAB
ALLOCATORS --> TLSF
DEFAULT --> SIZE_256M
FULL --> ALLOC_API
FULL --> BITMAP
FULL --> BUDDY
FULL --> SIZE_256M
FULL --> SLAB
FULL --> TLSF
INTEGRATION --> ALLOC_API
PAGE_SIZES --> SIZE_1T
PAGE_SIZES --> SIZE_256M
PAGE_SIZES --> SIZE_4G
PAGE_SIZES --> SIZE_64G
PRESET --> DEFAULT
PRESET --> FULL
Sources: Cargo.toml(L12 - L27)
Available Features
| Feature | Purpose | Dependencies |
|---|---|---|
| default | Enables bitmap page allocator with 256MB support | page-alloc-256m |
| full | Enables all allocator types and API integration | All features |
| bitmap | Bitmap-based page allocator | bitmap-allocator v0.2 |
| tlsf | Two-Level Segregated Fit byte allocator | rlsf v0.2 |
| slab | Slab-based byte allocator | slab_allocator v0.3.1 |
| buddy | Buddy system byte allocator | buddy_system_allocator v0.10 |
| allocator_api | Standard library allocator trait integration | None |
| page-alloc-1t | 1TB memory space support | None |
| page-alloc-64g | 64GB memory space support | None |
| page-alloc-4g | 4GB memory space support | None |
| page-alloc-256m | 256MB memory space support | None |
Common Configuration Patterns
Minimal Configuration (Default):
[dependencies]
allocator = "0.1.1"
All Allocators Enabled:
[dependencies]
allocator = { version = "0.1.1", features = ["full"] }
Specific Allocator Selection:
[dependencies]
allocator = { version = "0.1.1", features = ["buddy", "tlsf", "allocator_api"] }
Large Memory Space Configuration:
[dependencies]
allocator = { version = "0.1.1", features = ["bitmap", "page-alloc-1t"] }
Sources: Cargo.toml(L12 - L34)
Basic Usage Patterns
The crate provides a trait-based interface that allows uniform interaction with different allocator implementations. The core traits are defined in src/lib.rs and enable polymorphic usage of allocators.
Allocator Type Selection
flowchart TD
subgraph subGraph3["Traits Used"]
BYTE_TRAIT["ByteAllocator trait"]
PAGE_TRAIT["PageAllocator trait"]
BASE_TRAIT["BaseAllocator trait"]
end
subgraph subGraph2["Page Allocators"]
BITMAP_PAGE["BitmapPageAllocator"]
end
subgraph subGraph1["Byte Allocators"]
BUDDY_BYTE["BuddyByteAllocator"]
SLAB_BYTE["SlabByteAllocator"]
TLSF_BYTE["TlsfByteAllocator"]
end
subgraph subGraph0["Allocation Granularity"]
BYTE_LEVEL["Byte-level Allocation"]
PAGE_LEVEL["Page-level Allocation"]
ID_LEVEL["ID-based Allocation"]
end
USE_CASE["Use Case Requirements"]
BITMAP_PAGE --> PAGE_TRAIT
BUDDY_BYTE --> BYTE_TRAIT
BYTE_LEVEL --> BUDDY_BYTE
BYTE_LEVEL --> SLAB_BYTE
BYTE_LEVEL --> TLSF_BYTE
BYTE_TRAIT --> BASE_TRAIT
PAGE_LEVEL --> BITMAP_PAGE
PAGE_TRAIT --> BASE_TRAIT
SLAB_BYTE --> BYTE_TRAIT
TLSF_BYTE --> BYTE_TRAIT
USE_CASE --> BYTE_LEVEL
USE_CASE --> ID_LEVEL
USE_CASE --> PAGE_LEVEL
Sources: src/lib.rs src/bitmap.rs src/buddy.rs src/slab.rs src/tlsf.rs
Integration Patterns
The allocators follow a consistent initialization and usage pattern:
- Initialization: Call
init()with memory region parameters - Memory Addition: Use
add_memory()to register additional memory regions - Allocation: Use type-specific allocation methods (
alloc,alloc_pages, etc.) - Deallocation: Use corresponding deallocation methods
- Statistics: Query memory usage through built-in statistics methods
Error Handling
All allocator operations return AllocResult<T>, which is a type alias for Result<T, AllocError>. The error types include:
InvalidParam: Invalid parameters passed to allocator functionsMemoryOverlap: Attempt to add overlapping memory regionsNoMemory: Insufficient memory for allocation requestNotAllocated: Attempt to deallocate memory that wasn't allocated
Sources: src/lib.rs
Standard Library Integration
When the allocator_api feature is enabled, the crate provides integration with Rust's standard library allocator interface through the AllocatorRc wrapper.
AllocatorRc Usage
flowchart TD
subgraph subGraph3["Standard Library"]
CORE_ALLOC["core::alloc::Allocator"]
end
subgraph subGraph2["Core Allocators"]
BYTE_ALLOC["ByteAllocator Implementation"]
end
subgraph subGraph1["Allocator Integration"]
ALLOC_RC["AllocatorRc"]
RC_REFCELL["Rc>"]
end
subgraph subGraph0["Application Code"]
APP["User Application"]
STD_COLLECTIONS["std::collections"]
end
ALLOC_RC --> CORE_ALLOC
ALLOC_RC --> RC_REFCELL
APP --> STD_COLLECTIONS
RC_REFCELL --> BYTE_ALLOC
STD_COLLECTIONS --> ALLOC_RC
The AllocatorRc provides:
- Reference-counted access to byte allocators
- Implementation of
core::alloc::Allocatortrait - Thread-safe usage through
RefCellinterior mutability - Compatibility with standard library collections
Sources: src/lib.rs Cargo.toml(L22)
Memory Space Configuration
The page allocator supports different maximum memory space configurations through mutually exclusive features:
| Feature | Maximum Memory | Use Case |
|---|---|---|
| page-alloc-256m | 256 MB | Small embedded systems, testing |
| page-alloc-4g | 4 GB | Desktop applications, moderate memory |
| page-alloc-64g | 64 GB | Server applications, large memory |
| page-alloc-1t | 1 TB | High-performance computing, very large memory |
These features control the underlying bitmap allocator size and should be selected based on your application's maximum memory requirements. Using a smaller configuration reduces memory overhead of the allocator itself.
Sources: Cargo.toml(L24 - L27)
Development Dependencies
When developing with or testing the allocator crate, additional dependencies are available:
- Testing: The
fullfeature is automatically enabled for development builds - Benchmarking:
criterionwith HTML reports for performance testing - Randomization:
randwithsmall_rngfeature for test data generation
These are configured as dev-dependencies and don't affect production builds.
Sources: Cargo.toml(L36 - L43)