On Sun, Feb 3, 2013 at 8:15 PM, Igor Galić <i.ga...@brainsware.org> wrote:

> On Sunday, February 03, 2013 10:38:37 AM z...@apache.org wrote:
> > TS-1006: Add a new wrapper: ink_atomic_decrement()
> >
> > This is a wrapper of __sync_fetch_and_sub() in GNU env.
>
> And what about non-GNU environments?
>

I have writen a TODO list in the code:

static inline void
ink_chunk_delete(InkFreeList *f, InkThreadCache *pCache, InkChunkInfo
*pChunk)
{
  void *chunk_addr = pChunk->head;

  ...

  /*
   * TODO: I had used ink_atomic_increment() here, but it would
   * lead to incorrect value in linux OS, I don't know why:
   *  ink_atomic_decrement((int64_t *)&total_mem_in_byte,
-f->chunk_byte_size);
   *
   * So I create a new wrap, ink_atomic_decrement(), in ink_atomic.h,
   * it works well. But we should create the same wrap for other OS.
   */
  ink_atomic_decrement(&total_mem_in_byte, f->chunk_byte_size);
}

I'll give new patch once I have other platforms to test and improve it.


>
> > I need this wrapper in reclaimable freelist, as ink_atomic_increment()
> > can't work correctly in some situation by unknown reason.
> >
> > Signed-off-by: Yunkai Zhang <qiushu....@taobao.com>
> > Signed-off-by: Zhao Yongming <ming....@gmail.com>
> >
> >
> > Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> > Commit:
> http://git-wip-us.apache.org/repos/asf/trafficserver/commit/4397abf7
> > Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/4397abf7
> > Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/4397abf7
> >
> > Branch: refs/heads/master
> > Commit: 4397abf76c4fbb7babccc9cc11b0456f2a7a1516
> > Parents: 5d8cc8a
> > Author: Yunkai Zhang <qiushu....@taobao.com>
> > Authored: Sat Feb 2 17:08:18 2013 +0800
> > Committer: Zhao Yongming <ming....@gmail.com>
> > Committed: Sun Feb 3 10:52:58 2013 +0800
> >
> > ----------------------------------------------------------------------
> >  lib/ts/ink_atomic.h |    9 ++++++++-
> >  1 files changed, 8 insertions(+), 1 deletions(-)
> > ----------------------------------------------------------------------
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4397abf7/lib/ts/in
> > k_atomic.h
> > ----------------------------------------------------------------------
> diff
> > --git a/lib/ts/ink_atomic.h b/lib/ts/ink_atomic.h
> > index b22cf24..9425eec 100644
> > --- a/lib/ts/ink_atomic.h
> > +++ b/lib/ts/ink_atomic.h
> > @@ -160,6 +160,13 @@ ink_atomic_increment(volatile Type * mem, Amount
> count)
> > { return __sync_fetch_and_add(mem, (Type)count);
> >  }
> >
> > +// ink_atomic_decrement(ptr, count)
> > +// Decrement @ptr by @count, returning the previous value.
> > +template <typename Type, typename Amount> static inline Type
> > +ink_atomic_decrement(volatile Type * mem, Amount count) {
> > +  return __sync_fetch_and_sub(mem, (Type)count);
> > +}
> > +
> >  // Special hacks for ARM 32-bit
> >  #if defined(__arm__) && (SIZEOF_VOIDP == 4)
> >  extern ProcessMutex __global_death;
> > @@ -213,6 +220,6 @@ ink_atomic_increment<int64_t>(pvint64 mem, int
> value) {
> >
> >  #else /* not gcc > v4.1.2 */
> >  #error Need a compiler / libc that supports atomic operations, e.g. gcc
> > v4.1.2 or later -#endif
> > +#endif
> >
> >  #endif                          /* _ink_atomic_h_ */
>



-- 
Yunkai Zhang
Work at Taobao

Reply via email to