Date: Fri, 4 Apr 2003 10:05:18 -0500 From: Craig Rodrigues <rodrigc@attbi.com> To: John Baldwin <jhb@FreeBSD.org> Cc: freebsd-smp@FreeBSD.org Subject: Re: atomic_dec_and_test() in FreeBSD? Message-ID: <20030404150518.GA15112@attbi.com> In-Reply-To: <XFMail.20030326121321.jhb@FreeBSD.org> References: <20030326023737.GA85101@attbi.com> <XFMail.20030326121321.jhb@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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? Thanks. -- Craig Rodrigues http://home.attbi.com/~rodrigc rodrigc@attbi.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030404150518.GA15112>