Added constructors for heap and resource table

This commit is contained in:
2021-04-17 06:25:46 -05:00
parent 291ed65248
commit 7dd19d0c2a
4 changed files with 43 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "pageallocator.h"
#include "process.h" #include "process.h"
#include <stddef.h> #include <stddef.h>
@@ -28,6 +29,8 @@ struct priority_queue_t
size_t capacity; size_t capacity;
}; };
int construct_priority_queue(struct priority_queue_t *queue, struct page_stack_t *page_stack);
/** /**
* @brief * @brief
* *

View File

@@ -25,4 +25,6 @@ struct resource_table_t
struct resource_t *limit; struct resource_t *limit;
}; };
int construct_resource_table(struct resource_table_t *table, struct page_stack_t *page_stack);
int get_free_resource_slot(struct resource_table_t *table, struct page_stack_t *page_stack); int get_free_resource_slot(struct resource_table_t *table, struct page_stack_t *page_stack);

View File

@@ -1,4 +1,6 @@
#include "priorityqueue.h" #include "priorityqueue.h"
#include "allocator.h"
#include "mmgr.h"
#include "types/status.h" #include "types/status.h"
void heapify(struct priority_queue_t *queue, size_t i) void heapify(struct priority_queue_t *queue, size_t i)
@@ -25,6 +27,22 @@ void heapify(struct priority_queue_t *queue, size_t i)
} }
} }
int construct_priority_queue(struct priority_queue_t *queue, struct page_stack_t *page_stack)
{
queue->heap = allocate_from_bottom(page_size);
if(queue->heap == NULL)
{
return S_OUT_OF_MEMORY;
}
int status = map_page(page_stack, queue->heap, reserve_page(page_stack), PAGE_RW);
if(status == S_OK)
{
queue->capacity = page_size / sizeof(struct process_t*);
queue->size = 0;
}
return status;
}
struct process_t *extract_min(struct priority_queue_t *queue) struct process_t *extract_min(struct priority_queue_t *queue)
{ {
if(queue->size == 0) if(queue->size == 0)

View File

@@ -3,6 +3,26 @@
#include "allocator.h" #include "allocator.h"
#include "types/status.h" #include "types/status.h"
int construct_resource_table(struct resource_table_t *table, struct page_stack_t *page_stack)
{
if(table == NULL)
{
return S_NULL_POINTER;
}
void *table_ptr = allocate_from_bottom(page_size);
if(table_ptr == NULL)
{
return S_OUT_OF_MEMORY;
}
int status = map_page(page_stack, table_ptr, reserve_page(page_stack), PAGE_RW);
if(status == S_OK)
{
table->array = (struct resource_t*)table_ptr;
table->limit = (struct resource_t*)(table_ptr + page_size);
}
return status;
}
int get_free_resource_slot(struct resource_table_t *table, struct page_stack_t *page_stack) int get_free_resource_slot(struct resource_table_t *table, struct page_stack_t *page_stack)
{ {
if(table == NULL) if(table == NULL)