Spinlock save cpu flags
This commit is contained in:
@@ -68,6 +68,7 @@ struct proc* proc_from_elf (uint8_t* elf_contents) {
|
||||
|
||||
struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t entry,
|
||||
uintptr_t argument_ptr) {
|
||||
uint64_t fpt;
|
||||
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
||||
|
||||
struct proc* proc = malloc (sizeof (*proc));
|
||||
@@ -85,12 +86,12 @@ struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t ent
|
||||
return NULL;
|
||||
}
|
||||
|
||||
spin_lock (&proto->lock);
|
||||
spin_lock (&proto->lock, &fpt);
|
||||
|
||||
proc->procgroup = proto->procgroup;
|
||||
procgroup_attach (proc->procgroup, proc);
|
||||
|
||||
spin_unlock (&proto->lock);
|
||||
spin_unlock (&proto->lock, fpt);
|
||||
|
||||
uintptr_t kstack_paddr = pmm_alloc (KSTACK_SIZE / PAGE_SIZE);
|
||||
proc->pdata.kernel_stack = kstack_paddr + (uintptr_t)hhdm->offset + KSTACK_SIZE;
|
||||
@@ -112,25 +113,27 @@ struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t ent
|
||||
}
|
||||
|
||||
void proc_cleanup (struct proc* proc, struct reschedule_ctx* rctx) {
|
||||
spin_lock (&proc->lock);
|
||||
spin_lock (&proc->done_sq.lock);
|
||||
uint64_t fp, fsq;
|
||||
|
||||
spin_lock (&proc->lock, &fp);
|
||||
spin_lock (&proc->done_sq.lock, &fsq);
|
||||
|
||||
while (proc->done_sq.proc_list != NULL) {
|
||||
struct list_node_link* node = proc->done_sq.proc_list;
|
||||
struct proc_sq_entry* sq_entry = list_entry (node, struct proc_sq_entry, sq_link);
|
||||
struct proc* suspended_proc = sq_entry->proc;
|
||||
|
||||
spin_unlock (&proc->done_sq.lock);
|
||||
spin_unlock (&proc->lock);
|
||||
spin_unlock (&proc->done_sq.lock, fsq);
|
||||
spin_unlock (&proc->lock, fp);
|
||||
|
||||
proc_sq_resume (suspended_proc, sq_entry, rctx);
|
||||
|
||||
spin_lock (&proc->lock);
|
||||
spin_lock (&proc->done_sq.lock);
|
||||
spin_lock (&proc->lock, &fp);
|
||||
spin_lock (&proc->done_sq.lock, &fsq);
|
||||
}
|
||||
|
||||
spin_unlock (&proc->done_sq.lock);
|
||||
spin_unlock (&proc->lock);
|
||||
spin_unlock (&proc->done_sq.lock, fsq);
|
||||
spin_unlock (&proc->lock, fp);
|
||||
|
||||
proc_sqs_cleanup (proc);
|
||||
proc_mutexes_cleanup (proc, rctx);
|
||||
|
||||
Reference in New Issue
Block a user