< prev index next >

src/share/vm/prims/unsafe.cpp

Print this page




1189   ret = os::loadavg(la, nelem);
1190   if (ret == -1) return -1;
1191 
1192   // if successful, ret is the number of samples actually retrieved.
1193   assert(ret >= 0 && ret <= max_nelem, "Unexpected loadavg return value");
1194   switch(ret) {
1195     case 3: a->double_at_put(2, (jdouble)la[2]); // fall through
1196     case 2: a->double_at_put(1, (jdouble)la[1]); // fall through
1197     case 1: a->double_at_put(0, (jdouble)la[0]); break;
1198   }
1199   return ret;
1200 UNSAFE_END
1201 
1202 
1203 /// JVM_RegisterUnsafeMethods
1204 
1205 #define ADR "J"
1206 
1207 #define LANG "Ljava/lang/"
1208 
1209 #define OBJ LANG"Object;"
1210 #define CLS LANG"Class;"
1211 #define FLD LANG"reflect/Field;"
1212 #define THR LANG"Throwable;"
1213 
1214 #define DC_Args  LANG"String;[BII" LANG"ClassLoader;" "Ljava/security/ProtectionDomain;"
1215 #define DAC_Args CLS"[B["OBJ
1216 
1217 #define CC (char*)  /*cast a literal from (const char*)*/
1218 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
1219 
1220 #define DECLARE_GETPUTOOP(Boolean, Z) \
1221     {CC"get"#Boolean,      CC"("OBJ"J)"#Z,      FN_PTR(Unsafe_Get##Boolean)}, \
1222     {CC"put"#Boolean,      CC"("OBJ"J"#Z")V",   FN_PTR(Unsafe_Set##Boolean)}, \
1223     {CC"get"#Boolean"Volatile",      CC"("OBJ"J)"#Z,      FN_PTR(Unsafe_Get##Boolean##Volatile)}, \
1224     {CC"put"#Boolean"Volatile",      CC"("OBJ"J"#Z")V",   FN_PTR(Unsafe_Set##Boolean##Volatile)}
1225 
1226 
1227 #define DECLARE_GETPUTNATIVE(Byte, B) \
1228     {CC"get"#Byte,         CC"("ADR")"#B,       FN_PTR(Unsafe_GetNative##Byte)}, \
1229     {CC"put"#Byte,         CC"("ADR#B")V",      FN_PTR(Unsafe_SetNative##Byte)}
1230 
1231 
1232 
1233 static JNINativeMethod methods[] = {
1234     {CC"getObject",        CC"("OBJ"J)"OBJ"",   FN_PTR(Unsafe_GetObject)},
1235     {CC"putObject",        CC"("OBJ"J"OBJ")V",  FN_PTR(Unsafe_SetObject)},
1236     {CC"getObjectVolatile",CC"("OBJ"J)"OBJ"",   FN_PTR(Unsafe_GetObjectVolatile)},
1237     {CC"putObjectVolatile",CC"("OBJ"J"OBJ")V",  FN_PTR(Unsafe_SetObjectVolatile)},
1238 
1239     {CC"getUncompressedObject", CC"("ADR")"OBJ, FN_PTR(Unsafe_GetUncompressedObject)},
1240     {CC"getJavaMirror",         CC"("ADR")"CLS, FN_PTR(Unsafe_GetJavaMirror)},
1241     {CC"getKlassPointer",       CC"("OBJ")"ADR, FN_PTR(Unsafe_GetKlassPointer)},
1242 
1243     DECLARE_GETPUTOOP(Boolean, Z),
1244     DECLARE_GETPUTOOP(Byte, B),
1245     DECLARE_GETPUTOOP(Short, S),
1246     DECLARE_GETPUTOOP(Char, C),
1247     DECLARE_GETPUTOOP(Int, I),
1248     DECLARE_GETPUTOOP(Long, J),
1249     DECLARE_GETPUTOOP(Float, F),
1250     DECLARE_GETPUTOOP(Double, D),
1251 
1252     DECLARE_GETPUTNATIVE(Byte, B),
1253     DECLARE_GETPUTNATIVE(Short, S),
1254     DECLARE_GETPUTNATIVE(Char, C),
1255     DECLARE_GETPUTNATIVE(Int, I),
1256     DECLARE_GETPUTNATIVE(Long, J),
1257     DECLARE_GETPUTNATIVE(Float, F),
1258     DECLARE_GETPUTNATIVE(Double, D),
1259 
1260     {CC"getAddress",         CC"("ADR")"ADR,             FN_PTR(Unsafe_GetNativeAddress)},
1261     {CC"putAddress",         CC"("ADR""ADR")V",          FN_PTR(Unsafe_SetNativeAddress)},
1262 
1263     {CC"allocateMemory",     CC"(J)"ADR,                 FN_PTR(Unsafe_AllocateMemory)},
1264     {CC"reallocateMemory",   CC"("ADR"J)"ADR,            FN_PTR(Unsafe_ReallocateMemory)},
1265     {CC"freeMemory",         CC"("ADR")V",               FN_PTR(Unsafe_FreeMemory)},
1266 
1267     {CC"objectFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_ObjectFieldOffset)},
1268     {CC"staticFieldOffset",  CC"("FLD")J",               FN_PTR(Unsafe_StaticFieldOffset)},
1269     {CC"staticFieldBase",    CC"("FLD")"OBJ,             FN_PTR(Unsafe_StaticFieldBaseFromField)},
1270     {CC"ensureClassInitialized",CC"("CLS")V",            FN_PTR(Unsafe_EnsureClassInitialized)},
1271     {CC"arrayBaseOffset",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayBaseOffset)},
1272     {CC"arrayIndexScale",    CC"("CLS")I",               FN_PTR(Unsafe_ArrayIndexScale)},
1273     {CC"addressSize",        CC"()I",                    FN_PTR(Unsafe_AddressSize)},
1274     {CC"pageSize",           CC"()I",                    FN_PTR(Unsafe_PageSize)},
1275 
1276     {CC"defineClass",        CC"("DC_Args")"CLS,         FN_PTR(Unsafe_DefineClass)},
1277     {CC"allocateInstance",   CC"("CLS")"OBJ,             FN_PTR(Unsafe_AllocateInstance)},
1278     {CC"throwException",     CC"("THR")V",               FN_PTR(Unsafe_ThrowException)},
1279     {CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z",  FN_PTR(Unsafe_CompareAndSwapObject)},
1280     {CC"compareAndSwapInt",  CC"("OBJ"J""I""I"")Z",      FN_PTR(Unsafe_CompareAndSwapInt)},
1281     {CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z",      FN_PTR(Unsafe_CompareAndSwapLong)},
1282     {CC"putOrderedObject",   CC"("OBJ"J"OBJ")V",         FN_PTR(Unsafe_SetOrderedObject)},
1283     {CC"putOrderedInt",      CC"("OBJ"JI)V",             FN_PTR(Unsafe_SetOrderedInt)},
1284     {CC"putOrderedLong",     CC"("OBJ"JJ)V",             FN_PTR(Unsafe_SetOrderedLong)},
1285     {CC"park",               CC"(ZJ)V",                  FN_PTR(Unsafe_Park)},
1286     {CC"unpark",             CC"("OBJ")V",               FN_PTR(Unsafe_Unpark)},
1287 
1288     {CC"getLoadAverage",     CC"([DI)I",                 FN_PTR(Unsafe_Loadavg)},
1289 
1290     {CC"copyMemory",         CC"("OBJ"J"OBJ"JJ)V",       FN_PTR(Unsafe_CopyMemory)},
1291     {CC"setMemory",          CC"("OBJ"JJB)V",            FN_PTR(Unsafe_SetMemory)},
1292 
1293     {CC"defineAnonymousClass", CC"("DAC_Args")"CLS,      FN_PTR(Unsafe_DefineAnonymousClass)},
1294 
1295     {CC"shouldBeInitialized",CC"("CLS")Z",               FN_PTR(Unsafe_ShouldBeInitialized)},
1296 
1297     {CC"loadFence",          CC"()V",                    FN_PTR(Unsafe_LoadFence)},
1298     {CC"storeFence",         CC"()V",                    FN_PTR(Unsafe_StoreFence)},
1299     {CC"fullFence",          CC"()V",                    FN_PTR(Unsafe_FullFence)},
1300 
1301     {CC"isBigEndian0",       CC"()Z",                    FN_PTR(Unsafe_isBigEndian0)},
1302     {CC"unalignedAccess0",   CC"()Z",                    FN_PTR(Unsafe_unalignedAccess0)}
1303 };
1304 
1305 #undef CC
1306 #undef FN_PTR
1307 
1308 #undef ADR
1309 #undef LANG
1310 #undef OBJ
1311 #undef CLS
1312 #undef FLD
1313 #undef THR
1314 #undef DC_Args
1315 #undef DAC_Args
1316 
1317 #undef DECLARE_GETPUTOOP
1318 #undef DECLARE_GETPUTNATIVE
1319 
1320 
1321 // This one function is exported, used by NativeLookup.
1322 // The Unsafe_xxx functions above are called only from the interpreter.


1189   ret = os::loadavg(la, nelem);
1190   if (ret == -1) return -1;
1191 
1192   // if successful, ret is the number of samples actually retrieved.
1193   assert(ret >= 0 && ret <= max_nelem, "Unexpected loadavg return value");
1194   switch(ret) {
1195     case 3: a->double_at_put(2, (jdouble)la[2]); // fall through
1196     case 2: a->double_at_put(1, (jdouble)la[1]); // fall through
1197     case 1: a->double_at_put(0, (jdouble)la[0]); break;
1198   }
1199   return ret;
1200 UNSAFE_END
1201 
1202 
1203 /// JVM_RegisterUnsafeMethods
1204 
1205 #define ADR "J"
1206 
1207 #define LANG "Ljava/lang/"
1208 
1209 #define OBJ LANG "Object;"
1210 #define CLS LANG "Class;"
1211 #define FLD LANG "reflect/Field;"
1212 #define THR LANG "Throwable;"
1213 
1214 #define DC_Args  LANG "String;[BII" LANG "ClassLoader;" "Ljava/security/ProtectionDomain;"
1215 #define DAC_Args CLS "[B[" OBJ
1216 
1217 #define CC (char*)  /*cast a literal from (const char*)*/
1218 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
1219 
1220 #define DECLARE_GETPUTOOP(Boolean, Z) \
1221     {CC "get" #Boolean,      CC "(" OBJ "J)" #Z,       FN_PTR(Unsafe_Get##Boolean)}, \
1222     {CC "put" #Boolean,      CC "(" OBJ "J" #Z ")V",   FN_PTR(Unsafe_Set##Boolean)}, \
1223     {CC "get" #Boolean "Volatile",      CC "(" OBJ "J)" #Z,       FN_PTR(Unsafe_Get##Boolean##Volatile)}, \
1224     {CC "put" #Boolean "Volatile",      CC "(" OBJ "J" #Z ")V",   FN_PTR(Unsafe_Set##Boolean##Volatile)}
1225 
1226 
1227 #define DECLARE_GETPUTNATIVE(Byte, B) \
1228     {CC "get" #Byte,         CC "(" ADR ")" #B,       FN_PTR(Unsafe_GetNative##Byte)}, \
1229     {CC "put" #Byte,         CC "(" ADR#B ")V",       FN_PTR(Unsafe_SetNative##Byte)}
1230 
1231 
1232 
1233 static JNINativeMethod methods[] = {
1234     {CC "getObject",        CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObject)},
1235     {CC "putObject",        CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObject)},
1236     {CC "getObjectVolatile",CC "(" OBJ "J)" OBJ "",   FN_PTR(Unsafe_GetObjectVolatile)},
1237     {CC "putObjectVolatile",CC "(" OBJ "J" OBJ ")V",  FN_PTR(Unsafe_SetObjectVolatile)},
1238 
1239     {CC "getUncompressedObject", CC "(" ADR ")" OBJ,  FN_PTR(Unsafe_GetUncompressedObject)},
1240     {CC "getJavaMirror",         CC "(" ADR ")" CLS,  FN_PTR(Unsafe_GetJavaMirror)},
1241     {CC "getKlassPointer",       CC "(" OBJ ")" ADR,  FN_PTR(Unsafe_GetKlassPointer)},
1242 
1243     DECLARE_GETPUTOOP(Boolean, Z),
1244     DECLARE_GETPUTOOP(Byte, B),
1245     DECLARE_GETPUTOOP(Short, S),
1246     DECLARE_GETPUTOOP(Char, C),
1247     DECLARE_GETPUTOOP(Int, I),
1248     DECLARE_GETPUTOOP(Long, J),
1249     DECLARE_GETPUTOOP(Float, F),
1250     DECLARE_GETPUTOOP(Double, D),
1251 
1252     DECLARE_GETPUTNATIVE(Byte, B),
1253     DECLARE_GETPUTNATIVE(Short, S),
1254     DECLARE_GETPUTNATIVE(Char, C),
1255     DECLARE_GETPUTNATIVE(Int, I),
1256     DECLARE_GETPUTNATIVE(Long, J),
1257     DECLARE_GETPUTNATIVE(Float, F),
1258     DECLARE_GETPUTNATIVE(Double, D),
1259 
1260     {CC "getAddress",         CC "(" ADR ")" ADR,        FN_PTR(Unsafe_GetNativeAddress)},
1261     {CC "putAddress",         CC "(" ADR "" ADR ")V",    FN_PTR(Unsafe_SetNativeAddress)},
1262 
1263     {CC "allocateMemory",     CC "(J)" ADR,              FN_PTR(Unsafe_AllocateMemory)},
1264     {CC "reallocateMemory",   CC "(" ADR "J)" ADR,       FN_PTR(Unsafe_ReallocateMemory)},
1265     {CC "freeMemory",         CC "(" ADR ")V",           FN_PTR(Unsafe_FreeMemory)},
1266 
1267     {CC "objectFieldOffset",  CC "(" FLD ")J",           FN_PTR(Unsafe_ObjectFieldOffset)},
1268     {CC "staticFieldOffset",  CC "(" FLD ")J",           FN_PTR(Unsafe_StaticFieldOffset)},
1269     {CC "staticFieldBase",    CC "(" FLD ")" OBJ,        FN_PTR(Unsafe_StaticFieldBaseFromField)},
1270     {CC "ensureClassInitialized",CC "(" CLS ")V",        FN_PTR(Unsafe_EnsureClassInitialized)},
1271     {CC "arrayBaseOffset",    CC "(" CLS ")I",           FN_PTR(Unsafe_ArrayBaseOffset)},
1272     {CC "arrayIndexScale",    CC "(" CLS ")I",           FN_PTR(Unsafe_ArrayIndexScale)},
1273     {CC "addressSize",        CC "()I",                  FN_PTR(Unsafe_AddressSize)},
1274     {CC "pageSize",           CC "()I",                  FN_PTR(Unsafe_PageSize)},
1275 
1276     {CC "defineClass",        CC "(" DC_Args ")" CLS,    FN_PTR(Unsafe_DefineClass)},
1277     {CC "allocateInstance",   CC "(" CLS ")" OBJ,        FN_PTR(Unsafe_AllocateInstance)},
1278     {CC "throwException",     CC "(" THR ")V",           FN_PTR(Unsafe_ThrowException)},
1279     {CC "compareAndSwapObject", CC "(" OBJ "J" OBJ "" OBJ ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
1280     {CC "compareAndSwapInt",  CC "(" OBJ "J""I""I"")Z",  FN_PTR(Unsafe_CompareAndSwapInt)},
1281     {CC "compareAndSwapLong", CC "(" OBJ "J""J""J"")Z",  FN_PTR(Unsafe_CompareAndSwapLong)},
1282     {CC "putOrderedObject",   CC "(" OBJ "J" OBJ ")V",   FN_PTR(Unsafe_SetOrderedObject)},
1283     {CC "putOrderedInt",      CC "(" OBJ "JI)V",         FN_PTR(Unsafe_SetOrderedInt)},
1284     {CC "putOrderedLong",     CC "(" OBJ "JJ)V",         FN_PTR(Unsafe_SetOrderedLong)},
1285     {CC "park",               CC "(ZJ)V",                FN_PTR(Unsafe_Park)},
1286     {CC "unpark",             CC "(" OBJ ")V",           FN_PTR(Unsafe_Unpark)},
1287 
1288     {CC "getLoadAverage",     CC "([DI)I",               FN_PTR(Unsafe_Loadavg)},
1289 
1290     {CC "copyMemory",         CC "(" OBJ "J" OBJ "JJ)V", FN_PTR(Unsafe_CopyMemory)},
1291     {CC "setMemory",          CC "(" OBJ "JJB)V",        FN_PTR(Unsafe_SetMemory)},
1292 
1293     {CC "defineAnonymousClass", CC "(" DAC_Args ")" CLS, FN_PTR(Unsafe_DefineAnonymousClass)},
1294 
1295     {CC "shouldBeInitialized",CC "(" CLS ")Z",           FN_PTR(Unsafe_ShouldBeInitialized)},
1296 
1297     {CC "loadFence",          CC "()V",                  FN_PTR(Unsafe_LoadFence)},
1298     {CC "storeFence",         CC "()V",                  FN_PTR(Unsafe_StoreFence)},
1299     {CC "fullFence",          CC "()V",                  FN_PTR(Unsafe_FullFence)},
1300 
1301     {CC "isBigEndian0",       CC "()Z",                  FN_PTR(Unsafe_isBigEndian0)},
1302     {CC "unalignedAccess0",   CC "()Z",                  FN_PTR(Unsafe_unalignedAccess0)}
1303 };
1304 
1305 #undef CC
1306 #undef FN_PTR
1307 
1308 #undef ADR
1309 #undef LANG
1310 #undef OBJ
1311 #undef CLS
1312 #undef FLD
1313 #undef THR
1314 #undef DC_Args
1315 #undef DAC_Args
1316 
1317 #undef DECLARE_GETPUTOOP
1318 #undef DECLARE_GETPUTNATIVE
1319 
1320 
1321 // This one function is exported, used by NativeLookup.
1322 // The Unsafe_xxx functions above are called only from the interpreter.
< prev index next >