Пример #1
0
/* 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;
}
Пример #2
0
/*
 * 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;
}
Пример #3
0
/*
 * 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;
}
Пример #4
0
/* 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;
}