annotate src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp @ 795:215f81b4d9b3

6841831: G1: assert(contains_reference(from),"We just added it!") fires Summary: During parallel rset updating we have to make sure that the worker ids of the refinement threads do not intersect with the worker ids that can be claimed by the mutator threads. Reviewed-by: tonyp
author iveresov
date Mon, 18 May 2009 11:52:46 -0700
parents d0994e5bebce
children bd02caa94611
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // Implementation of class OrderAccess.
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // For Sun Studio - implementation is in solaris_i486.il.
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // For gcc - implementation is just below.
a61af66fc99e Initial load
duke
parents:
diff changeset
29 extern "C" void _OrderAccess_acquire();
a61af66fc99e Initial load
duke
parents:
diff changeset
30 extern "C" void _OrderAccess_fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 inline void OrderAccess::loadload() { acquire(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
33 inline void OrderAccess::storestore() { release(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
34 inline void OrderAccess::loadstore() { acquire(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
35 inline void OrderAccess::storeload() { fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 inline void OrderAccess::acquire() {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 _OrderAccess_acquire();
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 }
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 inline void OrderAccess::release() {
a61af66fc99e Initial load
duke
parents:
diff changeset
43 dummy = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 }
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 inline void OrderAccess::fence() {
a61af66fc99e Initial load
duke
parents:
diff changeset
47 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _OrderAccess_fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
49 }
a61af66fc99e Initial load
duke
parents:
diff changeset
50 }
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 #ifdef _GNU_SOURCE
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 inline void _OrderAccess_acquire() {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 volatile intptr_t dummy;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
58 __asm__ volatile ("movq 0(%%rsp), %0" : "=r" (dummy) : : "memory");
a61af66fc99e Initial load
duke
parents:
diff changeset
59 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
60 __asm__ volatile ("movl 0(%%esp),%0" : "=r" (dummy) : : "memory");
a61af66fc99e Initial load
duke
parents:
diff changeset
61 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
62 }
a61af66fc99e Initial load
duke
parents:
diff changeset
63 inline void _OrderAccess_fence() {
671
d0994e5bebce 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 0
diff changeset
64 // Always use locked addl since mfence is sometimes expensive
0
a61af66fc99e Initial load
duke
parents:
diff changeset
65 __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");
a61af66fc99e Initial load
duke
parents:
diff changeset
66 }
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 #endif // GNU_SOURCE
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 inline jshort OrderAccess::load_acquire(volatile jshort* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
75 inline jlong OrderAccess::load_acquire(volatile jlong* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 inline jushort OrderAccess::load_acquire(volatile jushort* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
78 inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
79 inline julong OrderAccess::load_acquire(volatile julong* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
80 inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
84 inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
85 inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return *(void* const volatile *)p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 inline void OrderAccess::release_store(volatile jshort* p, jshort v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 inline void OrderAccess::release_store(volatile jint* p, jint v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 inline void OrderAccess::release_store(volatile jlong* p, jlong v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 inline void OrderAccess::release_store(volatile jushort* p, jushort v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
94 inline void OrderAccess::release_store(volatile julong* p, julong v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
102 inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
103 inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
104 inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
113 inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
123 inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
124 inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { *p = v; fence(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { *(void* volatile *)p = v; fence(); }