OLD | NEW |
1 // Copyright 2014 Google Inc. All rights reserved. | 1 // Copyright 2014 Google Inc. All rights reserved. |
2 // https://developers.google.com/protocol-buffers/ | 2 // https://developers.google.com/protocol-buffers/ |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, | 47 inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, |
48 Atomic32 new_value) { | 48 Atomic32 new_value) { |
49 return (Atomic32)atomic_swap_32((volatile uint32_t*)ptr, (uint32_t)new_value); | 49 return (Atomic32)atomic_swap_32((volatile uint32_t*)ptr, (uint32_t)new_value); |
50 } | 50 } |
51 | 51 |
52 inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, | 52 inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, |
53 Atomic32 increment) { | 53 Atomic32 increment) { |
54 return (Atomic32)atomic_add_32_nv((volatile uint32_t*)ptr, (uint32_t)increment
); | 54 return (Atomic32)atomic_add_32_nv((volatile uint32_t*)ptr, (uint32_t)increment
); |
55 } | 55 } |
56 | 56 |
57 inline void MemoryBarrierInternal(void) { | 57 inline void MemoryBarrier(void) { |
58 membar_producer(); | 58 membar_producer(); |
59 membar_consumer(); | 59 membar_consumer(); |
60 } | 60 } |
61 | 61 |
62 inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, | 62 inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, |
63 Atomic32 increment) { | 63 Atomic32 increment) { |
64 MemoryBarrierInternal(); | 64 MemoryBarrier(); |
65 Atomic32 ret = NoBarrier_AtomicIncrement(ptr, increment); | 65 Atomic32 ret = NoBarrier_AtomicIncrement(ptr, increment); |
66 MemoryBarrierInternal(); | 66 MemoryBarrier(); |
67 | 67 |
68 return ret; | 68 return ret; |
69 } | 69 } |
70 | 70 |
71 inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, | 71 inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, |
72 Atomic32 old_value, | 72 Atomic32 old_value, |
73 Atomic32 new_value) { | 73 Atomic32 new_value) { |
74 Atomic32 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); | 74 Atomic32 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); |
75 MemoryBarrierInternal(); | 75 MemoryBarrier(); |
76 | 76 |
77 return ret; | 77 return ret; |
78 } | 78 } |
79 | 79 |
80 inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, | 80 inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, |
81 Atomic32 old_value, | 81 Atomic32 old_value, |
82 Atomic32 new_value) { | 82 Atomic32 new_value) { |
83 MemoryBarrierInternal(); | 83 MemoryBarrier(); |
84 return NoBarrier_CompareAndSwap(ptr, old_value, new_value); | 84 return NoBarrier_CompareAndSwap(ptr, old_value, new_value); |
85 } | 85 } |
86 | 86 |
87 inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { | 87 inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { |
88 *ptr = value; | 88 *ptr = value; |
89 } | 89 } |
90 | 90 |
91 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { | 91 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { |
92 *ptr = value; | 92 *ptr = value; |
93 membar_producer(); | 93 membar_producer(); |
(...skipping 28 matching lines...) Expand all Loading... |
122 | 122 |
123 inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_va
lue) { | 123 inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_va
lue) { |
124 return atomic_swap_64((volatile uint64_t*)ptr, (uint64_t)new_value); | 124 return atomic_swap_64((volatile uint64_t*)ptr, (uint64_t)new_value); |
125 } | 125 } |
126 | 126 |
127 inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 incre
ment) { | 127 inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 incre
ment) { |
128 return atomic_add_64_nv((volatile uint64_t*)ptr, increment); | 128 return atomic_add_64_nv((volatile uint64_t*)ptr, increment); |
129 } | 129 } |
130 | 130 |
131 inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increme
nt) { | 131 inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increme
nt) { |
132 MemoryBarrierInternal(); | 132 MemoryBarrier(); |
133 Atomic64 ret = atomic_add_64_nv((volatile uint64_t*)ptr, increment); | 133 Atomic64 ret = atomic_add_64_nv((volatile uint64_t*)ptr, increment); |
134 MemoryBarrierInternal(); | 134 MemoryBarrier(); |
135 return ret; | 135 return ret; |
136 } | 136 } |
137 | 137 |
138 inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, | 138 inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, |
139 Atomic64 old_value, | 139 Atomic64 old_value, |
140 Atomic64 new_value) { | 140 Atomic64 new_value) { |
141 Atomic64 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); | 141 Atomic64 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); |
142 MemoryBarrierInternal(); | 142 MemoryBarrier(); |
143 return ret; | 143 return ret; |
144 } | 144 } |
145 | 145 |
146 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, | 146 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, |
147 Atomic64 old_value, | 147 Atomic64 old_value, |
148 Atomic64 new_value) { | 148 Atomic64 new_value) { |
149 MemoryBarrierInternal(); | 149 MemoryBarrier(); |
150 return NoBarrier_CompareAndSwap(ptr, old_value, new_value); | 150 return NoBarrier_CompareAndSwap(ptr, old_value, new_value); |
151 } | 151 } |
152 | 152 |
153 inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { | 153 inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { |
154 *ptr = value; | 154 *ptr = value; |
155 } | 155 } |
156 | 156 |
157 inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { | 157 inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { |
158 *ptr = value; | 158 *ptr = value; |
159 membar_producer(); | 159 membar_producer(); |
(...skipping 19 matching lines...) Expand all Loading... |
179 return *ptr; | 179 return *ptr; |
180 } | 180 } |
181 #endif | 181 #endif |
182 | 182 |
183 } // namespace internal | 183 } // namespace internal |
184 } // namespace protobuf | 184 } // namespace protobuf |
185 } // namespace google | 185 } // namespace google |
186 | 186 |
187 #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ | 187 #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ |
188 | 188 |
OLD | NEW |