mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-04-26 15:32:16 +00:00
More memory allocators
This commit is contained in:
parent
8d4be9a714
commit
4ce8c7a6b0
@ -323,9 +323,9 @@ class Root {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses the specified free block, removing it from internal maps and
|
* Uses the specified free block, removing it from internal maps and
|
||||||
* splitting it if possible.
|
* splitting it if possible, and returns its data pointer.
|
||||||
*/
|
*/
|
||||||
use(block: Block, size: usize): void {
|
use(block: Block, size: usize): usize {
|
||||||
assert(block.info & FREE); // must be free so we can use it
|
assert(block.info & FREE); // must be free so we can use it
|
||||||
assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid
|
assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid
|
||||||
assert(!(size & AL_MASK)); // size must be aligned so the new block is
|
assert(!(size & AL_MASK)); // size must be aligned so the new block is
|
||||||
@ -349,6 +349,8 @@ class Root {
|
|||||||
var right: Block = assert(block.right); // can't be null (tail)
|
var right: Block = assert(block.right); // can't be null (tail)
|
||||||
right.info &= ~LEFT_FREE;
|
right.info &= ~LEFT_FREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return changetype<usize>(block) + Block.INFO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds more memory to the pool. */
|
/** Adds more memory to the pool. */
|
||||||
@ -409,9 +411,9 @@ export function allocate_memory(size: usize): usize {
|
|||||||
var rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;
|
var rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;
|
||||||
ROOT = root = changetype<Root>(rootOffset);
|
ROOT = root = changetype<Root>(rootOffset);
|
||||||
root.flMap = 0;
|
root.flMap = 0;
|
||||||
for (var fl = 0; fl < FL_BITS; ++fl) {
|
for (var fl: usize = 0; fl < FL_BITS; ++fl) {
|
||||||
root.setSLMap(fl, 0);
|
root.setSLMap(fl, 0);
|
||||||
for (var sl = 0; sl < SL_SIZE; ++sl)
|
for (var sl: u32 = 0; sl < SL_SIZE; ++sl)
|
||||||
root.setHead(fl, sl, null);
|
root.setHead(fl, sl, null);
|
||||||
}
|
}
|
||||||
root.addMemory(rootOffset + Root.SIZE, current_memory() << 16);
|
root.addMemory(rootOffset + Root.SIZE, current_memory() << 16);
|
||||||
@ -436,8 +438,7 @@ export function allocate_memory(size: usize): usize {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert((block.info & ~TAGS) >= size);
|
assert((block.info & ~TAGS) >= size);
|
||||||
root.use(block, size);
|
data = root.use(block, size);
|
||||||
data = changetype<usize>(block) + Block.INFO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
@ -454,4 +455,5 @@ export function free_memory(data: usize): void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { set_memory };
|
// For stand-alone usage, e.g., in tests
|
||||||
|
export { move_memory, set_memory, compare_memory };
|
||||||
|
20
std/assembly/allocator/emscripten.ts
Normal file
20
std/assembly/allocator/emscripten.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
///////////////////////// Emscripten Memory Allocator //////////////////////////
|
||||||
|
|
||||||
|
// Uses Emscripten's exported _malloc and _free implementations, i.e., when
|
||||||
|
// linking with Emscripten-compiled programs that already provide these.
|
||||||
|
// Differs from 'system' in that their names are prefixed with an underscore.
|
||||||
|
|
||||||
|
declare function _malloc(size: usize): usize;
|
||||||
|
declare function _free(ptr: usize): void;
|
||||||
|
|
||||||
|
export function allocate_memory(size: usize): usize {
|
||||||
|
return _malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function free_memory(ptr: usize): void {
|
||||||
|
_free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function reset_memory(): void {
|
||||||
|
throw new Error("not supported");
|
||||||
|
}
|
19
std/assembly/allocator/system.ts
Normal file
19
std/assembly/allocator/system.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/////////////////////////// System Memory Allocator ////////////////////////////
|
||||||
|
|
||||||
|
// Uses the environment's malloc and free implementations, i.e., when linking
|
||||||
|
// with other C-like programs that already provide these.
|
||||||
|
|
||||||
|
declare function malloc(size: usize): usize;
|
||||||
|
declare function free(ptr: usize): void;
|
||||||
|
|
||||||
|
export function allocate_memory(size: usize): usize {
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function free_memory(ptr: usize): void {
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function reset_memory(): void {
|
||||||
|
throw new Error("not supported");
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
////////////// TLSF (Two-Level Segregate Fit) Memory Allocator ////////////////
|
||||||
|
|
||||||
// Re-export for now, so there's just one source file being worked on
|
// Re-export for now, so there's just one source file being worked on
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user