< prev index next >
src/share/vm/gc_implementation/shenandoah/shenandoahCodeRoots.hpp
Print this page
rev 10690 : [backport] Cleanup header files and forward declarations
rev 10715 : [backport] Cleanup up superfluous newlines
rev 10740 : [backport] Protect more internal code from false sharing
rev 10772 : [backport] Update copyrights
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2017, 2018, Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
@@ -19,28 +19,29 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
-
#ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCODEROOTS_HPP
#define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCODEROOTS_HPP
#include "code/codeCache.hpp"
+#include "gc_implementation/shenandoah/shenandoahSharedVariables.hpp"
#include "memory/allocation.hpp"
#include "memory/iterator.hpp"
-#include "gc_implementation/shenandoah/shenandoahSharedVariables.hpp"
class ShenandoahHeap;
class ShenandoahHeapRegion;
class ShenandoahCodeRootsLock;
class ShenandoahParallelCodeCacheIterator VALUE_OBJ_CLASS_SPEC {
friend class CodeCache;
private:
+ char _pad0[DEFAULT_CACHE_LINE_SIZE];
volatile int _claimed_idx;
volatile bool _finished;
+ char _pad1[DEFAULT_CACHE_LINE_SIZE];
public:
ShenandoahParallelCodeCacheIterator();
void parallel_blobs_do(CodeBlobClosure* f);
};
@@ -76,11 +77,13 @@
friend class ShenandoahCodeRoots;
protected:
ShenandoahHeap* _heap;
ShenandoahParallelCodeCacheIterator _par_iterator;
ShenandoahSharedFlag _seq_claimed;
+ char _pad0[DEFAULT_CACHE_LINE_SIZE];
volatile jlong _claimed;
+ char _pad1[DEFAULT_CACHE_LINE_SIZE];
protected:
ShenandoahCodeRootsIterator();
~ShenandoahCodeRootsIterator();
template<bool CSET_FILTER>
@@ -123,15 +126,21 @@
* @return
*/
static ShenandoahCsetCodeRootsIterator cset_iterator();
private:
- static volatile jint _recorded_nms_lock;
+ struct PaddedLock {
+ char _pad0[DEFAULT_CACHE_LINE_SIZE];
+ volatile int _lock;
+ char _pad1[DEFAULT_CACHE_LINE_SIZE];
+ };
+
+ static PaddedLock _recorded_nms_lock;
static GrowableArray<ShenandoahNMethod*>* _recorded_nms;
static void acquire_lock(bool write) {
- volatile jint* loc = &_recorded_nms_lock;
+ volatile int* loc = &_recorded_nms_lock._lock;
if (write) {
while ((OrderAccess::load_acquire(loc) != 0) ||
Atomic::cmpxchg(-1, loc, 0) != 0) {
SpinPause();
}
@@ -150,11 +159,11 @@
}
}
}
static void release_lock(bool write) {
- volatile jint* loc = &ShenandoahCodeRoots::_recorded_nms_lock;
+ volatile int* loc = &ShenandoahCodeRoots::_recorded_nms_lock._lock;
if (write) {
OrderAccess::release_store_fence(loc, 0);
} else {
Atomic::dec(loc);
}
< prev index next >