diff options
author | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-15 13:16:02 -0400 |
---|---|---|
committer | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-15 13:16:02 -0400 |
commit | dd5d9e1d48396cbc226ff14fe557a55613c91fcb (patch) | |
tree | b0ec9f54b80f26777ac08b723b42c1c64c5a2bda /lib/buddymap.h | |
parent | f46ab8ca2050ee77edf6e6b979875426bdaf29dc (diff) | |
download | jove-kernel-dd5d9e1d48396cbc226ff14fe557a55613c91fcb.tar.gz jove-kernel-dd5d9e1d48396cbc226ff14fe557a55613c91fcb.tar.bz2 jove-kernel-dd5d9e1d48396cbc226ff14fe557a55613c91fcb.zip |
better buddy memory allocator
Diffstat (limited to 'lib/buddymap.h')
-rw-r--r-- | lib/buddymap.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/buddymap.h b/lib/buddymap.h new file mode 100644 index 0000000..1af8dfb --- /dev/null +++ b/lib/buddymap.h @@ -0,0 +1,35 @@ +#ifndef JOVE_LIB_BUDDYMAP_H +#define JOVE_LIB_BUDDYMAP_H 1 + +#include <stddef.h> +#include <stdint.h> +#include <stdbool.h> + +#define BUDDY_BLOCK_BYTES sizeof(intmax_t) +#define BUDDY_BLOCK_BITS (BUDDY_BLOCK_BYTES * 8) + +#define BUDDY_BITS_FOR(range) (range * 2) +#define BUDDY_BLOCKS_FOR(range) (BUDDY_BITS_FOR(range) / BUDDY_BLOCK_BITS) + +struct BuddyMap +{ + size_t orders; + size_t bits; + size_t free; + uintmax_t **blocks; +}; + +#define BUDDY_BIT_PARTIAL 0 +#define BUDDY_BIT_FULL 1 + +bool buddy_bit_test(struct BuddyMap *map, size_t l, size_t i); +void buddy_bit_mark(struct BuddyMap *map, size_t l, size_t i); +void buddy_bit_free(struct BuddyMap *map, size_t l, size_t i); + +void buddy_mark_range(struct BuddyMap *map, size_t start, size_t end); +void buddy_free_range(struct BuddyMap *map, size_t start, size_t end); + +intmax_t buddy_alloc(struct BuddyMap *map, size_t length); +void buddy_free(struct BuddyMap *map, size_t i, size_t length); + +#endif |