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. |