version 1.10.2.1, 2011/06/06 09:10:07 |
version 1.11, 2011/01/28 16:34:31 |
Line 53 lwproc_proc_free(struct proc *p) |
|
Line 53 lwproc_proc_free(struct proc *p) |
|
|
|
KASSERT(p->p_nlwps == 0); |
KASSERT(p->p_nlwps == 0); |
KASSERT(LIST_EMPTY(&p->p_lwps)); |
KASSERT(LIST_EMPTY(&p->p_lwps)); |
KASSERT(p->p_stat == SACTIVE || p->p_stat == SDYING || |
KASSERT(p->p_stat == SIDL || p->p_stat == SDEAD); |
p->p_stat == SDEAD); |
|
|
|
LIST_REMOVE(p, p_list); |
LIST_REMOVE(p, p_list); |
LIST_REMOVE(p, p_sibling); |
LIST_REMOVE(p, p_sibling); |
Line 66 lwproc_proc_free(struct proc *p) |
|
Line 65 lwproc_proc_free(struct proc *p) |
|
if (rump_proc_vfs_release) |
if (rump_proc_vfs_release) |
rump_proc_vfs_release(p); |
rump_proc_vfs_release(p); |
|
|
lim_free(p->p_limit); |
limfree(p->p_limit); |
pstatsfree(p->p_stats); |
pstatsfree(p->p_stats); |
kauth_cred_free(p->p_cred); |
kauth_cred_free(p->p_cred); |
proc_finispecific(p); |
proc_finispecific(p); |
Line 112 lwproc_newproc(struct proc *parent, int |
|
Line 111 lwproc_newproc(struct proc *parent, int |
|
offsetof(struct proc, p_endcopy) |
offsetof(struct proc, p_endcopy) |
- offsetof(struct proc, p_startcopy)); |
- offsetof(struct proc, p_startcopy)); |
|
|
/* some other garbage we need to zero */ |
|
p->p_sigacts = NULL; |
|
p->p_aio = NULL; |
|
p->p_dtrace = NULL; |
|
p->p_mqueue_cnt = p->p_exitsig = 0; |
|
p->p_flag = p->p_sflag = p->p_slflag = p->p_lflag = p->p_stflag = 0; |
|
p->p_trace_enabled = 0; |
|
p->p_xstat = p->p_acflag = 0; |
|
p->p_stackbase = 0; |
|
|
|
p->p_stats = pstatscopy(parent->p_stats); |
p->p_stats = pstatscopy(parent->p_stats); |
|
|
p->p_vmspace = vmspace_kernel(); |
p->p_vmspace = vmspace_kernel(); |
p->p_emul = &emul_netbsd; |
p->p_emul = &emul_netbsd; |
if (*parent->p_comm) |
strcpy(p->p_comm, "rumproc"); |
strcpy(p->p_comm, parent->p_comm); |
|
else |
|
strcpy(p->p_comm, "rumproc"); |
|
|
|
if ((flags & RUMP_RFCFDG) == 0) |
if ((flags & RUMP_RFCFDG) == 0) |
KASSERT(parent == curproc); |
KASSERT(parent == curproc); |
Line 155 lwproc_newproc(struct proc *parent, int |
|
Line 141 lwproc_newproc(struct proc *parent, int |
|
|
|
p->p_pptr = parent; |
p->p_pptr = parent; |
p->p_ppid = parent->p_pid; |
p->p_ppid = parent->p_pid; |
p->p_stat = SACTIVE; |
|
|
|
kauth_proc_fork(parent, p); |
kauth_proc_fork(parent, p); |
|
|
Line 214 lwproc_freelwp(struct lwp *l) |
|
Line 199 lwproc_freelwp(struct lwp *l) |
|
lwproc_proc_free(p); |
lwproc_proc_free(p); |
} |
} |
|
|
extern kmutex_t unruntime_lock; |
|
|
|
/* |
/* |
* called with p_lock held, releases lock before return |
* called with p_lock held, releases lock before return |
*/ |
*/ |
Line 229 lwproc_makelwp(struct proc *p, struct lw |
|
Line 212 lwproc_makelwp(struct proc *p, struct lw |
|
|
|
l->l_lid = p->p_nlwpid++; |
l->l_lid = p->p_nlwpid++; |
LIST_INSERT_HEAD(&p->p_lwps, l, l_sibling); |
LIST_INSERT_HEAD(&p->p_lwps, l, l_sibling); |
|
mutex_exit(p->p_lock); |
|
|
|
lwp_update_creds(l); |
|
|
l->l_fd = p->p_fd; |
l->l_fd = p->p_fd; |
l->l_cpu = rump_cpu; |
l->l_cpu = NULL; |
l->l_target_cpu = rump_cpu; /* Initial target CPU always the same */ |
l->l_target_cpu = rump_cpu; /* Initial target CPU always the same */ |
l->l_stat = LSRUN; |
l->l_stat = LSRUN; |
l->l_mutex = &unruntime_lock; |
|
TAILQ_INIT(&l->l_ld_locks); |
TAILQ_INIT(&l->l_ld_locks); |
mutex_exit(p->p_lock); |
|
|
|
lwp_update_creds(l); |
|
lwp_initspecific(l); |
lwp_initspecific(l); |
|
|
if (doswitch) { |
if (doswitch) { |
Line 269 rump__lwproc_alloclwp(struct proc *p) |
|
Line 252 rump__lwproc_alloclwp(struct proc *p) |
|
l = kmem_zalloc(sizeof(*l), KM_SLEEP); |
l = kmem_zalloc(sizeof(*l), KM_SLEEP); |
|
|
mutex_enter(p->p_lock); |
mutex_enter(p->p_lock); |
KASSERT((p->p_sflag & PS_RUMP_LWPEXIT) == 0); |
|
lwproc_makelwp(p, l, false, newproc); |
lwproc_makelwp(p, l, false, newproc); |
|
|
return l; |
return l; |
Line 290 rump_lwproc_newlwp(pid_t pid) |
|
Line 272 rump_lwproc_newlwp(pid_t pid) |
|
return ESRCH; |
return ESRCH; |
} |
} |
mutex_enter(p->p_lock); |
mutex_enter(p->p_lock); |
if (p->p_sflag & PS_RUMP_LWPEXIT) { |
|
mutex_exit(proc_lock); |
|
mutex_exit(p->p_lock); |
|
kmem_free(l, sizeof(*l)); |
|
return EBUSY; |
|
} |
|
mutex_exit(proc_lock); |
mutex_exit(proc_lock); |
lwproc_makelwp(p, l, true, false); |
lwproc_makelwp(p, l, true, false); |
|
|
Line 315 rump_lwproc_rfork(int flags) |
|
Line 291 rump_lwproc_rfork(int flags) |
|
p = lwproc_newproc(curproc, flags); |
p = lwproc_newproc(curproc, flags); |
l = kmem_zalloc(sizeof(*l), KM_SLEEP); |
l = kmem_zalloc(sizeof(*l), KM_SLEEP); |
mutex_enter(p->p_lock); |
mutex_enter(p->p_lock); |
KASSERT((p->p_sflag & PS_RUMP_LWPEXIT) == 0); |
|
lwproc_makelwp(p, l, true, true); |
lwproc_makelwp(p, l, true, true); |
|
|
return 0; |
return 0; |
Line 366 rump_lwproc_switch(struct lwp *newlwp) |
|
Line 341 rump_lwproc_switch(struct lwp *newlwp) |
|
} |
} |
mutex_exit(newlwp->l_proc->p_lock); |
mutex_exit(newlwp->l_proc->p_lock); |
|
|
l->l_mutex = &unruntime_lock; |
l->l_mutex = NULL; |
|
l->l_cpu = NULL; |
l->l_pflag &= ~LP_RUNNING; |
l->l_pflag &= ~LP_RUNNING; |
l->l_flag &= ~LW_PENDSIG; |
l->l_flag &= ~LW_PENDSIG; |
l->l_stat = LSRUN; |
|
|
|
if (l->l_flag & LW_WEXIT) { |
if (l->l_flag & LW_WEXIT) { |
lwproc_freelwp(l); |
lwproc_freelwp(l); |