summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2005-11-03 01:34:08 +0000
committerdavidxu <davidxu@FreeBSD.org>2005-11-03 01:34:08 +0000
commitef1e34d5ce668de9464b4eb858a138649b4b2bed (patch)
tree2e7593b1e0b58fad914db0320d327f10c9f50256 /sys
parent2e1794dfe58395b59c1e46df5ac29136866d2dec (diff)
downloadFreeBSD-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.c20
-rw-r--r--sys/kern/kern_thread.c15
-rw-r--r--sys/sys/proc.h1
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);
OpenPOWER on IntegriCloud