1/*
2 * Copyright (c) 2018, 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
24#include "precompiled.hpp"
25#include "memory/allocation.hpp"
26#include "runtime/synchronizer.hpp"
27#include "runtime/vm_version.hpp"
28#include "unittest.hpp"
29
30class SynchronizerTest : public ::testing::Test {
31 public:
32 static u_char* get_gvars_addr() { return ObjectSynchronizer::get_gvars_addr(); }
33 static u_char* get_gvars_hcSequence_addr() { return ObjectSynchronizer::get_gvars_hcSequence_addr(); }
34 static size_t get_gvars_size() { return ObjectSynchronizer::get_gvars_size(); }
35 static u_char* get_gvars_stwRandom_addr() { return ObjectSynchronizer::get_gvars_stwRandom_addr(); }
36};
37
38TEST_VM(SynchronizerTest, sanity) {
39 uint cache_line_size = VM_Version::L1_data_cache_line_size();
40 if (cache_line_size != 0) {
41 // We were able to determine the L1 data cache line size so
42 // do some cache line specific sanity checks
43
44 u_char *addr_begin = SynchronizerTest::get_gvars_addr();
45 u_char *addr_stwRandom = SynchronizerTest::get_gvars_stwRandom_addr();
46 u_char *addr_hcSequence = SynchronizerTest::get_gvars_hcSequence_addr();
47 size_t gvars_size = SynchronizerTest::get_gvars_size();
48
49 uint offset_stwRandom = (uint) (addr_stwRandom - addr_begin);
50 uint offset_hcSequence = (uint) (addr_hcSequence - addr_begin);
51 uint offset_hcSequence_stwRandom = offset_hcSequence - offset_stwRandom;
52 uint offset_hcSequence_struct_end = (uint) gvars_size - offset_hcSequence;
53
54 EXPECT_GE(offset_stwRandom, cache_line_size)
55 << "the SharedGlobals.stwRandom field is closer "
56 << "to the struct beginning than a cache line which permits "
57 << "false sharing.";
58
59 EXPECT_GE(offset_hcSequence_stwRandom, cache_line_size)
60 << "the SharedGlobals.stwRandom and "
61 << "SharedGlobals.hcSequence fields are closer than a cache "
62 << "line which permits false sharing.";
63
64 EXPECT_GE(offset_hcSequence_struct_end, cache_line_size)
65 << "the SharedGlobals.hcSequence field is closer "
66 << "to the struct end than a cache line which permits false "
67 << "sharing.";
68 }
69}
70