diff --git a/kernel/amd64/proc.c b/kernel/amd64/proc.c index 5b0803b..6f4a5d0 100644 --- a/kernel/amd64/proc.c +++ b/kernel/amd64/proc.c @@ -94,31 +94,7 @@ struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t ent } void proc_cleanup (struct proc* proc) { - spin_lock_ctx_t ctxsq, ctxpr; - - spin_lock (&proc->lock, &ctxpr); - - /* clean suspension queue entries */ - struct list_node_link *sq_link, *sq_link_tmp; - list_foreach (proc->sq_entries, sq_link, sq_link_tmp) { - struct proc_sq_entry* sq_entry = list_entry (sq_link, struct proc_sq_entry, proc_link); - struct proc_suspension_q* sq = sq_entry->sq; - - spin_lock (&sq->lock, &ctxsq); - - /* remove from sq's list */ - list_remove (sq->proc_list, &sq_entry->sq_link); - - /* remove from proc's list */ - list_remove (proc->sq_entries, &sq_entry->proc_link); - - spin_unlock (&sq->lock, &ctxsq); - - free (sq_entry); - } - - spin_unlock (&proc->lock, &ctxpr); - + proc_sqs_cleanup (proc); proc_mutexes_cleanup (proc); pmm_free (proc->pdata.kernel_stack, KSTACK_SIZE / PAGE_SIZE); diff --git a/kernel/proc/src.mk b/kernel/proc/src.mk index 68efb55..a090d65 100644 --- a/kernel/proc/src.mk +++ b/kernel/proc/src.mk @@ -1,9 +1,11 @@ c += proc/proc.c \ proc/resource.c \ proc/mutex.c \ - proc/procgroup.c + proc/procgroup.c \ + proc/suspension_q.c o += proc/proc.o \ proc/resource.o \ proc/mutex.o \ - proc/procgroup.o + proc/procgroup.o \ + proc/suspension_q.o diff --git a/kernel/proc/suspension_q.c b/kernel/proc/suspension_q.c new file mode 100644 index 0000000..07fd3a4 --- /dev/null +++ b/kernel/proc/suspension_q.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include + +void proc_sqs_cleanup (struct proc* proc) { + spin_lock_ctx_t ctxsq, ctxpr; + + spin_lock (&proc->lock, &ctxpr); + + /* clean suspension queue entries */ + struct list_node_link *sq_link, *sq_link_tmp; + list_foreach (proc->sq_entries, sq_link, sq_link_tmp) { + struct proc_sq_entry* sq_entry = list_entry (sq_link, struct proc_sq_entry, proc_link); + struct proc_suspension_q* sq = sq_entry->sq; + + spin_lock (&sq->lock, &ctxsq); + + /* remove from sq's list */ + list_remove (sq->proc_list, &sq_entry->sq_link); + + /* remove from proc's list */ + list_remove (proc->sq_entries, &sq_entry->proc_link); + + spin_unlock (&sq->lock, &ctxsq); + + free (sq_entry); + } + + spin_unlock (&proc->lock, &ctxpr); +} diff --git a/kernel/proc/suspension_q.h b/kernel/proc/suspension_q.h index feea3bd..5c97945 100644 --- a/kernel/proc/suspension_q.h +++ b/kernel/proc/suspension_q.h @@ -4,9 +4,13 @@ #include #include +struct proc; + struct proc_suspension_q { struct list_node_link* proc_list; spin_lock_t lock; }; +void proc_sqs_cleanup (struct proc* proc); + #endif // _KERNEL_PROC_SUSPENTION_Q_H