diff options
Diffstat (limited to 'include/apos/mem_regions.h')
| -rw-r--r-- | include/apos/mem_regions.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/include/apos/mem_regions.h b/include/apos/mem_regions.h new file mode 100644 index 0000000..eb81e63 --- /dev/null +++ b/include/apos/mem_regions.h @@ -0,0 +1,36 @@ +#ifndef APOS_MEM_REGIONS_H +#define APOS_MEM_REGIONS_H + +#include <apos/types.h> +#include <apos/sp_tree.h> + +#define mem_container(ptr)\ + container_of(ptr, struct sp_mem, sp_n) + +struct sp_reg_root { + struct sp_root free_regions; + struct sp_root used_regions; +}; + +struct sp_mem { + struct sp_node sp_n; + + struct sp_mem *next; + struct sp_mem *prev; + + char flags; + + vm_t end; + vm_t start; +}; + +stat_t sp_mem_init(struct sp_reg_root *r, vm_t start, size_t arena_size); +vm_t alloc_region(struct sp_reg_root *r, size_t size, size_t *actual_size); +vm_t alloc_fixed_region(struct sp_reg_root *r, vm_t start, size_t size, size_t *actual_size); +stat_t free_region(struct sp_reg_root *r, vm_t start); + +struct sp_mem *sp_used_find(struct sp_reg_root *r, vm_t start); +struct sp_mem *sp_find_used_closest(struct sp_reg_root *r, vm_t start); +struct sp_mem *sp_find_free(struct sp_reg_root *r, size_t size, size_t *align); + +#endif /* APOS_MEM_REGIONS_H */ |
