hotspot/src/share/vm/prims/unsafe.cpp
changeset 35103 d19354bcbfa6
parent 33612 b1487e78deee
child 35135 dd2ce9021031
equal deleted inserted replaced
35102:c5f050e1f982 35103:d19354bcbfa6
  1225 #define DECLARE_GETPUTNATIVE(Byte, B) \
  1225 #define DECLARE_GETPUTNATIVE(Byte, B) \
  1226     {CC "get" #Byte,         CC "(" ADR ")" #B,       FN_PTR(Unsafe_GetNative##Byte)}, \
  1226     {CC "get" #Byte,         CC "(" ADR ")" #B,       FN_PTR(Unsafe_GetNative##Byte)}, \
  1227     {CC "put" #Byte,         CC "(" ADR#B ")V",       FN_PTR(Unsafe_SetNative##Byte)}
  1227     {CC "put" #Byte,         CC "(" ADR#B ")V",       FN_PTR(Unsafe_SetNative##Byte)}
  1228 
  1228 
  1229 
  1229 
  1230 
  1230 static JNINativeMethod sun_misc_Unsafe_methods[] = {
  1231 static JNINativeMethod methods[] = {
       
  1232     {CC "getObject",        CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObject)},
  1231     {CC "getObject",        CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObject)},
  1233     {CC "putObject",        CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObject)},
  1232     {CC "putObject",        CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObject)},
  1234     {CC "getObjectVolatile",CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObjectVolatile)},
  1233     {CC "getObjectVolatile",CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObjectVolatile)},
  1235     {CC "putObjectVolatile",CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObjectVolatile)},
  1234     {CC "putObjectVolatile",CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObjectVolatile)},
  1236 
  1235 
  1293     {CC "shouldBeInitialized",CC "(" CLS ")Z",           FN_PTR(Unsafe_ShouldBeInitialized)},
  1292     {CC "shouldBeInitialized",CC "(" CLS ")Z",           FN_PTR(Unsafe_ShouldBeInitialized)},
  1294 
  1293 
  1295     {CC "loadFence",          CC "()V",                  FN_PTR(Unsafe_LoadFence)},
  1294     {CC "loadFence",          CC "()V",                  FN_PTR(Unsafe_LoadFence)},
  1296     {CC "storeFence",         CC "()V",                  FN_PTR(Unsafe_StoreFence)},
  1295     {CC "storeFence",         CC "()V",                  FN_PTR(Unsafe_StoreFence)},
  1297     {CC "fullFence",          CC "()V",                  FN_PTR(Unsafe_FullFence)},
  1296     {CC "fullFence",          CC "()V",                  FN_PTR(Unsafe_FullFence)},
       
  1297 };
       
  1298 
       
  1299 static JNINativeMethod jdk_internal_misc_Unsafe_methods[] = {
       
  1300     {CC "getObject",        CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObject)},
       
  1301     {CC "putObject",        CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObject)},
       
  1302     {CC "getObjectVolatile",CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObjectVolatile)},
       
  1303     {CC "putObjectVolatile",CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObjectVolatile)},
       
  1304 
       
  1305     {CC "getUncompressedObject", CC "(" ADR ")" OBJ,  FN_PTR(Unsafe_GetUncompressedObject)},
       
  1306     {CC "getJavaMirror",         CC "(" ADR ")" CLS,  FN_PTR(Unsafe_GetJavaMirror)},
       
  1307     {CC "getKlassPointer",       CC "(" OBJ ")" ADR,  FN_PTR(Unsafe_GetKlassPointer)},
       
  1308 
       
  1309     DECLARE_GETPUTOOP(Boolean, Z),
       
  1310     DECLARE_GETPUTOOP(Byte, B),
       
  1311     DECLARE_GETPUTOOP(Short, S),
       
  1312     DECLARE_GETPUTOOP(Char, C),
       
  1313     DECLARE_GETPUTOOP(Int, I),
       
  1314     DECLARE_GETPUTOOP(Long, J),
       
  1315     DECLARE_GETPUTOOP(Float, F),
       
  1316     DECLARE_GETPUTOOP(Double, D),
       
  1317 
       
  1318     DECLARE_GETPUTNATIVE(Byte, B),
       
  1319     DECLARE_GETPUTNATIVE(Short, S),
       
  1320     DECLARE_GETPUTNATIVE(Char, C),
       
  1321     DECLARE_GETPUTNATIVE(Int, I),
       
  1322     DECLARE_GETPUTNATIVE(Long, J),
       
  1323     DECLARE_GETPUTNATIVE(Float, F),
       
  1324     DECLARE_GETPUTNATIVE(Double, D),
       
  1325 
       
  1326     {CC "getAddress",         CC "(" ADR ")" ADR,        FN_PTR(Unsafe_GetNativeAddress)},
       
  1327     {CC "putAddress",         CC "(" ADR "" ADR ")V",    FN_PTR(Unsafe_SetNativeAddress)},
       
  1328 
       
  1329     {CC "allocateMemory",     CC "(J)" ADR,              FN_PTR(Unsafe_AllocateMemory)},
       
  1330     {CC "reallocateMemory",   CC "(" ADR "J)" ADR,       FN_PTR(Unsafe_ReallocateMemory)},
       
  1331     {CC "freeMemory",         CC "(" ADR ")V",           FN_PTR(Unsafe_FreeMemory)},
       
  1332 
       
  1333     {CC "objectFieldOffset",  CC "(" FLD ")J",           FN_PTR(Unsafe_ObjectFieldOffset)},
       
  1334     {CC "staticFieldOffset",  CC "(" FLD ")J",           FN_PTR(Unsafe_StaticFieldOffset)},
       
  1335     {CC "staticFieldBase",    CC "(" FLD ")" OBJ,        FN_PTR(Unsafe_StaticFieldBaseFromField)},
       
  1336     {CC "ensureClassInitialized",CC "(" CLS ")V",        FN_PTR(Unsafe_EnsureClassInitialized)},
       
  1337     {CC "arrayBaseOffset",    CC "(" CLS ")I",           FN_PTR(Unsafe_ArrayBaseOffset)},
       
  1338     {CC "arrayIndexScale",    CC "(" CLS ")I",           FN_PTR(Unsafe_ArrayIndexScale)},
       
  1339     {CC "addressSize",        CC "()I",                  FN_PTR(Unsafe_AddressSize)},
       
  1340     {CC "pageSize",           CC "()I",                  FN_PTR(Unsafe_PageSize)},
       
  1341 
       
  1342     {CC "defineClass",        CC "(" DC_Args ")" CLS,    FN_PTR(Unsafe_DefineClass)},
       
  1343     {CC "allocateInstance",   CC "(" CLS ")" OBJ,        FN_PTR(Unsafe_AllocateInstance)},
       
  1344     {CC "throwException",     CC "(" THR ")V",           FN_PTR(Unsafe_ThrowException)},
       
  1345     {CC "compareAndSwapObject", CC "(" OBJ "J" OBJ "" OBJ ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
       
  1346     {CC "compareAndSwapInt",  CC "(" OBJ "J""I""I"")Z",  FN_PTR(Unsafe_CompareAndSwapInt)},
       
  1347     {CC "compareAndSwapLong", CC "(" OBJ "J""J""J"")Z",  FN_PTR(Unsafe_CompareAndSwapLong)},
       
  1348     {CC "putOrderedObject",   CC "(" OBJ "J" OBJ ")V",   FN_PTR(Unsafe_SetOrderedObject)},
       
  1349     {CC "putOrderedInt",      CC "(" OBJ "JI)V",         FN_PTR(Unsafe_SetOrderedInt)},
       
  1350     {CC "putOrderedLong",     CC "(" OBJ "JJ)V",         FN_PTR(Unsafe_SetOrderedLong)},
       
  1351     {CC "park",               CC "(ZJ)V",                FN_PTR(Unsafe_Park)},
       
  1352     {CC "unpark",             CC "(" OBJ ")V",           FN_PTR(Unsafe_Unpark)},
       
  1353 
       
  1354     {CC "getLoadAverage",     CC "([DI)I",               FN_PTR(Unsafe_Loadavg)},
       
  1355 
       
  1356     {CC "copyMemory",         CC "(" OBJ "J" OBJ "JJ)V", FN_PTR(Unsafe_CopyMemory)},
       
  1357     {CC "setMemory",          CC "(" OBJ "JJB)V",        FN_PTR(Unsafe_SetMemory)},
       
  1358 
       
  1359     {CC "defineAnonymousClass", CC "(" DAC_Args ")" CLS, FN_PTR(Unsafe_DefineAnonymousClass)},
       
  1360 
       
  1361     {CC "shouldBeInitialized",CC "(" CLS ")Z",           FN_PTR(Unsafe_ShouldBeInitialized)},
       
  1362 
       
  1363     {CC "loadFence",          CC "()V",                  FN_PTR(Unsafe_LoadFence)},
       
  1364     {CC "storeFence",         CC "()V",                  FN_PTR(Unsafe_StoreFence)},
       
  1365     {CC "fullFence",          CC "()V",                  FN_PTR(Unsafe_FullFence)},
  1298 
  1366 
  1299     {CC "isBigEndian0",       CC "()Z",                  FN_PTR(Unsafe_isBigEndian0)},
  1367     {CC "isBigEndian0",       CC "()Z",                  FN_PTR(Unsafe_isBigEndian0)},
  1300     {CC "unalignedAccess0",   CC "()Z",                  FN_PTR(Unsafe_unalignedAccess0)}
  1368     {CC "unalignedAccess0",   CC "()Z",                  FN_PTR(Unsafe_unalignedAccess0)}
  1301 };
  1369 };
  1302 
  1370 
  1314 
  1382 
  1315 #undef DECLARE_GETPUTOOP
  1383 #undef DECLARE_GETPUTOOP
  1316 #undef DECLARE_GETPUTNATIVE
  1384 #undef DECLARE_GETPUTNATIVE
  1317 
  1385 
  1318 
  1386 
  1319 // This one function is exported, used by NativeLookup.
  1387 // These two functions are exported, used by NativeLookup.
  1320 // The Unsafe_xxx functions above are called only from the interpreter.
  1388 // The Unsafe_xxx functions above are called only from the interpreter.
  1321 // The optimizer looks at names and signatures to recognize
  1389 // The optimizer looks at names and signatures to recognize
  1322 // individual functions.
  1390 // individual functions.
  1323 
  1391 
  1324 JVM_ENTRY(void, JVM_RegisterUnsafeMethods(JNIEnv *env, jclass unsafeclass))
  1392 JVM_ENTRY(void, JVM_RegisterSunMiscUnsafeMethods(JNIEnv *env, jclass unsafeclass))
  1325   UnsafeWrapper("JVM_RegisterUnsafeMethods");
  1393   UnsafeWrapper("JVM_RegisterSunMiscUnsafeMethods");
  1326   {
  1394   {
  1327     ThreadToNativeFromVM ttnfv(thread);
  1395     ThreadToNativeFromVM ttnfv(thread);
  1328 
  1396 
  1329     int ok = env->RegisterNatives(unsafeclass, methods, sizeof(methods)/sizeof(JNINativeMethod));
  1397     int ok = env->RegisterNatives(unsafeclass, sun_misc_Unsafe_methods, sizeof(sun_misc_Unsafe_methods)/sizeof(JNINativeMethod));
  1330     guarantee(ok == 0, "register unsafe natives");
  1398     guarantee(ok == 0, "register sun.misc.Unsafe natives");
  1331   }
  1399   }
  1332 JVM_END
  1400 JVM_END
       
  1401 
       
  1402 JVM_ENTRY(void, JVM_RegisterJDKInternalMiscUnsafeMethods(JNIEnv *env, jclass unsafeclass))
       
  1403   UnsafeWrapper("JVM_RegisterJDKInternalMiscUnsafeMethods");
       
  1404   {
       
  1405     ThreadToNativeFromVM ttnfv(thread);
       
  1406 
       
  1407     int ok = env->RegisterNatives(unsafeclass, jdk_internal_misc_Unsafe_methods, sizeof(jdk_internal_misc_Unsafe_methods)/sizeof(JNINativeMethod));
       
  1408     guarantee(ok == 0, "register jdk.internal.misc.Unsafe natives");
       
  1409   }
       
  1410 JVM_END