On 03/02/2013, at 9:00 AM, Yunkai Zhang <yunkai...@gmail.com> wrote:

> 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:

We should investigate using C++ atomics where possible. It looks like GCC has 
changed the memory barrier semantics of the intrinsics over time; there's 
probably cases where this is hurting us ...

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51798

> 
> 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:

Comparing the generated code might be illuminating ...

>   *  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