Skip site navigation (1)Skip section navigation (2)
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>