Crate mtb_entity_slab

Crate mtb_entity_slab 

Source
Expand description

§MTB Entity Allocator and Utilities

Address-stable, internally mutable entity Slab allocator. Mainly solves the problem where Slab cannot allocate new elements while reading existing ones.

地址稳定、内部可变的实体 Slab 分块分配器. 主要解决 Slab 无法在读取元素的同时 分配新元素的问题.

§Example 使用示例

use mtb_entity_slab::*;

#[derive(Debug, Clone, PartialEq, Eq)]
struct Inst {
    pub opcode: u32,
    pub operands: [u64; 4],
    pub heap_data: String,
}

impl Inst {
    fn new(opcode: u32) -> Self {
        Self {
            opcode,
            operands: [0; 4],
            heap_data: format!("InstData{}", opcode),
        }
    }
}

fn main() {
    let mut alloc: EntityAlloc<Inst> = EntityAlloc::with_capacity(1024);
    let ptrs = {
        let mut v = Vec::new();
        for i in 0..1000 {
            let ptr = alloc.allocate(Inst::new(i));
            v.push(ptr);
        }
        v
    };

    let inst = ptrs[500].deref(&alloc);

    // Allocates a new element while reading existing ones
    // 在读取时分配新元素
    let new_id = alloc.allocate(Inst::new(2000));
    assert_eq!(inst.opcode, 500);
    assert_eq!(new_id.deref(&alloc).opcode, 2000);

    for &ptr in ptrs.iter() {
        let inst = ptr.deref(&alloc);
        let indexed_id = ptr.get_index(&alloc).unwrap();
        assert_eq!(inst.opcode as usize, indexed_id);
        assert!(ptr.free(&mut alloc).is_some());
    }
}

§Safety 安全性

This crate provides access to allocated elements via PtrID. PtrID contains a raw pointer, and most operations on PtrID are safe, but there is no ABA usage detection.

This crate is designed for Remusys-IR and is for learning purposes only. It does not guarantee safety in all scenarios. Please carefully assess the risks when using it in production environments.

本库通过 PtrID 提供对分配元素的访问. PtrID 内部包含裸指针, 对 PtrID 的大多数操作都是安全的, 但没有 ABA 使用检测.

本库为 Remusys-IR 设计, 仅为学习用途, 不保证在所有场景下的安全性. 在生产环境中使用时请谨慎评估风险.

Structs§

AllocPolicy128
Entity allocation policy for chunks of size 128.
AllocPolicy256
Entity allocation policy for chunks of size 256.
AllocPolicy512
Entity allocation policy for chunks of size 512.
AllocPolicy1024
Entity allocation policy for chunks of size 1024.
AllocPolicy2048
Entity allocation policy for chunks of size 2048.
AllocPolicy4096
Entity allocation policy for chunks of size 4096.
EntityAlloc
EntityAllocConsumeIter
EntityAllocEditIter
EntityAllocReadIter
EntityList
EntityListIter
EntityListNodeHead
EntityListRange
A partial-close range of an entity pointer list representing [start, end).
EntityRingList
EntityRingListIter
IndexedID
PtrID

Enums§

EntityListError
SlicePtrError

Constants§

MTBLIB_PACKAGE_NAME
MTBLIB_PACKAGE_VERSION
NULL_INDEXED_ID

Traits§

IAllocPolicy
IEntityAllocID
IEntityListNodeID
IEntityRingListNodeID
An entity pointer list node that supports ring lists.
IPolicyPtrID
Pointer ID wrapper of allocated entities with a specialized policy

Type Aliases§

EntityListRes

Attribute Macros§

entity_ptr_id
Syntax: