< prev index next >
src/hotspot/share/prims/unsafe.cpp
Print this page
*** 40,49 ****
--- 40,50 ----
#include "runtime/globals.hpp"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/jniHandles.inline.hpp"
#include "runtime/orderAccess.hpp"
#include "runtime/reflection.hpp"
+ #include "runtime/sharedRuntime.hpp"
#include "runtime/thread.hpp"
#include "runtime/threadSMR.hpp"
#include "runtime/vm_version.hpp"
#include "services/threadService.hpp"
#include "utilities/align.hpp"
*** 440,449 ****
--- 441,518 ----
Copy::conjoint_swap(src, dst, sz, esz);
} JVM_END
}
} UNSAFE_END
+ UNSAFE_LEAF (void, Unsafe_WriteBack0(JNIEnv *env, jobject unsafe, jlong line)) {
+ #ifndef PRODUCT
+ if (TraceMemoryWriteback) {
+ tty->print_cr("Unsafe: writeback 0x%p", addr_from_java(line));
+ }
+ #endif
+
+ // guard against currently unimplemented cases
+ #if !defined(LINUX) || !(defined(AARCH64) || defined(AMD64))
+ // TODO - implement for solaris/AIX/BSD/WINDOWS and for 32 bit
+ JNU_ThrowRuntimeException(env, "writeback is not implemented");
+ return IOS_THROWN;
+ #else
+ void (*wb)(void *);
+ void *a = addr_from_java(line);
+ wb = (void (*)(void *)) StubRoutines::data_cache_writeback();
+ assert(wb != NULL, "generate writeback stub!");
+ (*wb)(a);
+ #endif
+ } UNSAFE_END
+
+ static void doWriteBackSync0(bool isPre)
+ {
+ void (*wbsync)(int);
+ wbsync = (void (*)(int)) StubRoutines::data_cache_writeback_sync();
+ assert(wbsync != NULL, "generate writeback sync stub!");
+ (*wbsync)(isPre);
+ }
+
+ UNSAFE_LEAF (void, Unsafe_WriteBackPreSync0(JNIEnv *env, jobject unsafe)) {
+ #ifndef PRODUCT
+ if (TraceMemoryWriteback) {
+ tty->print_cr("Unsafe: writeback pre-sync");
+ }
+ #endif
+ #if !defined(LINUX) || !(defined(AARCH64) || defined(AMD64))
+ // TODO - implement for solaris/AIX/BSD/WINDOWS and for 32 bit
+ JNU_ThrowRuntimeException(env, "writeback sync is not implemented");
+ return IOS_THROWN;
+ #else
+ doWriteBackSync0(true);
+ #endif
+ } UNSAFE_END
+
+ UNSAFE_LEAF (void, Unsafe_WriteBackPostSync0(JNIEnv *env, jobject unsafe)) {
+ #ifndef PRODUCT
+ if (TraceMemoryWriteback) {
+ tty->print_cr("Unsafe: writeback pre-sync");
+ }
+ #endif
+ #if !defined(LINUX) || !(defined(AARCH64) || defined(AMD64))
+ // TODO - implement for solaris/AIX/BSD/WINDOWS and for 32 bit
+ JNU_ThrowRuntimeException(env, "writeback sync is not implemented");
+ return IOS_THROWN;
+ #else
+ doWriteBackSync0(false);
+ #endif
+ } UNSAFE_END
+
+ UNSAFE_LEAF(jint, Unsafe_DataCacheLineFlushSize0()) {
+ jint size = (jint)VM_Version::data_cache_line_flush_size();
+ // TODO -- ensure every CPU actually sets this
+ if (size == 0) {
+ size = (jint)DEFAULT_CACHE_LINE_SIZE;
+ }
+ return size;
+ } UNSAFE_END
+
////// Random queries
UNSAFE_LEAF(jint, Unsafe_AddressSize0(JNIEnv *env, jobject unsafe)) {
return sizeof(void*);
} UNSAFE_END
*** 1059,1068 ****
--- 1128,1138 ----
{CC "staticFieldOffset0", CC "(" FLD ")J", FN_PTR(Unsafe_StaticFieldOffset0)},
{CC "staticFieldBase0", CC "(" FLD ")" OBJ, FN_PTR(Unsafe_StaticFieldBase0)},
{CC "ensureClassInitialized0", CC "(" CLS ")V", FN_PTR(Unsafe_EnsureClassInitialized0)},
{CC "arrayBaseOffset0", CC "(" CLS ")I", FN_PTR(Unsafe_ArrayBaseOffset0)},
{CC "arrayIndexScale0", CC "(" CLS ")I", FN_PTR(Unsafe_ArrayIndexScale0)},
+ {CC "dataCacheLineFlushSize0", CC "()I", FN_PTR(Unsafe_DataCacheLineFlushSize0)},
{CC "addressSize0", CC "()I", FN_PTR(Unsafe_AddressSize0)},
{CC "pageSize", CC "()I", FN_PTR(Unsafe_PageSize)},
{CC "defineClass0", CC "(" DC_Args ")" CLS, FN_PTR(Unsafe_DefineClass0)},
{CC "allocateInstance", CC "(" CLS ")" OBJ, FN_PTR(Unsafe_AllocateInstance)},
*** 1079,1088 ****
--- 1149,1161 ----
{CC "getLoadAverage0", CC "([DI)I", FN_PTR(Unsafe_GetLoadAverage0)},
{CC "copyMemory0", CC "(" OBJ "J" OBJ "JJ)V", FN_PTR(Unsafe_CopyMemory0)},
{CC "copySwapMemory0", CC "(" OBJ "J" OBJ "JJJ)V", FN_PTR(Unsafe_CopySwapMemory0)},
+ {CC "writeback0", CC "(" "J" ")V", FN_PTR(Unsafe_WriteBack0)},
+ {CC "writebackPreSync0", CC "()V", FN_PTR(Unsafe_WriteBackPreSync0)},
+ {CC "writebackPostSync0", CC "()V", FN_PTR(Unsafe_WriteBackPostSync0)},
{CC "setMemory0", CC "(" OBJ "JJB)V", FN_PTR(Unsafe_SetMemory0)},
{CC "defineAnonymousClass0", CC "(" DAC_Args ")" CLS, FN_PTR(Unsafe_DefineAnonymousClass0)},
{CC "shouldBeInitialized0", CC "(" CLS ")Z", FN_PTR(Unsafe_ShouldBeInitialized0)},
< prev index next >