Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Nov 2001 14:35:11 -0800 (PST)
From:      Archie Cobbs <archie@dellroad.org>
To:        John Baldwin <jhb@FreeBSD.org>
Cc:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/kern kern_timeout.c src/sys/sys callout.
Message-ID:  <200111132235.fADMZBj59293@arch20m.dellroad.org>
In-Reply-To: <XFMail.011113142246.jhb@FreeBSD.org> "from John Baldwin at Nov 13, 2001 02:22:46 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
John Baldwin writes:
> >> >   MFC: Change callout_stop() to return an integer.
> >> 
> >> ??  Is this needed for something in 4.x?  The only thing it is used for in
> >> 5.x
> >> is to work around a really obscure race involving the endtsleep() timeout.
> > 
> > Yes, at least I think so.. :-)
> > 
> > The problem I am trying to solve is: suppose you have some object
> > (blob of memory) with a reference count. You only free the object
> > when the ref count goes to zero.
> > 
> > If you do a callout_reset() using the object as the handler
> > argument, obviously you'd want to add a reference. When your
> > handler eventually gets invoked, you want to remove a reference.
> > 
> > Now what if you call callout_stop()? That functions does not
> > guarantee that your handler won't be called -- because your
> > event might have been dequeued and just about to be called,
> > but hasn't actually been called yet. Therefore, you don't know
> > whether to decrement the reference count or not, unless you
> > have some indication from callout_stop() about whether the
> > funny case of dequeued-but-not-handled-yet has happened or not.
> > 
> > My analysis may be incorrect, in which case I would love for
> > someone to explain all this to me because it seems pretty subtle.
> 
> Yes, it is useful in this case.  However, all this tells you is that the
> handler has been dequeued.  You don't know if it has already run or will run
> in the future however.  Determining that is another trick.  For the

Right.. easy to do using a flag bit in the structure/object.

> endtsleep race, we use the TDF_TIMOFAIL flag to test this.  In the case you
> describe I think it is simpler though as the timeout will always do the
> decrement, so you simply don't decrement if the callout_stop() fails.

Exactly..

Thanks,
-Archie

__________________________________________________________________________
Archie Cobbs     *     Packet Design     *     http://www.packetdesign.com

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111132235.fADMZBj59293>