Index: third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h |
diff --git a/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h b/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h |
similarity index 58% |
copy from third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h |
copy to third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h |
index f05076978683fb17f0f343f909d2dfd3582302d1..a0116a60ee796b3300bb412ecbe613ab9b307779 100644 |
--- a/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h |
+++ b/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h |
@@ -1,6 +1,4 @@ |
-// Protocol Buffers - Google's data interchange format |
-// Copyright 2012 Google Inc. All rights reserved. |
-// http://code.google.com/p/protobuf/ |
+// Copyright 2013 Red Hat Inc. All rights reserved. |
// |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
@@ -12,7 +10,7 @@ |
// copyright notice, this list of conditions and the following disclaimer |
// in the documentation and/or other materials provided with the |
// distribution. |
-// * Neither the name of Google Inc. nor the names of its |
+// * Neither the name of Red Hat Inc. nor the names of its |
// contributors may be used to endorse or promote products derived from |
// this software without specific prior written permission. |
// |
@@ -30,84 +28,54 @@ |
// This file is an internal atomic implementation, use atomicops.h instead. |
-#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ |
-#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ |
- |
-// For _smp_cmpxchg() |
-#include <pthread.h> |
+#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ |
+#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ |
namespace google { |
namespace protobuf { |
namespace internal { |
-inline Atomic32 QNXCmpxchg(Atomic32 old_value, |
- Atomic32 new_value, |
- volatile Atomic32* ptr) { |
- return static_cast<Atomic32>( |
- _smp_cmpxchg((volatile unsigned *)ptr, |
- (unsigned)old_value, |
- (unsigned)new_value)); |
-} |
- |
- |
inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, |
Atomic32 old_value, |
Atomic32 new_value) { |
- Atomic32 prev_value = *ptr; |
- do { |
- if (!QNXCmpxchg(old_value, new_value, |
- const_cast<Atomic32*>(ptr))) { |
- return old_value; |
- } |
- prev_value = *ptr; |
- } while (prev_value == old_value); |
- return prev_value; |
+ __atomic_compare_exchange_n(ptr, &old_value, new_value, true, |
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED); |
+ return old_value; |
} |
inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, |
Atomic32 new_value) { |
- Atomic32 old_value; |
- do { |
- old_value = *ptr; |
- } while (QNXCmpxchg(old_value, new_value, |
- const_cast<Atomic32*>(ptr))); |
- return old_value; |
+ return __atomic_exchange_n(ptr, new_value, __ATOMIC_RELAXED); |
} |
inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, |
Atomic32 increment) { |
- return Barrier_AtomicIncrement(ptr, increment); |
+ return __atomic_add_fetch(ptr, increment, __ATOMIC_RELAXED); |
} |
inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, |
Atomic32 increment) { |
- for (;;) { |
- // Atomic exchange the old value with an incremented one. |
- Atomic32 old_value = *ptr; |
- Atomic32 new_value = old_value + increment; |
- if (QNXCmpxchg(old_value, new_value, |
- const_cast<Atomic32*>(ptr)) == 0) { |
- // The exchange took place as expected. |
- return new_value; |
- } |
- // Otherwise, *ptr changed mid-loop and we need to retry. |
- } |
+ return __atomic_add_fetch(ptr, increment, __ATOMIC_SEQ_CST); |
} |
inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, |
Atomic32 old_value, |
Atomic32 new_value) { |
- return NoBarrier_CompareAndSwap(ptr, old_value, new_value); |
+ __atomic_compare_exchange_n(ptr, &old_value, new_value, true, |
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); |
+ return old_value; |
} |
inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, |
Atomic32 old_value, |
Atomic32 new_value) { |
- return NoBarrier_CompareAndSwap(ptr, old_value, new_value); |
+ __atomic_compare_exchange_n(ptr, &old_value, new_value, true, |
+ __ATOMIC_RELEASE, __ATOMIC_ACQUIRE); |
+ return old_value; |
} |
inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { |
- *ptr = value; |
+ __atomic_store_n(ptr, value, __ATOMIC_RELAXED); |
} |
inline void MemoryBarrier() { |
@@ -115,32 +83,55 @@ inline void MemoryBarrier() { |
} |
inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { |
- *ptr = value; |
- MemoryBarrier(); |
+ __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST); |
} |
inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { |
- MemoryBarrier(); |
- *ptr = value; |
+ __atomic_store_n(ptr, value, __ATOMIC_RELEASE); |
} |
inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { |
- return *ptr; |
+ return __atomic_load_n(ptr, __ATOMIC_RELAXED); |
} |
inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { |
- Atomic32 value = *ptr; |
- MemoryBarrier(); |
- return value; |
+ return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); |
} |
inline Atomic32 Release_Load(volatile const Atomic32* ptr) { |
- MemoryBarrier(); |
- return *ptr; |
+ return __atomic_load_n(ptr, __ATOMIC_SEQ_CST); |
+} |
+ |
+#ifdef __LP64__ |
+ |
+inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { |
+ __atomic_store_n(ptr, value, __ATOMIC_RELEASE); |
+} |
+ |
+inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { |
+ return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); |
+} |
+ |
+inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, |
+ Atomic64 old_value, |
+ Atomic64 new_value) { |
+ __atomic_compare_exchange_n(ptr, &old_value, new_value, true, |
+ __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); |
+ return old_value; |
} |
+inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, |
+ Atomic64 old_value, |
+ Atomic64 new_value) { |
+ __atomic_compare_exchange_n(ptr, &old_value, new_value, true, |
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED); |
+ return old_value; |
+} |
+ |
+#endif // defined(__LP64__) |
+ |
} // namespace internal |
} // namespace protobuf |
} // namespace google |
-#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ |
+#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ |