/**
@file heap.c
@brief See header for details
- $Revision$
- $HeadURL$
- */
+*/
#include "heap.h"
+#include <stdlib.h>
heap_t* heap_create(void)
{
- return NULL;
+ heap_t* heap = (heap_t*)calloc(1u, sizeof(heap_t));
+ return heap;
}
void heap_destroy(heap_t* heap)
{
- (void)heap;
+ int i;
+ for (i = 0; i < NUM_HEAP_STACKS; i++) {
+ segnode_t* curr = heap->heaps[i];
+ while (NULL != curr) {
+ segnode_t* deadite = curr;
+ curr = deadite->next;
+ segment_destroy(deadite->segment);
+ free(deadite);
+ }
+ }
+ free(heap);
+}
+
+void* allocate_small_block(heap_t* heap, uintptr_t num_slots)
+{
+ uintptr_t index = num_slots - HEAP_INDEX_OFFSET;
+ printf("index: %d, %d\n", (unsigned int)index, (unsigned int)num_slots);
+ segnode_t* node = heap->heaps[index];
+ if ((NULL == node) || segment_full(node->segment)) {
+ segnode_t* newnode = (segnode_t*)malloc(sizeof(segnode_t));
+ newnode->segment = segment_create(num_slots);
+ newnode->next = node;
+ heap->heaps[index] = newnode;
+ node = newnode;
+ }
+ return segment_alloc(heap->heaps[index]->segment);
}
-void* heap_allocate(size_t block_size)
+void* allocate_large_block(heap_t* heap, uintptr_t num_slots)
{
- (void)block_size;
return NULL;
}
+void* heap_allocate(heap_t* heap, uintptr_t num_slots)
+{
+ void* obj = NULL;
+ if (num_slots <= MAX_NUM_SLOTS) {
+ obj = allocate_small_block(heap, num_slots);
+ } else {
+ obj = allocate_large_block(heap, num_slots);
+ }
+ return obj;
+}
+
#include "segment.h"
-#define NUM_HEAP_STACKS ((sizeof(uintptr_t) * 8u) - 3u)
+#define MIN_NUM_SLOTS (2u)
+
+#define MAX_NUM_SLOTS ((sizeof(uintptr_t)*8u) - 1u)
+
+#define HEAP_INDEX_OFFSET (MIN_NUM_SLOTS)
+
+#define NUM_HEAP_STACKS ((sizeof(uintptr_t) * 8u) - 1)
typedef struct segnode_t {
segment_t* segment;
typedef struct {
uintptr_t bytes_allocated;
- struct {
- segnode_t* first;
- segnode_t* last;
- } heaps[NUM_HEAP_STACKS];
+ segnode_t* heaps[NUM_HEAP_STACKS];
} heap_t;
heap_t* heap_create(void);
void heap_destroy(heap_t* heap);
-void* heap_allocate(size_t block_size);
+void* heap_allocate(heap_t* heap, uintptr_t num_slots);
#endif /* HEAP_H */
free(seg);
}
+bool segment_full(segment_t* seg) {
+ return (0u == seg->blockmap[0]);
+}
+
void* segment_alloc(segment_t* seg) {
void* obj = NULL;
/* Check if the segment has any free blocks */
- if (0u != seg->blockmap[0]) {
+ if (!segment_full(seg)) {
/* Find the free block */
uint8_t root_idx = get_free_index(seg->blockmap[0]);
uint8_t submap_idx = get_free_index(seg->blockmap[root_idx + 1]);
void segment_destroy(segment_t* seg);
+bool segment_full(segment_t* seg);
+
void* segment_alloc(segment_t* seg);
#endif /* SEGMENT_H */
(void)argv;
RUN_EXTERN_TEST_SUITE(SplayTree);
RUN_EXTERN_TEST_SUITE(Segment);
+ RUN_EXTERN_TEST_SUITE(Heap);
return PRINT_TEST_RESULTS();
}
--- /dev/null
+#include "atf.h"
+#include "heap.h"
+
+TEST_SUITE(Heap) {
+ /* Verify: heap_create
+ *************************************************************************/
+ TEST(Verify_Create_allocates_and_initializes_a_heap) {
+ heap_t* heap = heap_create();
+ CHECK(heap != NULL);
+
+ CHECK(NULL != heap_allocate(heap, 63));
+ heap_destroy(heap);
+ }
+
+ /* Verify: segment_alloc
+ *************************************************************************/
+}