hotspot/src/share/vm/runtime/orderAccess.hpp
author dholmes
Tue, 03 Mar 2015 19:20:26 -0500
changeset 29456 cc1c5203e60d
parent 22551 9bf46d16dcc6
child 46523 cbcc0ebaa044
permissions -rw-r--r--
7143664: Clean up OrderAccess implementations and usage Summary: Clarify and correct the abstract model for memory barriers provided by the orderAccess class. Refactor the implementations using template specialization to allow the bulk of the code to be shared, with platform specific customizations applied as needed. Reviewed-by: acorn, dcubed, dholmes, dlong, goetz, kbarrett, sgehwolf Contributed-by: Erik Osterlund <erik.osterlund@lnu.se>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
     2
 * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 3261
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    25
#ifndef SHARE_VM_RUNTIME_ORDERACCESS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    26
#define SHARE_VM_RUNTIME_ORDERACCESS_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    28
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    29
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
//                Memory Access Ordering Model
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    32
// This interface is based on the JSR-133 Cookbook for Compiler Writers.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// In the following, the terms 'previous', 'subsequent', 'before',
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1
diff changeset
    35
// 'after', 'preceding' and 'succeeding' refer to program order.  The
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// terms 'down' and 'below' refer to forward load or store motion
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// relative to program order, while 'up' and 'above' refer to backward
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// motion.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// We define four primitive memory barrier operations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// LoadLoad:   Load1(s); LoadLoad; Load2
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// Ensures that Load1 completes (obtains the value it loads from memory)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// before Load2 and any subsequent load operations.  Loads before Load1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// may *not* float below Load2 and any subsequent load operations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
// StoreStore: Store1(s); StoreStore; Store2
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
// Ensures that Store1 completes (the effect on memory of Store1 is made
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
// visible to other processors) before Store2 and any subsequent store
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
// operations.  Stores before Store1 may *not* float below Store2 and any
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// subsequent store operations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// LoadStore:  Load1(s); LoadStore; Store2
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
// Ensures that Load1 completes before Store2 and any subsequent store
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
// operations.  Loads before Load1 may *not* float below Store2 and any
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 7397
diff changeset
    59
// subsequent store operations.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// StoreLoad:  Store1(s); StoreLoad; Load2
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
// Ensures that Store1 completes before Load2 and any subsequent load
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// operations.  Stores before Store1 may *not* float below Load2 and any
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 7397
diff changeset
    65
// subsequent load operations.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    67
// We define two further barriers: acquire and release.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    69
// Conceptually, acquire/release semantics form unidirectional and
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    70
// asynchronous barriers w.r.t. a synchronizing load(X) and store(X) pair.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    71
// They should always be used in pairs to publish (release store) and
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    72
// access (load acquire) some implicitly understood shared data between
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    73
// threads in a relatively cheap fashion not requiring storeload. If not
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    74
// used in such a pair, it is advised to use a membar instead:
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    75
// acquire/release only make sense as pairs.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    76
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    77
// T1: access_shared_data
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    78
// T1: ]release
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    79
// T1: (...)
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    80
// T1: store(X)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    82
// T2: load(X)
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    83
// T2: (...)
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    84
// T2: acquire[
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    85
// T2: access_shared_data
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    86
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    87
// It is guaranteed that if T2: load(X) synchronizes with (observes the
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    88
// value written by) T1: store(X), then the memory accesses before the T1:
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    89
// ]release happen before the memory accesses after the T2: acquire[.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    90
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    91
// Total Store Order (TSO) machines can be seen as machines issuing a
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    92
// release store for each store and a load acquire for each load. Therefore
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    93
// there is an inherent resemblence between TSO and acquire/release
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    94
// semantics. TSO can be seen as an abstract machine where loads are
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    95
// executed immediately when encountered (hence loadload reordering not
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    96
// happening) but enqueues stores in a FIFO queue
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    97
// for asynchronous serialization (neither storestore or loadstore
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    98
// reordering happening). The only reordering happening is storeload due to
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
    99
// the queue asynchronously serializing stores (yet in order).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   101
// Acquire/release semantics essentially exploits this asynchronicity: when
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   102
// the load(X) acquire[ observes the store of ]release store(X), the
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   103
// accesses before the release must have happened before the accesses after
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   104
// acquire.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   105
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   106
// The API offers both stand-alone acquire() and release() as well as bound
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   107
// load_acquire() and release_store(). It is guaranteed that these are
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   108
// semantically equivalent w.r.t. the defined model. However, since
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   109
// stand-alone acquire()/release() does not know which previous
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   110
// load/subsequent store is considered the synchronizing load/store, they
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   111
// may be more conservative in implementations. We advise using the bound
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   112
// variants whenever possible.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   113
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   114
// Finally, we define a "fence" operation, as a bidirectional barrier.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   115
// It guarantees that any memory access preceding the fence is not
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   116
// reordered w.r.t. any memory accesses subsequent to the fence in program
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   117
// order. This may be used to prevent sequences of loads from floating up
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   118
// above sequences of stores.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   120
// The following table shows the implementations on some architectures:
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   121
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   122
//                       Constraint     x86          sparc TSO          ppc
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   123
// ---------------------------------------------------------------------------
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   124
// fence                 LoadStore  |   lock         membar #StoreLoad  sync
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   125
//                       StoreStore |   addl 0,(sp)
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   126
//                       LoadLoad   |
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   127
//                       StoreLoad
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   128
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   129
// release               LoadStore  |                                   lwsync
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   130
//                       StoreStore
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   131
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   132
// acquire               LoadLoad   |                                   lwsync
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   133
//                       LoadStore
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   134
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   135
// release_store                        <store>      <store>            lwsync
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   136
//                                                                      <store>
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   137
//
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   138
// release_store_fence                  xchg         <store>            lwsync
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   139
//                                                   membar #StoreLoad  <store>
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   140
//                                                                      sync
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   143
// load_acquire                         <load>       <load>             <load>
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   144
//                                                                      lwsync
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   146
// Ordering a load relative to preceding stores requires a StoreLoad,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
// which implies a membar #StoreLoad between the store and load under
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   148
// sparc-TSO. On x86, we use explicitly locked add.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
// Conventional usage is to issue a load_acquire for ordered loads.  Use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
// release_store for ordered stores when you care only that prior stores
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
// are visible before the release_store, but don't care exactly when the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
// store associated with the release_store becomes visible.  Use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
// release_store_fence to update values like the thread state, where we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
// don't want the current thread to continue until all our prior memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
// accesses (including the new thread state) are visible to other threads.
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   157
// This is equivalent to the volatile semantics of the Java Memory Model.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   159
//                    C++ Volatile Semantics
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
//
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   161
// C++ volatile semantics prevent compiler re-ordering between
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   162
// volatile memory accesses. However, reordering between non-volatile
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   163
// and volatile memory accesses is in general undefined. For compiler
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   164
// reordering constraints taking non-volatile memory accesses into
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   165
// consideration, a compiler barrier has to be used instead.  Some
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   166
// compiler implementations may choose to enforce additional
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   167
// constraints beyond those required by the language. Note also that
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   168
// both volatile semantics and compiler barrier do not prevent
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   169
// hardware reordering.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
//                os::is_MP Considered Redundant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
// Callers of this interface do not need to test os::is_MP() before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
// issuing an operation. The test is taken care of by the implementation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
// of the interface (depending on the vm version and platform, the test
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
// may or may not be actually done by the implementation).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
//                A Note on Memory Ordering and Cache Coherency
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
// Cache coherency and memory ordering are orthogonal concepts, though they
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
// interact.  E.g., all existing itanium machines are cache-coherent, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
// the hardware can freely reorder loads wrt other loads unless it sees a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
// load-acquire instruction.  All existing sparc machines are cache-coherent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
// and, unlike itanium, TSO guarantees that the hardware orders loads wrt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
// loads and stores, and stores wrt to each other.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
// Consider the implementation of loadload.  *If* your platform *isn't*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
// cache-coherent, then loadload must not only prevent hardware load
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
// instruction reordering, but it must *also* ensure that subsequent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
// loads from addresses that could be written by other processors (i.e.,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
// that are broadcast by other processors) go all the way to the first
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
// level of memory shared by those processors and the one issuing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
// the loadload.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
// So if we have a MP that has, say, a per-processor D$ that doesn't see
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
// writes by other processors, and has a shared E$ that does, the loadload
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
// barrier would have to make sure that either
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
// 1. cache lines in the issuing processor's D$ that contained data from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
// addresses that could be written by other processors are invalidated, so
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
// subsequent loads from those addresses go to the E$, (it could do this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
// by tagging such cache lines as 'shared', though how to tell the hardware
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
// to do the tagging is an interesting problem), or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
// 2. there never are such cache lines in the issuing processor's D$, which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
// means all references to shared data (however identified: see above)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
// bypass the D$ (i.e., are satisfied from the E$).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
// If your machine doesn't have an E$, substitute 'main memory' for 'E$'.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
// Either of these alternatives is a pain, so no current machine we know of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
// has incoherent caches.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
// If loadload didn't have these properties, the store-release sequence for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
// publishing a shared data structure wouldn't work, because a processor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
// trying to read data newly published by another processor might go to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
// its own incoherent caches to satisfy the read instead of to the newly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
// written shared memory.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
//                NOTE WELL!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
//                A Note on MutexLocker and Friends
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
// See mutexLocker.hpp.  We assume throughout the VM that MutexLocker's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
// and friends' constructors do a fence, a lock and an acquire *in that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
// order*.  And that their destructors do a release and unlock, in *that*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
// order.  If their implementations change such that these assumptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
// are violated, a whole lot of code will break.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   232
enum ScopedFenceType {
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   233
    X_ACQUIRE
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   234
  , RELEASE_X
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   235
  , RELEASE_X_FENCE
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   236
};
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   237
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   238
template <ScopedFenceType T>
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   239
class ScopedFenceGeneral: public StackObj {
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   240
 public:
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   241
  void prefix() {}
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   242
  void postfix() {}
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   243
};
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   244
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   245
template <ScopedFenceType T>
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   246
class ScopedFence : public ScopedFenceGeneral<T> {
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   247
  void *const _field;
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   248
 public:
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   249
  ScopedFence(void *const field) : _field(field) { prefix(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   250
  ~ScopedFence() { postfix(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   251
  void prefix() { ScopedFenceGeneral<T>::prefix(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   252
  void postfix() { ScopedFenceGeneral<T>::postfix(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   253
};
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   254
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
class OrderAccess : AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
 public:
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   257
  // barriers
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  static void     loadload();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  static void     storestore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  static void     loadstore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  static void     storeload();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  static void     acquire();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  static void     release();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  static void     fence();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  static jbyte    load_acquire(volatile jbyte*   p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  static jshort   load_acquire(volatile jshort*  p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  static jint     load_acquire(volatile jint*    p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  static jlong    load_acquire(volatile jlong*   p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  static jubyte   load_acquire(volatile jubyte*  p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  static jushort  load_acquire(volatile jushort* p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  static juint    load_acquire(volatile juint*   p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  static julong   load_acquire(volatile julong*  p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  static jfloat   load_acquire(volatile jfloat*  p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  static jdouble  load_acquire(volatile jdouble* p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  static intptr_t load_ptr_acquire(volatile intptr_t*   p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  static void*    load_ptr_acquire(volatile void*       p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  static void*    load_ptr_acquire(const volatile void* p);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  static void     release_store(volatile jbyte*   p, jbyte   v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  static void     release_store(volatile jshort*  p, jshort  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  static void     release_store(volatile jint*    p, jint    v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  static void     release_store(volatile jlong*   p, jlong   v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  static void     release_store(volatile jubyte*  p, jubyte  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  static void     release_store(volatile jushort* p, jushort v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  static void     release_store(volatile juint*   p, juint   v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  static void     release_store(volatile julong*  p, julong  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  static void     release_store(volatile jfloat*  p, jfloat  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  static void     release_store(volatile jdouble* p, jdouble v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  static void     release_store_ptr(volatile intptr_t* p, intptr_t v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  static void     release_store_ptr(volatile void*     p, void*    v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  static void     release_store_fence(volatile jbyte*   p, jbyte   v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  static void     release_store_fence(volatile jshort*  p, jshort  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  static void     release_store_fence(volatile jint*    p, jint    v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  static void     release_store_fence(volatile jlong*   p, jlong   v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  static void     release_store_fence(volatile jubyte*  p, jubyte  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  static void     release_store_fence(volatile jushort* p, jushort v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  static void     release_store_fence(volatile juint*   p, juint   v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  static void     release_store_fence(volatile julong*  p, julong  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  static void     release_store_fence(volatile jfloat*  p, jfloat  v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  static void     release_store_fence(volatile jdouble* p, jdouble v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  static void     release_store_ptr_fence(volatile intptr_t* p, intptr_t v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  static void     release_store_ptr_fence(volatile void*     p, void*    v);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
2338
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2131
diff changeset
   310
 private:
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2131
diff changeset
   311
  // This is a helper that invokes the StubRoutines::fence_entry()
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2131
diff changeset
   312
  // routine if it exists, It should only be used by platforms that
22551
9bf46d16dcc6 8025856: Fix typos in the GC code
jwilhelm
parents: 7397
diff changeset
   313
  // don't have another way to do the inline assembly.
2338
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2131
diff changeset
   314
  static void StubRoutines_fence();
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   315
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   316
  // Give platforms a variation point to specialize.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   317
  template<typename T> static T    specialized_load_acquire       (volatile T* p     );
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   318
  template<typename T> static void specialized_release_store      (volatile T* p, T v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   319
  template<typename T> static void specialized_release_store_fence(volatile T* p, T v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   320
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   321
  template<typename FieldType, ScopedFenceType FenceType>
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   322
  static void ordered_store(volatile FieldType* p, FieldType v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   323
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   324
  template<typename FieldType, ScopedFenceType FenceType>
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   325
  static FieldType ordered_load(volatile FieldType* p);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   326
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   327
  static void    store(volatile jbyte*   p, jbyte   v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   328
  static void    store(volatile jshort*  p, jshort  v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   329
  static void    store(volatile jint*    p, jint    v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   330
  static void    store(volatile jlong*   p, jlong   v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   331
  static void    store(volatile jdouble* p, jdouble v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   332
  static void    store(volatile jfloat*  p, jfloat  v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   333
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   334
  static jbyte   load (volatile jbyte*   p);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   335
  static jshort  load (volatile jshort*  p);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   336
  static jint    load (volatile jint*    p);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   337
  static jlong   load (volatile jlong*   p);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   338
  static jdouble load (volatile jdouble* p);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   339
  static jfloat  load (volatile jfloat*  p);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   340
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   341
  // The following store_fence methods are deprecated and will be removed
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   342
  // when all repos conform to the new generalized OrderAccess.
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   343
  static void    store_fence(jbyte*   p, jbyte   v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   344
  static void    store_fence(jshort*  p, jshort  v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   345
  static void    store_fence(jint*    p, jint    v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   346
  static void    store_fence(jlong*   p, jlong   v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   347
  static void    store_fence(jubyte*  p, jubyte  v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   348
  static void    store_fence(jushort* p, jushort v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   349
  static void    store_fence(juint*   p, juint   v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   350
  static void    store_fence(julong*  p, julong  v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   351
  static void    store_fence(jfloat*  p, jfloat  v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   352
  static void    store_fence(jdouble* p, jdouble v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   353
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   354
  static void    store_ptr_fence(intptr_t* p, intptr_t v);
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 22551
diff changeset
   355
  static void    store_ptr_fence(void**    p, void*    v);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
   357
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
   358
#endif // SHARE_VM_RUNTIME_ORDERACCESS_HPP