< prev index next >
src/hotspot/share/interpreter/templateInterpreter.cpp
Print this page
rev 55577 : imported patch 8227117.cr0
rev 55579 : [mq]: 8227338.cr0
*** 29,39 ****
--- 29,41 ----
#include "interpreter/templateInterpreter.hpp"
#include "interpreter/templateInterpreterGenerator.hpp"
#include "interpreter/templateTable.hpp"
#include "logging/log.hpp"
#include "memory/resourceArea.hpp"
+ #include "runtime/safepoint.hpp"
#include "runtime/timerTrace.hpp"
+ #include "utilities/copy.hpp"
#ifndef CC_INTERP
# define __ _masm->
*** 273,287 ****
return (int)state;
}
//------------------------------------------------------------------------------------------------------------------------
! // Safepoint suppport
static inline void copy_table(address* from, address* to, int size) {
! // Copy non-overlapping tables. The copy has to occur word wise for MT safety.
while (size-- > 0) *to++ = *from++;
}
void TemplateInterpreter::notice_safepoints() {
if (!_notice_safepoints) {
log_debug(interpreter, safepoint)("switching active_table to safept_table.");
--- 275,295 ----
return (int)state;
}
//------------------------------------------------------------------------------------------------------------------------
! // Safepoint support
static inline void copy_table(address* from, address* to, int size) {
! // Copy non-overlapping tables.
! if (SafepointSynchronize::is_at_safepoint()) {
! // Nothing is using the table at a safepoint so skip atomic word copy.
while (size-- > 0) *to++ = *from++;
+ } else {
+ // Use atomic word copy when not at a safepoint for safety.
+ Copy::disjoint_words_atomic((HeapWord*)from, (HeapWord*)to, (size_t)size);
+ }
}
void TemplateInterpreter::notice_safepoints() {
if (!_notice_safepoints) {
log_debug(interpreter, safepoint)("switching active_table to safept_table.");
< prev index next >