Implement Mutexes and supporting syscalls, cleanup/optimize scheduler
All checks were successful
Build documentation / build-and-deploy (push) Successful in 39s

This commit is contained in:
2026-01-10 00:12:42 +01:00
parent 6a474c21a0
commit 41a458b925
17 changed files with 276 additions and 73 deletions

View File

@@ -4,7 +4,9 @@
#include <libk/string.h>
#include <mm/liballoc.h>
#include <mm/pmm.h>
#include <proc/mutex.h>
#include <proc/proc.h>
#include <proc/resource.h>
#include <sync/spin_lock.h>
#include <sys/debug.h>
@@ -33,7 +35,7 @@ void proc_drop_resource (struct proc* proc, struct proc_resource* resource) {
rbtree_delete (&proc->resource_tree, &resource->proc_resource_tree_link);
spin_unlock (&proc->lock);
resource->ops.cleanup (resource);
resource->ops.cleanup (proc, resource);
free (resource);
}
}
@@ -53,10 +55,23 @@ static bool proc_create_resource_mem (struct proc_resource_mem* mem,
return true;
}
static void proc_cleanup_resource_mem (struct proc_resource* resource) {
static void proc_cleanup_resource_mem (struct proc* proc, struct proc_resource* resource) {
(void)proc;
pmm_free (resource->u.mem.paddr, resource->u.mem.pages);
}
static bool proc_create_resource_mutex (struct proc_mutex* mutex) {
memset (mutex, 0, sizeof (*mutex));
return true;
}
static void proc_cleanup_resource_mutex (struct proc* proc, struct proc_resource* resource) {
struct proc_mutex* mutex = &resource->u.mutex;
proc_mutex_unlock (proc, mutex);
}
struct proc_resource* proc_create_resource (struct proc* proc, int rid, int type, int vis,
void* data) {
/* Check if resource RID already exists */
@@ -83,9 +98,14 @@ struct proc_resource* proc_create_resource (struct proc* proc, int rid, int type
struct proc_resource_mem_init* mem_init = data;
proc_create_resource_mem (&resource->u.mem, mem_init);
resource->ops.cleanup = &proc_cleanup_resource_mem;
DEBUG ("resource=%p type=%d rid=%d paddr=%p, pages=%zu\n", resource, resource->type,
DEBUG ("PR_MEM resource=%p type=%d rid=%d paddr=%p, pages=%zu\n", resource, resource->type,
resource->rid, resource->u.mem.paddr, resource->u.mem.pages);
} break;
case PR_MUTEX: {
proc_create_resource_mutex (&resource->u.mutex);
resource->ops.cleanup = &proc_cleanup_resource_mutex;
DEBUG ("PR_MUTEX resource=%p, type=%d rid=%d\n", resource, resource->type, resource->rid);
} break;
default: {
free (resource);
return NULL;