Tue, 15 Mar 2011 06:35:10 -0700
7024234: 2/3 jvmti tests fail assert(!_oops_are_stale) failed: oops are stale on Win-AMD64
Summary: Move initialization of the '_instance' field to avoid race with ServiceThread start.
Reviewed-by: dholmes, kamg, never, dsamersoff, ysr, coleenp, acorn
1 /*
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #include "precompiled.hpp"
26 #include "runtime/atomic.hpp"
27 #ifdef TARGET_OS_FAMILY_linux
28 # include "os_linux.inline.hpp"
29 #endif
30 #ifdef TARGET_OS_FAMILY_solaris
31 # include "os_solaris.inline.hpp"
32 #endif
33 #ifdef TARGET_OS_FAMILY_windows
34 # include "os_windows.inline.hpp"
35 #endif
36 #ifdef TARGET_OS_ARCH_linux_x86
37 # include "atomic_linux_x86.inline.hpp"
38 #endif
39 #ifdef TARGET_OS_ARCH_linux_sparc
40 # include "atomic_linux_sparc.inline.hpp"
41 #endif
42 #ifdef TARGET_OS_ARCH_linux_zero
43 # include "atomic_linux_zero.inline.hpp"
44 #endif
45 #ifdef TARGET_OS_ARCH_solaris_x86
46 # include "atomic_solaris_x86.inline.hpp"
47 #endif
48 #ifdef TARGET_OS_ARCH_solaris_sparc
49 # include "atomic_solaris_sparc.inline.hpp"
50 #endif
51 #ifdef TARGET_OS_ARCH_windows_x86
52 # include "atomic_windows_x86.inline.hpp"
53 #endif
55 jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
56 assert(sizeof(jbyte) == 1, "assumption.");
57 uintptr_t dest_addr = (uintptr_t)dest;
58 uintptr_t offset = dest_addr % sizeof(jint);
59 volatile jint* dest_int = (volatile jint*)(dest_addr - offset);
60 jint cur = *dest_int;
61 jbyte* cur_as_bytes = (jbyte*)(&cur);
62 jint new_val = cur;
63 jbyte* new_val_as_bytes = (jbyte*)(&new_val);
64 new_val_as_bytes[offset] = exchange_value;
65 while (cur_as_bytes[offset] == compare_value) {
66 jint res = cmpxchg(new_val, dest_int, cur);
67 if (res == cur) break;
68 cur = res;
69 new_val = cur;
70 new_val_as_bytes[offset] = exchange_value;
71 }
72 return cur_as_bytes[offset];
73 }
75 unsigned Atomic::xchg(unsigned int exchange_value, volatile unsigned int* dest) {
76 assert(sizeof(unsigned int) == sizeof(jint), "more work to do");
77 return (unsigned int)Atomic::xchg((jint)exchange_value, (volatile jint*)dest);
78 }
80 unsigned Atomic::cmpxchg(unsigned int exchange_value,
81 volatile unsigned int* dest, unsigned int compare_value) {
82 assert(sizeof(unsigned int) == sizeof(jint), "more work to do");
83 return (unsigned int)Atomic::cmpxchg((jint)exchange_value, (volatile jint*)dest,
84 (jint)compare_value);
85 }