All Projects → thi-ng → Tinyalloc

thi-ng / Tinyalloc

Licence: apache-2.0
malloc / free replacement for unmanaged, linear memory situations (e.g. WASM, embedded devices...)

Programming Languages

c
50402 projects - #5 most used programming language

Projects that are alternatives of or similar to Tinyalloc

Sod
An Embedded Computer Vision & Machine Learning Library (CPU Optimized & IoT Capable)
Stars: ✭ 1,460 (+126.71%)
Mutual labels:  webassembly, embedded
Wasmjit
Small Embeddable WebAssembly Runtime
Stars: ✭ 1,063 (+65.06%)
Mutual labels:  webassembly, embedded
Raylib
A simple and easy-to-use library to enjoy videogames programming
Stars: ✭ 8,169 (+1168.48%)
Mutual labels:  embedded, webassembly
o1heap
Constant-complexity deterministic memory allocator (heap) for hard real-time high-integrity embedded systems
Stars: ✭ 119 (-81.52%)
Mutual labels:  embedded, memory
pydevmem
Python interface to /dev/mem
Stars: ✭ 41 (-93.63%)
Mutual labels:  embedded, memory
Wasm Micro Runtime
WebAssembly Micro Runtime (WAMR)
Stars: ✭ 2,440 (+278.88%)
Mutual labels:  webassembly, embedded
Rhai
Rhai - An embedded scripting language for Rust.
Stars: ✭ 958 (+48.76%)
Mutual labels:  webassembly, embedded
Lwmem
Lightweight dynamic memory manager library for embedded systems with memory constraints. It implements malloc, calloc, realloc and free functions
Stars: ✭ 92 (-85.71%)
Mutual labels:  memory, embedded
TypeScriptXX
🧷 Stay safe! Type-safe scripting for C++ using TypeScriptToLua and CMake with auto-generated declarations.
Stars: ✭ 33 (-94.88%)
Mutual labels:  embedded, webassembly
Wasm3
🚀 The fastest WebAssembly interpreter, and the most universal runtime
Stars: ✭ 4,375 (+579.35%)
Mutual labels:  webassembly, embedded
Q3vm
Q3VM - Single file (vm.c) bytecode virtual machine/interpreter for C-language input
Stars: ✭ 585 (-9.16%)
Mutual labels:  embedded
Astro
A fun safe language for rapid prototyping and high performance applications
Stars: ✭ 588 (-8.7%)
Mutual labels:  webassembly
Pycopy
Pycopy - a minimalist and memory-efficient Python dialect. Good for desktop, cloud, constrained systems, microcontrollers, and just everything.
Stars: ✭ 613 (-4.81%)
Mutual labels:  embedded
Graphql Client
Typed, correct GraphQL requests and responses in Rust
Stars: ✭ 620 (-3.73%)
Mutual labels:  webassembly
Element Blazor
A Web UI Library based on Element and Blazor WebAssembly.
Stars: ✭ 585 (-9.16%)
Mutual labels:  webassembly
Eliasdb
EliasDB a graph-based database.
Stars: ✭ 611 (-5.12%)
Mutual labels:  embedded
Embox
Modular and configurable OS for embedded applications
Stars: ✭ 576 (-10.56%)
Mutual labels:  embedded
Heim
Cross-platform async library for system information fetching 🦀
Stars: ✭ 572 (-11.18%)
Mutual labels:  memory
Arduinojson
📟 JSON library for Arduino and embedded C++. Simple and efficient.
Stars: ✭ 5,456 (+747.2%)
Mutual labels:  embedded
Memoscope.net
Dump and analyze .Net applications memory ( a gui for WinDbg and ClrMd )
Stars: ✭ 626 (-2.8%)
Mutual labels:  memory

thi.ng/tinyalloc

Tiny replacement for malloc / free in unmanaged, linear memory situations, e.g. WASM and embedded devices.

Features

  • written in standalone C11, no dependencies, C runtime or syscalls used
  • configurable address region (and max. block count) for heap space
  • configurable pointer alignment in heap space
  • optional compaction of consecutive free blocks
  • optional block splitting during alloc (if re-using larger free'd blocks)
  • tiny, the WASM binary is 1.5KB (1.1KB w/ compaction disabled)

Details

tinyalloc maintains 3 linked lists: fresh blocks, used blocks, free blocks. All lists are stored in the same fixed sized array so the memory overhead can be controlled at compile time via the configuration vars listed below. During initialization all blocks are added to the list of fresh blocks.

The difference between free & fresh blocks is the former already have an associated heap address and size from previous usage. OTOH fresh blocks are uninitialized and are only used if no existing free blocks satisfy an allocation request.

The diagram illustrates the state of having 1 freed block (green), 2 used blocks (red) and the beginning of the fresh (unused) block list:

memory layout

Allocation

When a new chunk of memory is requested, all previously freed blocks are checked for potential re-use. If a block is found, is larger than the requested size and the size difference is greater than the configured threshold (TA_SPLIT_THRESH), then the block is first split, the chunks added to the used & free lists respectively and the pointer to the first chunk returned to the user. If no blocks in the free list qualify, a new block is allocated at the current heap top address, moved from the "fresh" to the "used" block list and the pointer returned to the caller.

Note: All returned pointers are aligned to TA_ALIGN word boundaries. Same goes for allocated block sizes. Also, allocation will fail when all blocks in the fixed size block array are used, even though there might still be ample space in the heap memory region...

Freeing & compaction

The list of freed blocks is sorted by block start address. When a block is being freed, tinyalloc uses insertion sort to add the block at the right list position and then runs a compaction procedure, merging blocks as long as they form consecutive chunks of memory (with no gaps in between them). The resulting obsolete blocks are re-added to the list of available blocks.

API

ta_init(void *base, void *limit, size_t heap_blocks, size_t split_thresh, size_t alignment)

Initializes the control datastructure. MUST be called prior to any other tinyalloc function.

Argument Description
base Address of tinyalloc control structure, typically at the beginning of your heap
limit Heap space end address
heap_blocks Max. number of memory chunks (e.g. 256)
split_thresh Size threshold for splitting chunks (a good default is 16)
alignment Word size for pointer alignment (e.g. 8)
  • alignment is assumed to be >= native word size
  • base must be an address in RAM (on embedded devices)

void* ta_alloc(size_t num)

Like standard malloc, returns aligned pointer to address in heap space, or NULL if allocation failed.

void* ta_calloc(size_t num, size_t t)

Like standard calloc, returns aligned pointer to zeroed memory in heap space, or NULL if allocation failed.

bool ta_free(void *ptr)

Like free, but returns boolean result (true, if freeing succeeded). By default, any consecutive memory blocks are being merged during the freeing operation.

bool ta_check()

Structural validation. Returns true if internal heap structure is ok.

Building

Configuration

Define Default Comment
TA_DEBUG undefined Trace debug information
TA_DISABLE_COMPACT undefined Disable free block compaction
TA_DISABLE_SPLIT undefined Disable free block splitting during re-alloc

On a 32bit system, the default configuration causes an overhead of 3088 bytes in RAM, but can be reduced if fewer memory blocks are needed.

Notes:

If building in debug mode (if TA_DEBUG symbol is defined), two externally defined functions are required:

  • print_s(char *) - to print a single string
  • print_i(size_t) - to print a single unsigned int

Building for WASM

(Requires emscripten)

emcc -Oz -s WASM=1 -s SIDE_MODULE=1 -o tinyalloc.wasm tinyalloc.c

Disassemble to WAST

(Requires WABT)

wasm2wast --generate-names tinyalloc.wasm > tinyalloc.wast

License

© 2016 - 2017 Karsten Schmidt - Apache Software License 2.0 (see LICENSE)

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].