Deleted Added
full compact
30c30
< __FBSDID("$FreeBSD: head/sys/compat/linux/linux_emul.c 191269 2009-04-19 13:48:42Z dchagin $");
---
> __FBSDID("$FreeBSD: head/sys/compat/linux/linux_emul.c 215664 2010-11-22 09:06:59Z netchild $");
158c158
< int error;
---
> int error, shared_flags, shared_xstat;
189a190,191
> shared_flags = em->shared->flags;
> shared_xstat = em->shared->xstat;
198a201,206
> if ((shared_flags & EMUL_SHARED_HASXSTAT) != 0) {
> PROC_LOCK(p);
> p->p_xstat = shared_xstat;
> PROC_UNLOCK(p);
> }
>
259a268,270
> if (__predict_false(p->p_sysent == &elf_linux_sysvec))
> /* Kill threads regardless of imgp->sysent value */
> linux_kill_threads(FIRST_THREAD_IN_PROC(p), SIGKILL);
336a348,373
>
> void
> linux_kill_threads(struct thread *td, int sig)
> {
> struct linux_emuldata *em, *td_em, *tmp_em;
> struct proc *sp;
>
> td_em = em_find(td->td_proc, EMUL_DONTLOCK);
>
> KASSERT(td_em != NULL, ("linux_kill_threads: emuldata not found.\n"));
>
> EMUL_SHARED_RLOCK(&emul_shared_lock);
> LIST_FOREACH_SAFE(em, &td_em->shared->threads, threads, tmp_em) {
> if (em->pid == td_em->pid)
> continue;
>
> sp = pfind(em->pid);
> if ((sp->p_flag & P_WEXIT) == 0)
> psignal(sp, sig);
> PROC_UNLOCK(sp);
> #ifdef DEBUG
> printf(LMSG("linux_kill_threads: kill PID %d\n"), em->pid);
> #endif
> }
> EMUL_SHARED_RUNLOCK(&emul_shared_lock);
> }