Added queue structure
This commit is contained in:
@@ -85,6 +85,14 @@ int store_active_context(struct process_context_t *context, size_t size);
|
|||||||
|
|
||||||
struct process_context_t *get_active_context();
|
struct process_context_t *get_active_context();
|
||||||
|
|
||||||
|
int open_port(int id);
|
||||||
|
|
||||||
|
int close_port(int id);
|
||||||
|
|
||||||
int send_message(int recipient, struct message_t *message);
|
int send_message(int recipient, struct message_t *message);
|
||||||
|
|
||||||
|
int receive_message(struct message_t *buffer);
|
||||||
|
|
||||||
|
int request_message(struct message_t *buffer, void *temp);
|
||||||
|
|
||||||
void panic(const char *message) __attribute__ ((noreturn));
|
void panic(const char *message) __attribute__ ((noreturn));
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ int construct_priority_queue(struct priority_queue_t *queue, int capacity);
|
|||||||
* @param queue
|
* @param queue
|
||||||
* @return void*
|
* @return void*
|
||||||
*/
|
*/
|
||||||
void *extract_min(struct priority_queue_t *queue);
|
void *priorityqueue_extract_min(struct priority_queue_t *queue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Inserts a new object onto the queue.
|
* @brief Inserts a new object onto the queue.
|
||||||
@@ -80,7 +80,7 @@ void *extract_min(struct priority_queue_t *queue);
|
|||||||
* @param priority
|
* @param priority
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
int queue_insert(struct priority_queue_t *queue, void *value, int priority);
|
int priorityqueue_insert(struct priority_queue_t *queue, void *value, int priority);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Removes the object with a matching value from the queue.
|
* @brief Removes the object with a matching value from the queue.
|
||||||
@@ -89,4 +89,4 @@ int queue_insert(struct priority_queue_t *queue, void *value, int priority);
|
|||||||
* @param value
|
* @param value
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
int queue_remove(struct priority_queue_t *queue, void *value);
|
int priorityqueue_remove(struct priority_queue_t *queue, void *value);
|
||||||
|
|||||||
53
include/queue.h
Normal file
53
include/queue.h
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct queue_node_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A last-in-first-out queue.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct queue_t
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @brief The number of objects stored in this queue.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
unsigned int count;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A link to the first node stored in this queue.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct queue_node_t *first;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A link to the last node stored in this queue.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct queue_node_t *last;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inserts a new item at the end of the queue.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* @param ptr
|
||||||
|
*/
|
||||||
|
void queue_insert(struct queue_t *queue, void *ptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Removes the next item from the queue and returns it.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* @return void*
|
||||||
|
*/
|
||||||
|
void *queue_get_next(struct queue_t *queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the next item on the queue without removing it.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* @return void*
|
||||||
|
*/
|
||||||
|
void *queue_peek(struct queue_t *queue);
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
noinst_PROGRAMS = quark-kernel
|
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_LDADD = -lgcc
|
||||||
quark_kernel_CFLAGS = -I$(top_srcdir)/include -ffreestanding -mgeneral-regs-only -O0 -Wall -ggdb
|
quark_kernel_CFLAGS = -I$(top_srcdir)/include -ffreestanding -mgeneral-regs-only -O0 -Wall -ggdb
|
||||||
quark_kernel_LDFLAGS = -nostdlib
|
quark_kernel_LDFLAGS = -nostdlib
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ int add_process(void *program_entry, int priority, physaddr_t address_space)
|
|||||||
new_process->page_table = address_space;
|
new_process->page_table = address_space;
|
||||||
new_process->state = initial_context;
|
new_process->state = initial_context;
|
||||||
kernel.process_table = avl_insert(kernel.process_table, new_process->resource_id, new_process);
|
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++;
|
kernel.next_pid++;
|
||||||
return new_process->resource_id;
|
return new_process->resource_id;
|
||||||
}
|
}
|
||||||
@@ -223,9 +223,9 @@ struct process_context_t *next_process()
|
|||||||
{
|
{
|
||||||
if(kernel.active_process != NULL)
|
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)
|
if(kernel.active_process != NULL)
|
||||||
{
|
{
|
||||||
paging_load_address_space(kernel.active_process->page_table);
|
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.active_process = NULL;
|
||||||
}
|
}
|
||||||
kernel.process_table = avl_remove(kernel.process_table, process_id);
|
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);
|
destroy_context(process->state);
|
||||||
kfree(process);
|
kfree(process);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ int construct_priority_queue(struct priority_queue_t *queue, int capacity)
|
|||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *extract_min(struct priority_queue_t *queue)
|
void *priorityqueue_extract_min(struct priority_queue_t *queue)
|
||||||
{
|
{
|
||||||
if(queue->size == 0)
|
if(queue->size == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -49,7 +49,7 @@ void *extract_min(struct priority_queue_t *queue)
|
|||||||
return value;
|
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)
|
if(queue->size == queue->capacity)
|
||||||
return S_OUT_OF_MEMORY;
|
return S_OUT_OF_MEMORY;
|
||||||
@@ -65,7 +65,7 @@ int queue_insert(struct priority_queue_t *queue, void *value, int priority)
|
|||||||
return S_OK;
|
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++)
|
for(size_t i = 0; i < queue->size; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
53
src/queue.c
Normal file
53
src/queue.c
Normal 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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user