diff --git a/init/init.c b/init/init.c index 69442f5..92bf8aa 100644 --- a/init/init.c +++ b/init/init.c @@ -37,6 +37,8 @@ void app_main (void) { for (int i = 0; i < 3; i++) test (letter); + process_quit (); + mutex_unlock (MUTEX); } } diff --git a/kernel/amd64/proc.c b/kernel/amd64/proc.c index d94e924..5b0803b 100644 --- a/kernel/amd64/proc.c +++ b/kernel/amd64/proc.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -118,6 +119,8 @@ void proc_cleanup (struct proc* proc) { spin_unlock (&proc->lock, &ctxpr); + proc_mutexes_cleanup (proc); + pmm_free (proc->pdata.kernel_stack, KSTACK_SIZE / PAGE_SIZE); procgroup_unmap (proc->procgroup, proc->pdata.tls_vaddr, proc->procgroup->tls.tls_tmpl_pages); diff --git a/kernel/proc/mutex.c b/kernel/proc/mutex.c index d715ddd..f7b896c 100644 --- a/kernel/proc/mutex.c +++ b/kernel/proc/mutex.c @@ -85,6 +85,39 @@ static void proc_mutex_resume (struct proc* proc, struct proc_sq_entry* sq_entry cpu_request_sched (cpu); } +void proc_mutexes_cleanup (struct proc* proc) { + spin_lock_ctx_t ctxpg, ctxrs; + + spin_lock (&proc->procgroup->lock, &ctxpg); + + struct rb_node_link* rnode; + rbtree_first (&proc->procgroup->resource_tree, rnode); + + while (rnode) { + struct rb_node_link* next; + rbtree_next (rnode, next); + + struct proc_resource* resource = rbtree_entry (rnode, struct proc_resource, resource_tree_link); + + rnode = next; + + spin_lock (&resource->lock, &ctxrs); + + if (resource->type != PR_MUTEX) { + spin_unlock (&resource->lock, &ctxrs); + continue; + } + + if (resource->u.mutex.owner == proc && resource->u.mutex.locked) { + spin_unlock (&resource->lock, &ctxrs); + + proc_mutex_unlock (proc, &resource->u.mutex); + } + } + + spin_unlock (&proc->procgroup->lock, &ctxpg); +} + void proc_cleanup_resource_mutex (struct proc_resource* resource) { struct proc_mutex* mutex = &resource->u.mutex; spin_lock_ctx_t ctxmt, ctxsq; diff --git a/kernel/proc/mutex.h b/kernel/proc/mutex.h index 710c71f..3ba0d09 100644 --- a/kernel/proc/mutex.h +++ b/kernel/proc/mutex.h @@ -18,5 +18,6 @@ struct proc_mutex { void proc_cleanup_resource_mutex (struct proc_resource* resource); void proc_mutex_lock (struct proc* proc, struct proc_mutex* mutex); bool proc_mutex_unlock (struct proc* proc, struct proc_mutex* mutex); +void proc_mutexes_cleanup (struct proc* proc); #endif // _KERNEL_PROC_MUTEX_H