diff --git a/include/kernel.h b/include/kernel.h index de6c183..8b1b47f 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -85,6 +85,14 @@ int store_active_context(struct process_context_t *context, size_t size); 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 receive_message(struct message_t *buffer); + +int request_message(struct message_t *buffer, void *temp); + void panic(const char *message) __attribute__ ((noreturn)); diff --git a/include/priorityqueue.h b/include/priorityqueue.h index cb49fcb..15f34dc 100644 --- a/include/priorityqueue.h +++ b/include/priorityqueue.h @@ -70,7 +70,7 @@ int construct_priority_queue(struct priority_queue_t *queue, int capacity); * @param queue * @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. @@ -80,7 +80,7 @@ void *extract_min(struct priority_queue_t *queue); * @param priority * @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. @@ -89,4 +89,4 @@ int queue_insert(struct priority_queue_t *queue, void *value, int priority); * @param value * @return int */ -int queue_remove(struct priority_queue_t *queue, void *value); +int priorityqueue_remove(struct priority_queue_t *queue, void *value); diff --git a/include/queue.h b/include/queue.h new file mode 100644 index 0000000..a7f4b98 --- /dev/null +++ b/include/queue.h @@ -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); + diff --git a/src/Makefile.am b/src/Makefile.am index 47a930e..db5a2ae 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/kernel.c b/src/kernel.c index a340ebe..2a8a6f4 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -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; diff --git a/src/priorityqueue.c b/src/priorityqueue.c index 5f62875..1396d0b 100644 --- a/src/priorityqueue.c +++ b/src/priorityqueue.c @@ -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++) { diff --git a/src/queue.c b/src/queue.c new file mode 100644 index 0000000..fc3ca4d --- /dev/null +++ b/src/queue.c @@ -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; +} \ No newline at end of file