Added constructors for heap and resource table
This commit is contained in:
@@ -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
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user