annotate src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp @ 5318:b5cd7bc05695

Method entry counters: Enable the flag to collect an execution profile of compiled methods and their callers. This allows to, e.g., detect methods that should be inlined because they are called frequently.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Fri, 27 Apr 2012 12:56:39 -0700
parents f08d439fab8c
children 63e54c37ac64
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 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
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 "orderAccess_bsd_zero.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 #include "runtime/atomic.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 #include "runtime/os.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32 #include "vm_version_zero.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 // Implementation of class atomic
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 * __m68k_cmpxchg
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 * Returns newval on success and oldval if no exchange happened.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 * This implementation is processor specific and works on
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 * 68020 68030 68040 and 68060.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 * It will not work on ColdFire, 68000 and 68010 since they lack the CAS
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 * instruction.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 * Using a kernelhelper would be better for arch complete implementation.
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 static inline int __m68k_cmpxchg(int oldval, int newval, volatile int *ptr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 int ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 __asm __volatile ("cas%.l %0,%2,%1"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 : "=d" (ret), "+m" (*(ptr))
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 : "d" (newval), "0" (oldval));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57 return ret;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60 /* Perform an atomic compare and swap: if the current value of `*PTR'
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61 is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 `*PTR' before the operation.*/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 static inline int m68k_compare_and_swap(volatile int *ptr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 int oldval,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 if (prev != oldval)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71 if (__m68k_cmpxchg (prev, newval, ptr) == newval)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 // Success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 // We failed even though prev == oldval. Try again.
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 /* Atomically add an int to memory. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 static inline int m68k_add_and_fetch(volatile int *ptr, int add_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 // Loop until success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86 if (__m68k_cmpxchg (prev, prev + add_value, ptr) == prev + add_value)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87 return prev + add_value;
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 /* Atomically write VALUE into `*PTR' and returns the previous
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 contents of `*PTR'. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 static inline int m68k_lock_test_and_set(volatile int *ptr, int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 // Loop until success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98 if (__m68k_cmpxchg (prev, newval, ptr) == prev)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
101 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
107 * __kernel_cmpxchg
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
109 * Atomically store newval in *ptr if *ptr is equal to oldval for user space.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
110 * Return zero if *ptr was changed or non-zero if no exchange happened.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
111 * The C flag is also set if *ptr was changed to allow for assembly
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
112 * optimization in the calling code.
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116 typedef int (__kernel_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117 #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121 /* Perform an atomic compare and swap: if the current value of `*PTR'
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122 is OLDVAL, then write NEWVAL into `*PTR'. Return the contents of
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123 `*PTR' before the operation.*/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 static inline int arm_compare_and_swap(volatile int *ptr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125 int oldval,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129 if (prev != oldval)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132 if (__kernel_cmpxchg (prev, newval, ptr) == 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
133 // Success.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136 // We failed even though prev == oldval. Try again.
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
140 /* Atomically add an int to memory. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141 static inline int arm_add_and_fetch(volatile int *ptr, int add_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143 // Loop until a __kernel_cmpxchg succeeds.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147 if (__kernel_cmpxchg (prev, prev + add_value, ptr) == 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148 return prev + add_value;
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
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 /* Atomically write VALUE into `*PTR' and returns the previous
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153 contents of `*PTR'. */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
154 static inline int arm_lock_test_and_set(volatile int *ptr, int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
155 for (;;) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156 // Loop until a __kernel_cmpxchg succeeds.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157 int prev = *ptr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159 if (__kernel_cmpxchg (prev, newval, ptr) == 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160 return prev;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
161 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
162 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
163 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165 inline void Atomic::store(jint store_value, volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166 #if !defined(ARM) && !defined(M68K)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167 __sync_synchronize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
168 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
169 *dest = store_value;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
170 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
171
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
172 inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 #if !defined(ARM) && !defined(M68K)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
174 __sync_synchronize();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
175 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
176 *dest = store_value;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
177 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
178
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
179 inline jint Atomic::add(jint add_value, volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
180 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
181 return arm_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
182 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
183 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
184 return m68k_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
185 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
186 return __sync_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
187 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
188 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
189 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
190
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
191 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
192 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
193 return arm_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
194 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
195 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
196 return m68k_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
197 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
198 return __sync_add_and_fetch(dest, add_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
199 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
200 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
201 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
202
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
203 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
204 return (void *) add_ptr(add_value, (volatile intptr_t *) dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
205 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
206
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
207 inline void Atomic::inc(volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
208 add(1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
209 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
210
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
211 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
212 add_ptr(1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
213 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
214
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
215 inline void Atomic::inc_ptr(volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
216 add_ptr(1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
217 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
218
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
219 inline void Atomic::dec(volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
220 add(-1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
221 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
222
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
223 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
224 add_ptr(-1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
225 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
226
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
227 inline void Atomic::dec_ptr(volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
228 add_ptr(-1, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
229 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
230
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
231 inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
232 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
233 return arm_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
234 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
235 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
236 return m68k_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
237 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
238 // __sync_lock_test_and_set is a bizarrely named atomic exchange
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
239 // operation. Note that some platforms only support this with the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
240 // limitation that the only valid value to store is the immediate
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
241 // constant 1. There is a test for this in JNI_CreateJavaVM().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
242 return __sync_lock_test_and_set (dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
243 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
244 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
245 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
246
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
247 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
248 volatile intptr_t* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
249 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
250 return arm_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
251 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
252 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
253 return m68k_lock_test_and_set(dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
254 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
255 return __sync_lock_test_and_set (dest, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
256 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
257 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
258 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
259
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
260 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
261 return (void *) xchg_ptr((intptr_t) exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
262 (volatile intptr_t*) dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
263 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
264
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
265 inline jint Atomic::cmpxchg(jint exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
266 volatile jint* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
267 jint compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
268 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
269 return arm_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
270 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
271 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
272 return m68k_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
273 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
274 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
275 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
276 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
277 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
278
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
279 inline jlong Atomic::cmpxchg(jlong exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
280 volatile jlong* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
281 jlong compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
282
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
283 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
284 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
285
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
286 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
287 volatile intptr_t* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
288 intptr_t compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
289 #ifdef ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
290 return arm_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
291 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
292 #ifdef M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
293 return m68k_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
294 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
295 return __sync_val_compare_and_swap(dest, compare_value, exchange_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
296 #endif // M68K
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
297 #endif // ARM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
298 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
299
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
300 inline void* Atomic::cmpxchg_ptr(void* exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
301 volatile void* dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
302 void* compare_value) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
303
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
304 return (void *) cmpxchg_ptr((intptr_t) exchange_value,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
305 (volatile intptr_t*) dest,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
306 (intptr_t) compare_value);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
307 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
308
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
309 inline jlong Atomic::load(volatile jlong* src) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
310 volatile jlong dest;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
311 os::atomic_copy64(src, &dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
312 return dest;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
313 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
314
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
315 inline void Atomic::store(jlong store_value, jlong* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
316 os::atomic_copy64((volatile jlong*)&store_value, (volatile jlong*)dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
317 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
318
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
319 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
320 os::atomic_copy64((volatile jlong*)&store_value, dest);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
321 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
322
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
323 #endif // OS_CPU_BSD_ZERO_VM_ATOMIC_BSD_ZERO_INLINE_HPP