Use reference counting to track filetime of process PD
All checks were successful
Build documentation / build-and-deploy (push) Successful in 26s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 26s
This commit is contained in:
@@ -27,9 +27,17 @@ struct proc* proc_from_elf (uint8_t* elf_contents) {
|
||||
atomic_store (&proc->state, PROC_READY);
|
||||
proc->pid = atomic_fetch_add (&pids, 1);
|
||||
|
||||
proc->pd.lock = SPIN_LOCK_INIT;
|
||||
proc->pd.cr3_paddr = mm_alloc_user_pd_phys ();
|
||||
if (proc->pd.cr3_paddr == 0) {
|
||||
proc->pd = malloc (sizeof (*proc->pd));
|
||||
if (proc->pd == NULL) {
|
||||
free (proc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
proc->pd->lock = SPIN_LOCK_INIT;
|
||||
proc->pd->refs = 1;
|
||||
proc->pd->cr3_paddr = mm_alloc_user_pd_phys ();
|
||||
if (proc->pd->cr3_paddr == 0) {
|
||||
free (proc->pd);
|
||||
free (proc);
|
||||
return NULL;
|
||||
}
|
||||
@@ -39,6 +47,8 @@ struct proc* proc_from_elf (uint8_t* elf_contents) {
|
||||
struct proc_resource* kstk_r =
|
||||
proc_create_resource (proc, kstk_rid, PR_MEM, RV_PRIVATE, (void*)&kstk_mem_init);
|
||||
if (kstk_r == NULL) {
|
||||
pmm_free (proc->pd->cr3_paddr, 1);
|
||||
free (proc->pd);
|
||||
free (proc);
|
||||
return NULL;
|
||||
}
|
||||
@@ -52,6 +62,8 @@ struct proc* proc_from_elf (uint8_t* elf_contents) {
|
||||
if (ustk_r == NULL) {
|
||||
kstk_r->ops.cleanup (proc, kstk_r);
|
||||
free (kstk_r);
|
||||
pmm_free (proc->pd->cr3_paddr, 1);
|
||||
free (proc->pd);
|
||||
free (proc);
|
||||
return NULL;
|
||||
}
|
||||
@@ -78,24 +90,28 @@ void proc_cleanup (struct proc* proc) {
|
||||
|
||||
proc_cleanup_resources (proc);
|
||||
|
||||
struct list_node_link *mapping_link, *mapping_link_tmp;
|
||||
spin_lock (&proc->pd.lock, &ctxprpd);
|
||||
if (atomic_fetch_sub (&proc->pd->refs, 1) == 1) {
|
||||
DEBUG ("PID %d Free virtual address space\n", proc->pid);
|
||||
struct list_node_link *mapping_link, *mapping_link_tmp;
|
||||
spin_lock (&proc->pd->lock, &ctxprpd);
|
||||
|
||||
list_foreach (proc->mappings, mapping_link, mapping_link_tmp) {
|
||||
struct proc_mapping* mapping =
|
||||
list_entry (mapping_link, struct proc_mapping, proc_mappings_link);
|
||||
list_foreach (proc->mappings, mapping_link, mapping_link_tmp) {
|
||||
struct proc_mapping* mapping =
|
||||
list_entry (mapping_link, struct proc_mapping, proc_mappings_link);
|
||||
|
||||
list_remove (proc->mappings, mapping_link);
|
||||
free (mapping);
|
||||
list_remove (proc->mappings, mapping_link);
|
||||
free (mapping);
|
||||
}
|
||||
|
||||
pmm_free (proc->pd->cr3_paddr, 1);
|
||||
spin_unlock (&proc->pd->lock, &ctxprpd);
|
||||
free (proc->pd);
|
||||
}
|
||||
|
||||
spin_unlock (&proc->pd.lock, &ctxprpd);
|
||||
|
||||
pmm_free (proc->pd.cr3_paddr, 1);
|
||||
|
||||
pmm_free (proc->pdata.kernel_stack - (uintptr_t)hhdm->offset - KSTACK_SIZE,
|
||||
KSTACK_SIZE / PAGE_SIZE);
|
||||
pmm_free (proc->pdata.user_stack, USTACK_SIZE / PAGE_SIZE);
|
||||
DEBUG ("PID %d Free stacks\n", proc->pid);
|
||||
|
||||
free (proc);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user