1 /* 2 * Copyright (c) 2003, 2018, 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 <stdio.h> 25 #include "nsk_strace.h" 26 27 extern "C" { 28 29 static const char *Stest_cn="nsk/stress/strace/strace006"; 30 31 static jclass testClass, threadClass; 32 static jint DEPTH; 33 static jclass stackOverflowErrorClass; 34 35 JNIEXPORT jint JNICALL 36 JNI_OnLoad(JavaVM *vm, void *reserved) 37 { 38 JNIEnv *env; 39 40 if (vm->GetEnv((void **) &env, JNI_VERSION) != JNI_OK) { 41 printf("%s:%d: Failed to call GetEnv\n", __FILE__, __LINE__); 42 return 0; 43 } 44 45 FIND_CLASS(stackOverflowErrorClass, "java/lang/StackOverflowError"); 46 if ((stackOverflowErrorClass = (jclass) env->NewGlobalRef(stackOverflowErrorClass)) == NULL) { 47 printf("Can't create global ref for stack overflow class\n"); 48 return 0; 49 } 50 51 return JNI_VERSION; 52 } 53 54 JNIEXPORT void JNICALL 55 JNI_OnUnload(JavaVM *vm, void *reserved) 56 { 57 JNIEnv *env; 58 59 if (vm->GetEnv((void **) &env, JNI_VERSION) != JNI_OK) { 60 if (stackOverflowErrorClass != NULL) { 61 env->DeleteGlobalRef(stackOverflowErrorClass); 62 } 63 } else { 64 printf("%s:%d: Failed to call GetEnv\n", __FILE__, __LINE__); 65 } 66 67 } 68 69 JNIEXPORT void JNICALL 70 Java_nsk_stress_strace_strace006Thread_recursiveMethod2(JNIEnv *env, jobject obj) 71 { 72 jfieldID field; 73 jmethodID method; 74 jint currDepth; 75 jclass testClass, threadClass; 76 jint maxDepth; 77 78 FIND_CLASS(testClass, Stest_cn); 79 GET_OBJECT_CLASS(threadClass, obj); 80 81 GET_STATIC_INT_FIELD(maxDepth, testClass, "DEPTH"); 82 83 /* currDepth++ */ 84 GET_INT_FIELD(currDepth, obj, threadClass, "currentDepth"); 85 currDepth++; 86 SET_INT_FIELD(obj, threadClass, "currentDepth", currDepth); 87 88 if (maxDepth - currDepth > 0) 89 { 90 GET_STATIC_METHOD_ID(method, threadClass, "yield", "()V"); 91 NSK_CPP_STUB3(CallStaticVoidMethod, env, threadClass, method); 92 EXCEPTION_CHECK(stackOverflowErrorClass, currDepth); 93 94 GET_METHOD_ID(method, threadClass, "recursiveMethod1", "()V"); 95 NSK_CPP_STUB3(CallVoidMethod, env, obj, method); 96 EXCEPTION_CHECK(stackOverflowErrorClass, currDepth); 97 } 98 99 currDepth--; 100 GET_OBJECT_CLASS(threadClass, obj); 101 SET_INT_FIELD(obj, threadClass, "currentDepth", currDepth); 102 } 103 104 }