TS-2454: Fix undefined reference to `__sync_fetch_and_sub_8' on ARM 32bit system
Signed-off-by: Yunkai Zhang <yun...@redstar.celldoft.com> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/8d8507f3 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/8d8507f3 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/8d8507f3 Branch: refs/heads/5.0.x Commit: 8d8507f3fb9108fdc58b8e7da924b12de8fcbcd0 Parents: a477817 Author: Yunkai Zhang <yun...@redstar.celldoft.com> Authored: Sat Dec 28 19:59:33 2013 +0800 Committer: Yunkai Zhang <qiushu....@taobao.com> Committed: Sat Dec 28 20:10:16 2013 +0800 ---------------------------------------------------------------------- CHANGES | 2 ++ lib/ts/ink_atomic.h | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/8d8507f3/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index c17904a..29079c0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ -*- coding: utf-8 -*- Changes with Apache Traffic Server 4.2.0 + *) TS-2454: Fix undefined reference to `__sync_fetch_and_sub_8' on ARM 32bit system. + *) [TS-2450] Fix assertion failure for T61String type. *) [TS-2117] make hipes plugin build http://git-wip-us.apache.org/repos/asf/trafficserver/blob/8d8507f3/lib/ts/ink_atomic.h ---------------------------------------------------------------------- diff --git a/lib/ts/ink_atomic.h b/lib/ts/ink_atomic.h index 51d87c0..fc8a9f3 100644 --- a/lib/ts/ink_atomic.h +++ b/lib/ts/ink_atomic.h @@ -50,6 +50,7 @@ typedef volatile int8_t vint8; typedef volatile int16_t vint16; typedef volatile int32_t vint32; typedef volatile int64_t vint64; +typedef volatile uint64_t vuint64; typedef volatile long vlong; typedef volatile void *vvoidp; @@ -57,6 +58,7 @@ typedef vint8 *pvint8; typedef vint16 *pvint16; typedef vint32 *pvint32; typedef vint64 *pvint64; +typedef vuint64 *pvuint64; typedef vlong *pvlong; typedef vvoidp *pvvoidp; @@ -194,9 +196,8 @@ ink_atomic_cas<int64_t>(pvint64 mem, int64_t old, int64_t new_value) { return 0; } -template<> -inline int64_t -ink_atomic_increment<int64_t>(pvint64 mem, int64_t value) { +template<typename Amount> static inline int64_t +ink_atomic_increment(pvint64 mem, Amount value) { int64_t curr; ink_mutex_acquire(&__global_death); curr = *mem; @@ -205,10 +206,34 @@ ink_atomic_increment<int64_t>(pvint64 mem, int64_t value) { return curr; } -template<> -inline int64_t -ink_atomic_increment<int64_t>(pvint64 mem, int value) { - return ink_atomic_increment(mem, static_cast<int64_t>(value)); +template<typename Amount> static inline int64_t +ink_atomic_decrement(pvint64 mem, Amount value) { + int64_t curr; + ink_mutex_acquire(&__global_death); + curr = *mem; + *mem = curr - value; + ink_mutex_release(&__global_death); + return curr; +} + +template<typename Amount> static inline uint64_t +ink_atomic_increment(pvuint64 mem, Amount value) { + uint64_t curr; + ink_mutex_acquire(&__global_death); + curr = *mem; + *mem = curr + value; + ink_mutex_release(&__global_death); + return curr; +} + +template<typename Amount> static inline uint64_t +ink_atomic_decrement(pvuint64 mem, Amount value) { + uint64_t curr; + ink_mutex_acquire(&__global_death); + curr = *mem; + *mem = curr - value; + ink_mutex_release(&__global_death); + return curr; } #endif /* Special hacks for ARM 32-bit */