diff options
| author | Aldrik Ramaekers <aldrikboy@gmail.com> | 2024-03-03 14:29:17 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrikboy@gmail.com> | 2024-03-03 14:29:17 +0100 |
| commit | a3685d46c883c96e122b12bfebc6975705962e07 (patch) | |
| tree | cddf8e88aee97ffe791ebaf5a5243d2346d8450d /src/memory_bucket.cpp | |
v2 initial commit
Diffstat (limited to 'src/memory_bucket.cpp')
| -rw-r--r-- | src/memory_bucket.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/memory_bucket.cpp b/src/memory_bucket.cpp new file mode 100644 index 0000000..71cc79a --- /dev/null +++ b/src/memory_bucket.cpp @@ -0,0 +1,68 @@ +#include "memory_bucket.h" + +memory_bucket memory_bucket_init(int bucket_size) +{ + memory_bucket collection; + collection.bucket_mutex = mutex_create(); + collection.buckets = array_create(sizeof(memory_bucket_entry)); + + memory_bucket_entry bucket; + bucket.data = (char*)malloc(bucket_size); + bucket.length = bucket_size; + bucket.cursor = 0; + array_push(&collection.buckets, &bucket); + return collection; +} + +void* memory_bucket_reserve(memory_bucket *bucket, int reserve_length) +{ + mutex_lock(&bucket->bucket_mutex); + memory_bucket_entry *bucket_entry = 0; + for (int i = 0; i < bucket->buckets.length; i++) + { + bucket_entry = (memory_bucket_entry *)array_at(&bucket->buckets, i); + + if (bucket_entry->length - bucket_entry->cursor < reserve_length) continue; + + void *space = bucket_entry->data+bucket_entry->cursor; + bucket_entry->cursor += reserve_length; + mutex_unlock(&bucket->bucket_mutex); + + return space; + } + + // failed to find suitable space, allocate new bucket + memory_bucket_entry new_bucket; + new_bucket.data = (char*)malloc(bucket_entry->length); + new_bucket.length = bucket_entry->length; + new_bucket.cursor = 0; + array_push(&bucket->buckets, &new_bucket); + mutex_unlock(&bucket->bucket_mutex); + + return new_bucket.data; +} + +inline void memory_bucket_reset(memory_bucket *bucket) +{ + mutex_lock(&bucket->bucket_mutex); + for (int i = 0; i < bucket->buckets.length; i++) + { + memory_bucket_entry *bucket_entry = (memory_bucket_entry *)array_at(&bucket->buckets, i); + bucket_entry->cursor = 0; + } + mutex_unlock(&bucket->bucket_mutex); +} + +inline void memory_bucket_destroy(memory_bucket *bucket) +{ + mutex_lock(&bucket->bucket_mutex); + for (int i = 0; i < bucket->buckets.length; i++) + { + memory_bucket_entry *bucket_entry = (memory_bucket_entry *)array_at(&bucket->buckets, i); + free(bucket_entry->data); + } + array_destroy(&bucket->buckets); + mutex_unlock(&bucket->bucket_mutex); + + mutex_destroy(&bucket->bucket_mutex); +}
\ No newline at end of file |
