X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/c166bd62fbb907f95f79f621e2a2fb4fdde08e01..ec4ff182252b6d7b3cb81f4fa783c5348a6c30fd:/lunaix-os/kernel/process/fork.c diff --git a/lunaix-os/kernel/process/fork.c b/lunaix-os/kernel/process/fork.c index c106650..d68a8f8 100644 --- a/lunaix-os/kernel/process/fork.c +++ b/lunaix-os/kernel/process/fork.c @@ -8,9 +8,10 @@ #include #include #include +#include -#include -#include +#include +#include #include @@ -44,30 +45,18 @@ region_maybe_cow(struct mm_region* region) tlb_flush_vmr_all(region); } -static inline void -__dup_fdtable(struct proc_info* pcb) -{ - for (size_t i = 0; i < VFS_MAX_FD; i++) { - struct v_fd* fd = __current->fdtable->fds[i]; - if (!fd) - continue; - vfs_dup_fd(fd, &pcb->fdtable->fds[i]); - } -} - - static void __dup_kernel_stack(struct thread* thread, ptr_t vm_mnt) { struct leaflet* leaflet; ptr_t kstack_pn = pfn(current_thread->kstack); - kstack_pn -= pfn(KSTACK_SIZE) - 1; + kstack_pn -= pfn(KSTACK_SIZE); // copy the kernel stack pte_t* src_ptep = mkptep_pn(VMS_SELF, kstack_pn); pte_t* dest_ptep = mkptep_pn(vm_mnt, kstack_pn); - for (size_t i = 0; i < pfn(KSTACK_SIZE); i++) { + for (size_t i = 0; i <= pfn(KSTACK_SIZE); i++) { pte_t p = *src_ptep; if (pte_isguardian(p)) { @@ -106,7 +95,7 @@ dup_active_thread(ptr_t vm_mnt, struct proc_info* duped_pcb) return NULL; } - th->intr_ctx = current_thread->intr_ctx; + th->hstate = current_thread->hstate; th->kstack = current_thread->kstack; signal_dup_context(&th->sigctx); @@ -149,9 +138,8 @@ done: pid_t dup_proc() { - // FIXME need investigate: issue with fork, as well as pthread - // especially when involving frequent alloc and dealloc ops - // (could be issue in allocator's segregated free list) + no_preemption(); + struct proc_info* pcb = alloc_process(); if (!pcb) { syscall_result(ENOMEM); @@ -172,7 +160,8 @@ dup_proc() vfs_ref_dnode(pcb->cwd); } - __dup_fdtable(pcb); + fdtable_copy(pcb->fdtable, __current->fdtable); + uscope_copy(&pcb->uscope, current_user_scope()); struct proc_mm* mm = vmspace(pcb); procvm_dupvms_mount(mm);