diff options
author | davidxu <davidxu@FreeBSD.org> | 2005-11-03 01:34:08 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2005-11-03 01:34:08 +0000 |
commit | ef1e34d5ce668de9464b4eb858a138649b4b2bed (patch) | |
tree | 2e7593b1e0b58fad914db0320d327f10c9f50256 /sys | |
parent | 2e1794dfe58395b59c1e46df5ac29136866d2dec (diff) | |
download | FreeBSD-src-ef1e34d5ce668de9464b4eb858a138649b4b2bed.zip FreeBSD-src-ef1e34d5ce668de9464b4eb858a138649b4b2bed.tar.gz |
Add thread_find() function to search a thread by lwpid.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_thr.c | 20 | ||||
-rw-r--r-- | sys/kern/kern_thread.c | 15 | ||||
-rw-r--r-- | sys/sys/proc.h | 1 |
3 files changed, 24 insertions, 12 deletions
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index 39817df..6b67672 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -310,10 +310,7 @@ thr_kill(struct thread *td, struct thr_kill_args *uap) p = td->td_proc; error = 0; PROC_LOCK(p); - FOREACH_THREAD_IN_PROC(p, ttd) { - if (ttd->td_tid == uap->id) - break; - } + ttd = thread_find(p, uap->id); if (ttd == NULL) { error = ESRCH; goto out; @@ -324,7 +321,7 @@ thr_kill(struct thread *td, struct thr_kill_args *uap) error = EINVAL; goto out; } - tdsignal(ttd, uap->sig, NULL, SIGTARGET_TD); + tdsignal(p, ttd, uap->sig, NULL); out: PROC_UNLOCK(p); return (error); @@ -378,21 +375,20 @@ int thr_wake(struct thread *td, struct thr_wake_args *uap) /* long id */ { + struct proc *p; struct thread *ttd; - PROC_LOCK(td->td_proc); - FOREACH_THREAD_IN_PROC(td->td_proc, ttd) { - if (ttd->td_tid == uap->id) - break; - } + p = td->td_proc; + PROC_LOCK(p); + ttd = thread_find(p, uap->id); if (ttd == NULL) { - PROC_UNLOCK(td->td_proc); + PROC_UNLOCK(p); return (ESRCH); } mtx_lock_spin(&sched_lock); ttd->td_flags |= TDF_THRWAKEUP; mtx_unlock_spin(&sched_lock); wakeup((void *)ttd); - PROC_UNLOCK(td->td_proc); + PROC_UNLOCK(p); return (0); } diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index e315baf..12be17b 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -1022,3 +1022,18 @@ thread_sleep_check(struct thread *td) } return (0); } + +struct thread * +thread_find(struct proc *p, lwpid_t tid) +{ + struct thread *td; + + PROC_LOCK_ASSERT(p, MA_OWNED); + mtx_lock_spin(&sched_lock); + FOREACH_THREAD_IN_PROC(p, td) { + if (td->td_tid == tid) + break; + } + mtx_unlock_spin(&sched_lock); + return (td); +} diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 0766962..5a99e5f 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -941,6 +941,7 @@ void thread_unthread(struct thread *td); int thread_userret(struct thread *td, struct trapframe *frame); void thread_user_enter(struct thread *td); void thread_wait(struct proc *p); +struct thread *thread_find(struct proc *p, lwpid_t tid); void thr_exit1(void); struct kse_upcall *upcall_alloc(void); void upcall_free(struct kse_upcall *ku); |