Date: Wed, 15 Oct 2003 19:30:26 -0400 (EDT) From: Jeff Roberson <jroberson@chesapeake.net> To: Robert Watson <rwatson@FreeBSD.org> Cc: John Baldwin <jhb@FreeBSD.org> Subject: RE: cvs commit: src/sys/sys mutex.h Message-ID: <20031015192947.E30029-100000@mail.chesapeake.net> In-Reply-To: <Pine.NEB.3.96L.1031015175545.54113J-100000@fledge.watson.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 15 Oct 2003, Robert Watson wrote:
>
> On Tue, 14 Oct 2003, John Baldwin wrote:
>
> > > I know it is racy in most contexts. I use it to check to see if a thread
> > > on the runq owns giant. Since I have the sched lock it isn't racy but
> > > even if it was it wouldn't matter in this case.
> >
> > sched lock doesn't keep it from being racy. Uncontested acquire and
> > releases don't go anywhere near sched lock. Are you checking a
> > non-curthread thread pointer? Maybe you could just do it for curthread
> > and that would be enough for your heuristic, i.e.
> >
> > if (thread == curthread && mtx_owned(&Giant)) {
> > ...
> > }
> >
> > I'm just worried that if this is there someone is going to use it. :(
>
> You mean like this?
Commit! I know of a great use for this.
>
> while (mtx_trylock(&my_favorite_mtx)) {
> int gotthebastard;
> struct thread *td;
> struct proc *p;
>
> gotthebastard = 0;
> sx_slock(&allproc_lock);
> LIST_FOREACH(p, &allproc, p_list) {
> PROC_LOCK(p);
> FOREACH_THREAD_IN_PROC(p, td) {
> if (mtx_ownedby(&my_favorite_mtx, td)) {
> psignal(p, SIGKILL);
> gotthebastard = 1;
> break;
> }
> }
> PROC_UNLOCK(p);
> if (gotthebastard)
> break;
> }
> sx_sunlock(&allproc_lock);
> printf("Someone else owned the mutex, but I got the bastard\n");
> }
>
> Robert N M Watson FreeBSD Core Team, TrustedBSD Projects
> robert@fledge.watson.org Network Associates Laboratories
>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031015192947.E30029-100000>
