From owner-freebsd-smp@FreeBSD.ORG Fri Apr 4 11:34:20 2003 Return-Path: Delivered-To: freebsd-smp@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 95AD637B401 for ; Fri, 4 Apr 2003 11:34:20 -0800 (PST) Received: from mail.speakeasy.net (mail14.speakeasy.net [216.254.0.214]) by mx1.FreeBSD.org (Postfix) with ESMTP id D0BEA43FA3 for ; Fri, 4 Apr 2003 11:34:19 -0800 (PST) (envelope-from jhb@FreeBSD.org) Received: (qmail 31279 invoked from network); 4 Apr 2003 19:34:25 -0000 Received: from unknown (HELO server.baldwin.cx) ([216.27.160.63]) (envelope-sender )encrypted SMTP for ; 4 Apr 2003 19:34:25 -0000 Received: from laptop.baldwin.cx (gw1.twc.weather.com [216.133.140.1]) by server.baldwin.cx (8.12.8/8.12.8) with ESMTP id h34JYHOv031322; Fri, 4 Apr 2003 14:34:17 -0500 (EST) (envelope-from jhb@FreeBSD.org) Message-ID: X-Mailer: XFMail 1.5.4 on FreeBSD X-Priority: 3 (Normal) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit MIME-Version: 1.0 In-Reply-To: <20030404150518.GA15112@attbi.com> Date: Fri, 04 Apr 2003 14:34:17 -0500 (EST) From: John Baldwin To: Craig Rodrigues cc: freebsd-smp@FreeBSD.org Subject: Re: atomic_dec_and_test() in FreeBSD? X-BeenThere: freebsd-smp@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: FreeBSD SMP implementation group List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Apr 2003 19:34:20 -0000 On 04-Apr-2003 Craig Rodrigues wrote: > On Wed, Mar 26, 2003 at 12:13:21PM -0500, John Baldwin wrote: >> > I am the port maintainer of the Apache Portable Runtime (apr) library. >> > apr has some atomic functions. For FreeBSD, this is what is defined: >> > >> > /** >> > * decrement the atomic variable by 1 >> > * @param mem pointer to the atomic value >> > * @return zero if the value is zero, otherwise non-zero >> > */ >> > int apr_atomic_dec(volatile apr_atomic_t *mem); >> > >> > [snip] >> > >> >#define apr_atomic_dec(mem) atomic_subtract_int(mem,1) >> > >> > >> > This is obviously quite wrong. >> > >> > So are you saying that I should replace this with: >> > >> > int apr_atomic_dec(volatile apr_atomic_t *mem); >> > >> > int apr_atomic_dec(volatile apr_atomic_t *mem){ >> > apr_atomic_t x >> > do { >> > x = *mem; >> > } while (atomic_cmpset_int(mem, x, x - 1) == 0); >> > if (x == 1) >> > /* foo just dropped to zero */ >> > >> > >> > ??????? >> > } >> > >> > Can you give more guidance? >> >> You could do this: >> >> apr_atomic_t x; >> >> do { >> x = *mem; >> } while (atomic_cmpset_int(mem, x, x - 1) == 0); >> return (x - 1) > > > > This macro exists on -CURRENT, but I can't seem to find it > on FreeBSD 4.7. What is the equivalent solution on that platform? 4.7 doesn't have a real good equivalent. However, on 4.7 you can probably just do: s = splhigh(); x--; zero = x == 0; splx(s); if (x == 0) /* refcount is zero */ In fact, depending on what you do in the zero case, you probably would need to do: s = splhigh(); if (--x == 0) /* refcount is zero, call free(), etc. */ splx(s); -- John Baldwin <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve!" - http://www.FreeBSD.org/