annotate src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp @ 8804:91bf0bdae37b

8008217: CDS: Class data sharing limits the malloc heap on Solaris Summary: In 64bit VM move CDS archive address to 32G on all platforms using new flag SharedBaseAddress. In 32bit VM set CDS archive address to 3Gb on Linux and let other OSs pick the address. Reviewed-by: kvn, dcubed, zgu, hseigel
author coleenp
date Wed, 20 Mar 2013 08:04:54 -0400
parents 63e54c37ac64
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1 /*
8675
63e54c37ac64 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 3960
diff changeset
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3 * Copyright 2007, 2008, 2011 Red Hat, Inc.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
5 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
8 * published by the Free Software Foundation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
9 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
14 * accompanied this code).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
15 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
19 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
22 * questions.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
23 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
24 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
25
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
26 #ifndef OS_CPU_BSD_ZERO_VM_ATOMIC_BSD_ZERO_INLINE_HPP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
27 #define OS_CPU_BSD_ZERO_VM_ATOMIC_BSD_ZERO_INLINE_HPP
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
28
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29 #include "runtime/atomic.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 #include "runtime/os.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 #include "vm_version_zero.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33 // Implementation of class atomic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38 * __m68k_cmpxchg
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 * Returns newval on success and oldval if no exchange happened.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 * This implementation is processor specific and works on
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 * 68020 68030 68040 and 68060.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 * It will not work on ColdFire, 68000 and 68010 since they lack the CAS
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 * instruction.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 * Using a kernelhelper would be better for arch complete implementation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51 static inline int __m68k_cmpxchg(int oldval, int newval, volatile int *ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 int ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 __asm __volatile ("cas%.l %0,%2,%1"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 : "=d" (ret), "+m" (*(ptr))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 : "d" (newval), "0" (oldval));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 return ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59 /* Perform an atomic compare and swap: if the current value of `*PTR'
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60 is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61 `*PTR' before the operation.*/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 static inline int m68k_compare_and_swap(volatile int *ptr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 int oldval,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67 if (prev != oldval)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 if (__m68k_cmpxchg (prev, newval, ptr) == newval)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71 // Success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 // We failed even though prev == oldval. Try again.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78 /* Atomically add an int to memory. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 static inline int m68k_add_and_fetch(volatile int *ptr, int add_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 // Loop until success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85 if (__m68k_cmpxchg (prev, prev + add_value, ptr) == prev + add_value)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86 return prev + add_value;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
88 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
89
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
90 /* Atomically write VALUE into `*PTR' and returns the previous
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 contents of `*PTR'. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 static inline int m68k_lock_test_and_set(volatile int *ptr, int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94 // Loop until success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97 if (__m68k_cmpxchg (prev, newval, ptr) == prev)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
101 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106 * __kernel_cmpxchg
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
107 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
109 * Return zero if *ptr was changed or non-zero if no exchange happened.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
110 * The C flag is also set if *ptr was changed to allow for assembly
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
111 * optimization in the calling code.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
112 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
113 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
114
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
115 typedef int (__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116 #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
118
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
119
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
120 /* Perform an atomic compare and swap: if the current value of `*PTR'
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121 is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122 `*PTR' before the operation.*/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123 static inline int arm_compare_and_swap(volatile int *ptr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 int oldval,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125 int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128 if (prev != oldval)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131 if (__kernel_cmpxchg (prev, newval, ptr) == 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132 // Success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
133 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135 // We failed even though prev == oldval. Try again.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
137 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
138
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
139 /* Atomically add an int to memory. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
140 static inline int arm_add_and_fetch(volatile int *ptr, int add_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142 // Loop until a __kernel_cmpxchg succeeds.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146 if (__kernel_cmpxchg (prev, prev + add_value, ptr) == 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147 return prev + add_value;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
149 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
150
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
151 /* Atomically write VALUE into `*PTR' and returns the previous
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 contents of `*PTR'. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153 static inline int arm_lock_test_and_set(volatile int *ptr, int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
154 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
155 // Loop until a __kernel_cmpxchg succeeds.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158 if (__kernel_cmpxchg (prev, newval, ptr) == 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
161 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
162 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
163
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164 inline void Atomic::store(jint store_value, volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165 #if !defined(ARM) && !defined(M68K)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166 __sync_synchronize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
168 *dest = store_value;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
169 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
170
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
171 inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
172 #if !defined(ARM) && !defined(M68K)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 __sync_synchronize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
174 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
175 *dest = store_value;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
176 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
177
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
178 inline jint Atomic::add(jint add_value, volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
179 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
180 return arm_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
181 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
182 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
183 return m68k_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
184 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
185 return __sync_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
186 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
187 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
188 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
189
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
190 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
191 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
192 return arm_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
193 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
194 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
195 return m68k_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
196 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
197 return __sync_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
198 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
199 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
200 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
201
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
202 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
203 return (void *) add_ptr(add_value, (volatile intptr_t *) dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
204 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
205
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
206 inline void Atomic::inc(volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
207 add(1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
208 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
209
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
210 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
211 add_ptr(1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
212 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
213
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
214 inline void Atomic::inc_ptr(volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
215 add_ptr(1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
216 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
217
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
218 inline void Atomic::dec(volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
219 add(-1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
220 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
221
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
222 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
223 add_ptr(-1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
224 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
225
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
226 inline void Atomic::dec_ptr(volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
227 add_ptr(-1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
228 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
229
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
230 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
231 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
232 return arm_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
233 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
234 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
235 return m68k_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
236 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
237 // __sync_lock_test_and_set is a bizarrely named atomic exchange
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
238 // operation. Note that some platforms only support this with the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
239 // limitation that the only valid value to store is the immediate
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
240 // constant 1. There is a test for this in JNI_CreateJavaVM().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
241 return __sync_lock_test_and_set (dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
242 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
243 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
244 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
245
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
246 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
247 volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
248 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
249 return arm_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
250 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
251 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
252 return m68k_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
253 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
254 return __sync_lock_test_and_set (dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
255 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
256 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
257 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
258
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
259 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
260 return (void *) xchg_ptr((intptr_t) exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
261 (volatile intptr_t*) dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
262 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
263
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
264 inline jint Atomic::cmpxchg(jint exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
265 volatile jint* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
266 jint compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
267 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
268 return arm_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
269 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
270 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
271 return m68k_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
272 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
273 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
274 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
275 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
276 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
277
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
278 inline jlong Atomic::cmpxchg(jlong exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
279 volatile jlong* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
280 jlong compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
281
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
282 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
283 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
284
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
285 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
286 volatile intptr_t* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
287 intptr_t compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
288 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
289 return arm_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
290 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
291 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
292 return m68k_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
293 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
294 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
295 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
296 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
297 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
298
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
299 inline void* Atomic::cmpxchg_ptr(void* exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
300 volatile void* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
301 void* compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
302
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
303 return (void *) cmpxchg_ptr((intptr_t) exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
304 (volatile intptr_t*) dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
305 (intptr_t) compare_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
306 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
307
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
308 inline jlong Atomic::load(volatile jlong* src) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
309 volatile jlong dest;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
310 os::atomic_copy64(src, &dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
311 return dest;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
312 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
313
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
314 inline void Atomic::store(jlong store_value, jlong* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
315 os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
316 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
317
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
318 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
319 os::atomic_copy64((volatile jlong*)&store_value, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
320 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
321
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
322 #endif // OS_CPU_BSD_ZERO_VM_ATOMIC_BSD_ZERO_INLINE_HPP