Process linked list
This commit is contained in:
99
src/sched/process.c
Normal file
99
src/sched/process.c
Normal file
@@ -0,0 +1,99 @@
|
||||
#include <stddef.h>
|
||||
#include "process.h"
|
||||
#include "mem/heap/kheap.h"
|
||||
#include "kernel.h"
|
||||
|
||||
struct process_t* processes_list;
|
||||
struct process_t* current_process;
|
||||
|
||||
void process_init()
|
||||
{
|
||||
processes_list = NULL;
|
||||
current_process = NULL;
|
||||
}
|
||||
|
||||
// Only for debug
|
||||
void process_display_list(struct process_t* processes_list)
|
||||
{
|
||||
int process_view_id = 0;
|
||||
struct process_t* tmp = processes_list;
|
||||
while (tmp != NULL)
|
||||
{
|
||||
DEBUG("{%d: } -> ", process_view_id);
|
||||
tmp = tmp->next;
|
||||
process_view_id++;
|
||||
}
|
||||
DEBUG("NULL");
|
||||
}
|
||||
|
||||
struct process_t* process_create()
|
||||
{
|
||||
struct process_t* proc = (struct process_t*)kmalloc(sizeof(struct process_t));
|
||||
|
||||
if (!proc) return NULL;
|
||||
|
||||
proc->context = NULL;
|
||||
proc->status = READY;
|
||||
proc->next = NULL;
|
||||
|
||||
return proc;
|
||||
}
|
||||
|
||||
void process_add(struct process_t** processes_list, struct process_t* process)
|
||||
{
|
||||
if (!process) return;
|
||||
process->next = NULL;
|
||||
|
||||
if (*processes_list == NULL)
|
||||
{
|
||||
// List is empty
|
||||
*processes_list = process;
|
||||
return;
|
||||
}
|
||||
|
||||
struct process_t* tmp = *processes_list;
|
||||
while (tmp->next != NULL)
|
||||
{
|
||||
tmp = tmp->next;
|
||||
}
|
||||
// We're at last process before NULL
|
||||
tmp->next = process;
|
||||
// process->next = NULL;
|
||||
}
|
||||
|
||||
void process_delete(struct process_t** processes_list, struct process_t* process)
|
||||
{
|
||||
if (!processes_list || !*processes_list || !process) return;
|
||||
|
||||
if (*processes_list == process)
|
||||
{
|
||||
// process to delete is at head
|
||||
*processes_list = process->next;
|
||||
process->next = NULL;
|
||||
kfree(process);
|
||||
return;
|
||||
}
|
||||
|
||||
struct process_t* tmp = *processes_list;
|
||||
while (tmp->next && tmp->next != process)
|
||||
{
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
if (tmp->next == NULL)
|
||||
{
|
||||
// Didn't find the process
|
||||
return;
|
||||
}
|
||||
|
||||
// We're at process before the one we want to delete
|
||||
tmp->next = process->next;
|
||||
process->next = NULL;
|
||||
kfree(process);
|
||||
}
|
||||
|
||||
struct process_t* process_get_next(struct process_t* process)
|
||||
{
|
||||
if (!process) return NULL;
|
||||
return process->next;
|
||||
}
|
||||
Reference in New Issue
Block a user