1 /* 2 * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 #include <jni.h> 25 26 JNIEXPORT void JNICALL 27 Java_RefOOME_testWeak(JNIEnv *env, jclass clazz, jobject obj) { 28 for (int i = 0; i < 100; i++) { 29 jweak w = (*env)->NewWeakGlobalRef(env, obj); 30 if ((*env)->ExceptionCheck(env)) { 31 return; 32 } 33 if (w == NULL) { 34 (*env)->FatalError(env, "OOME expected if NULL returned"); 35 return; 36 } 37 (*env)->DeleteWeakGlobalRef(env, w); 38 } 39 } 40 41 JNIEXPORT void JNICALL 42 Java_RefOOME_testGlobal(JNIEnv *env, jclass clazz, jobject obj) { 43 for (int i = 0; i < 100; i++) { 44 jobject w = (*env)->NewGlobalRef(env, obj); 45 if (w == NULL) { 46 jclass oome = (*env)->FindClass(env, "java/lang/OutOfMemoryError"); 47 if ((*env)->ExceptionCheck(env)) { 48 return; 49 } 50 (*env)->ThrowNew(env, oome, "NewGlobalRef returned NULL"); 51 return; 52 } 53 (*env)->DeleteGlobalRef(env, w); 54 } 55 } 56 57 JNIEXPORT void JNICALL 58 Java_RefOOME_testLocal(JNIEnv *env, jclass clazz, jobject obj) { 59 for (int i = 0; i < 100; i++) { 60 jobject w = (*env)->NewLocalRef(env, obj); 61 if (w == NULL) { 62 jclass oome = (*env)->FindClass(env, "java/lang/OutOfMemoryError"); 63 if ((*env)->ExceptionCheck(env)) { 64 return; 65 } 66 (*env)->ThrowNew(env, oome, "NewLocalRef returned NULL"); 67 return; 68 } 69 (*env)->DeleteLocalRef(env,w); 70 } 71 }