Added queue structure

This commit is contained in:
2022-08-15 20:20:31 -05:00
parent bdb0b753a3
commit 5b959c9763
7 changed files with 125 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
noinst_PROGRAMS = quark-kernel
quark_kernel_SOURCES = kernel.c mmgr.c priorityqueue.c stdio.c string.c elf.c syscalls.c heap.c memmap.c avltree.c
quark_kernel_SOURCES = kernel.c mmgr.c priorityqueue.c stdio.c string.c elf.c syscalls.c heap.c memmap.c avltree.c queue.c
quark_kernel_LDADD = -lgcc
quark_kernel_CFLAGS = -I$(top_srcdir)/include -ffreestanding -mgeneral-regs-only -O0 -Wall -ggdb
quark_kernel_LDFLAGS = -nostdlib

View File

@@ -214,7 +214,7 @@ int add_process(void *program_entry, int priority, physaddr_t address_space)
new_process->page_table = address_space;
new_process->state = initial_context;
kernel.process_table = avl_insert(kernel.process_table, new_process->resource_id, new_process);
queue_insert(&kernel.priority_queue, new_process, new_process->priority);
priorityqueue_insert(&kernel.priority_queue, new_process, new_process->priority);
kernel.next_pid++;
return new_process->resource_id;
}
@@ -223,9 +223,9 @@ struct process_context_t *next_process()
{
if(kernel.active_process != NULL)
{
queue_insert(&kernel.priority_queue, kernel.active_process, kernel.active_process->priority);
priorityqueue_insert(&kernel.priority_queue, kernel.active_process, kernel.active_process->priority);
}
kernel.active_process = extract_min(&kernel.priority_queue);
kernel.active_process = priorityqueue_extract_min(&kernel.priority_queue);
if(kernel.active_process != NULL)
{
paging_load_address_space(kernel.active_process->page_table);
@@ -247,7 +247,7 @@ int terminate_process(size_t process_id)
kernel.active_process = NULL;
}
kernel.process_table = avl_remove(kernel.process_table, process_id);
queue_remove(&kernel.priority_queue, process);
priorityqueue_remove(&kernel.priority_queue, process);
destroy_context(process->state);
kfree(process);
return S_OK;

View File

@@ -38,7 +38,7 @@ int construct_priority_queue(struct priority_queue_t *queue, int capacity)
return S_OK;
}
void *extract_min(struct priority_queue_t *queue)
void *priorityqueue_extract_min(struct priority_queue_t *queue)
{
if(queue->size == 0)
return NULL;
@@ -49,7 +49,7 @@ void *extract_min(struct priority_queue_t *queue)
return value;
}
int queue_insert(struct priority_queue_t *queue, void *value, int priority)
int priorityqueue_insert(struct priority_queue_t *queue, void *value, int priority)
{
if(queue->size == queue->capacity)
return S_OUT_OF_MEMORY;
@@ -65,7 +65,7 @@ int queue_insert(struct priority_queue_t *queue, void *value, int priority)
return S_OK;
}
int queue_remove(struct priority_queue_t *queue, void *value)
int priorityqueue_remove(struct priority_queue_t *queue, void *value)
{
for(size_t i = 0; i < queue->size; i++)
{

53
src/queue.c Normal file
View File

@@ -0,0 +1,53 @@
#include "queue.h"
#include "heap.h"
struct queue_node_t
{
/**
* @brief Pointer to the user-defined object this node refers to.
*
*/
void *ptr;
/**
* @brief Link to the next node in the queue.
*
*/
struct queue_node_t *next;
};
void queue_insert(struct queue_t *queue, void *ptr)
{
struct queue_node_t *node = kmalloc(sizeof(struct queue_node_t));
node->ptr = ptr;
node->next = NULL;
if(queue->last == NULL)
{
queue->first = queue->last = node;
}
else
{
queue->last->next = node;
queue->last = node;
}
queue->count++;
}
void *queue_get_next(struct queue_t *queue)
{
struct queue_node_t *node = queue->first;
queue->first = node->next;
if(queue->first == NULL)
{
queue->last = NULL;
}
queue->count--;
void *ptr = node->ptr;
kfree(node);
return ptr;
}
void *queue_peek(struct queue_t *queue)
{
return queue->first->ptr;
}