Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Nov 2001 13:34:30 -0800 (PST)
From:      Archie Cobbs <archie@dellroad.org>
To:        John Baldwin <jhb@FreeBSD.org>
Cc:        cvs-all@FreeBSD.org, cvs-committers@FreeBSD.org
Subject:   Re: cvs commit: src/sys/kern kern_timeout.c src/sys/sys callout.
Message-ID:  <200111132134.fADLYVu59037@arch20m.dellroad.org>
In-Reply-To: <XFMail.011113110524.jhb@FreeBSD.org> "from John Baldwin at Nov 13, 2001 11:05:24 am"

next in thread | previous in thread | raw e-mail | index | archive | help
John Baldwin writes:
> >     sys/kern             kern_timeout.c 
> >     sys/sys              callout.h 
> >   Log:
> >   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.

-Archie

P.S. If you want to see a overly-complicated workaround for this
     problem from before, check out netgraph/ng_pptpgre.c.

__________________________________________________________________________
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?200111132134.fADLYVu59037>