libthr patch
Tim Robbins
tjr at freebsd.org
Thu Feb 19 05:48:15 PST 2004
On Thu, Feb 19, 2004 at 09:28:50AM +0300, Mike Makonnen wrote:
> Index: sys/kern/kern_thr.c
[...]
> +int
> +thr_wake(struct thread *td, struct thr_wake_args *uap)
> + /* thr_id_t id */
> +{
> + PROC_LOCK(((struct thread *)uap->id)->td_proc);
> + ((struct thread *)uap->id)->td_lthrflags |= LTF_THRWAKEUP;
> + PROC_UNLOCK(((struct thread *)uap->id)->td_proc);
> + wakeup_one((void *)uap->id);
> + return (0);
> +}
[...]
Make sure you fix thr_wake() to check that uap->id is valid before you
commit this patch. Something like this would be safer but slower:
struct thread *td1;
PROC_LOCK(td->td_proc);
FOREACH_THREAD_IN_PROC(td->td_proc, td1)
if (td1 == (struct thread *)uap->id)
break;
if (td1 == NULL) {
PROC_UNLOCK(td->td_proc);
return (ESRCH);
}
td1->td_lthrflags |= LTF_THRWAKEUP;
wakeup_one(td1);
PROC_UNLOCK(td->td_proc);
return (0);
(I'm not sure that it's safe to call wakeup_one() on a thread pointer
that isn't curthread without holding the proc lock, so I changed that too.)
Tim
More information about the freebsd-threads
mailing list