hotspot/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp
author dholmes
Tue, 03 Mar 2015 19:20:26 -0500
changeset 29456 cc1c5203e60d
parent 25715 d5a8dbdc5150
child 40655 9f644073d3a0
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: 25715
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 OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    26
#define OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    27
15855
2ac9ebea17f3 8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents: 14626
diff changeset
    28
#include "runtime/atomic.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    29
#include "runtime/orderAccess.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7885
diff changeset
    30
#include "runtime/os.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    31
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    32
// Compiler version last used for testing: solaris studio 12u3
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    33
// Please update this information when this file changes
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    34
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// Implementation of class OrderAccess.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    37
// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    38
inline void compiler_barrier() {
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    39
  __asm__ volatile ("" : : : "memory");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    42
inline void OrderAccess::loadload()   { compiler_barrier(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    43
inline void OrderAccess::storestore() { compiler_barrier(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    44
inline void OrderAccess::loadstore()  { compiler_barrier(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    45
inline void OrderAccess::storeload()  { fence();            }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    46
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    47
inline void OrderAccess::acquire()    { compiler_barrier(); }
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    48
inline void OrderAccess::release()    { compiler_barrier(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
inline void OrderAccess::fence() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  if (os::is_MP()) {
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    52
#ifdef AMD64
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    53
    __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory");
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    54
#else
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    55
    __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    56
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  }
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    58
  compiler_barrier();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
29456
cc1c5203e60d 7143664: Clean up OrderAccess implementations and usage
dholmes
parents: 25715
diff changeset
    61
#define VM_HAS_GENERALIZED_ORDER_ACCESS 1
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    62
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6253
diff changeset
    63
#endif // OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP