/* Prevent garbage collection of an object */ jvmtiError commonRef_pin(jlong id) { JNIEnv *env = getEnv(); jvmtiError error = JVMTI_ERROR_NONE; RefNode *node; if (id == NULL_OBJECT_ID) { return JNI_FALSE; } debugMonitorEnter(refLock); node = findNodeByID(env, id); if (node == NULL) { error = JVMTI_ERROR_INVALID_OBJECT; } else { jobject strongRef = strengthenNode(env, node); if (strongRef == NULL) { /* * Referent has been collected, clean up now. */ error = JVMTI_ERROR_INVALID_OBJECT; deleteNodeByID(env, id, ALL_REFS); } } debugMonitorExit(refLock); return error; }
/* * Given an object ID obtained from the debugger front end, return a * strong, global reference to that object (or NULL if the object * has been collected). The reference can then be used for JNI and * JVMTI calls. Caller is resposible for deleting the returned reference. */ jobject commonRef_idToRef(JNIEnv *env, jlong id) { jobject ref; ref = NULL; debugMonitorEnter(gdata->refLock); { RefNode *node; node = findNodeByID(env, id); if (node != NULL) { if (node->isStrong) { saveGlobalRef(env, node->ref, &ref); } else { jobject lref; lref = JNI_FUNC_PTR(env,NewLocalRef)(env, node->ref); if ( lref == NULL ) { /* Object was GC'd shortly after we found the node */ deleteNodeByID(env, node->seqNum, ALL_REFS); } else { saveGlobalRef(env, node->ref, &ref); JNI_FUNC_PTR(env,DeleteLocalRef)(env, lref); } } } } debugMonitorExit(gdata->refLock); return ref; }
/* * Given an object ID obtained from the debugger front end, return a * strong, global reference to that object (or NULL if the object * has been collected). The reference can then be used for JNI and * JVMTI calls. Caller is resposible for deleting the returned reference. */ jobject commonRef_idToRef(jlong id) { JNIEnv *env = getEnv(); jobject ref = NULL; RefNode *node; debugMonitorEnter(refLock); node = findNodeByID(env, id); if (node != NULL) { saveGlobalRef(env, node->ref, &ref); } debugMonitorExit(refLock); return ref; }
/* Permit garbage collection of an object */ jvmtiError commonRef_unpin(jlong id) { JNIEnv *env = getEnv(); jvmtiError error = JVMTI_ERROR_NONE; RefNode *node; debugMonitorEnter(refLock); node = findNodeByID(env, id); if (node != NULL) { jweak weakRef = weakenNode(env, node); if (weakRef == NULL) { error = JVMTI_ERROR_OUT_OF_MEMORY; } } debugMonitorExit(refLock); return error; }