Date: Thu, 20 May 2004 20:54:03 -0600 (MDT) From: "M. Warner Losh" <imp@bsdimp.com> To: julian@elischer.org Cc: arch@freebsd.org Subject: Re: atomic reference counting primatives. Message-ID: <20040520.205403.08940889.imp@bsdimp.com> In-Reply-To: <Pine.BSF.4.21.0405201340590.72391-100000@InterJet.elischer.org> References: <Pine.BSF.4.21.0405201340590.72391-100000@InterJet.elischer.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In message: <Pine.BSF.4.21.0405201340590.72391-100000@InterJet.elischer.org> Julian Elischer <julian@elischer.org> writes: : This has been raised before but I've come across uses for it again and : again so I'm raising it again. : JHB once posted some atomic referenc counting primatives. (Do you still : have them John?) : Alfred once said he had soem somewhere too, and other s have commentted : on this before, but we still don't seem to have any. : : every object is reference counted with its own code and : sometimes it's done poorly. : : Some peiople indicated that there are cases where a generic refcounter : can not be used and usd this as a reason to not have one at all. : : So, here are some possibilities.. : my first "write it down without too much thinking" effort.. : : typedef {mumble} refcnt_t : : refcnt_add(refcnt_t *) : Increments the reference count.. no magic except to be atomic. : : : int refcnt_drop(refcnt *, struct mutex *) : Decrements the refcount. If it goes to 0 it returns 0 and locks the : mutex (if the mutex is supplied).. What prevents refcnt_add() from happening after ref count drops to 0? Wouldn't that be a race? Eg, if we have two threads: Thread A Thread B objp = lookup(); [1] refcnt_drop(&objp->ref, &objp->mtx); [2] refcnt_add(&obj->ref); BANG! If [1] happens before [2], then bad things happen at BANG! If [2] happens before [1], then the mutex won't be locked at BANG and things is good. Thread A believes it has a valid reference to objp after the refcnt_add and no way of knowing otherwise. Is there a safe way to use the API into what you are proposing? Warner
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040520.205403.08940889.imp>