/* Primitive array data callback for FollowReferences */ static jint JNICALL cbPrimArrayData(jlong class_tag, jlong size, jlong* tag_ptr, jint element_count, jvmtiPrimitiveType element_type, const void* elements, void* user_data) { ObjectIndex object_index; RefIndex ref_index; RefIndex prev_ref_index; HPROF_ASSERT(tag_ptr!=NULL); HPROF_ASSERT(class_tag!=(jlong)0); HPROF_ASSERT((*tag_ptr)!=(jlong)0); if ( class_tag == (jlong)0 || (*tag_ptr) == (jlong)0 ) { /* We can't do anything with a class_tag==0, just skip it */ return JVMTI_VISIT_OBJECTS; } /* Assume object has been tagged, get object index */ object_index = tag_extract((*tag_ptr)); /* Save string data */ prev_ref_index = object_get_references(object_index); ref_index = reference_prim_array(prev_ref_index, element_type, elements, element_count); object_set_references(object_index, ref_index); return JVMTI_VISIT_OBJECTS; }
/* JVMTI callback function. */ static jvmtiIterationControl JNICALL reference_object(jvmtiObjectReferenceKind reference_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong referrer_tag, jint referrer_index, void *user_data) { /* Only calls to Allocate, Deallocate, RawMonitorEnter & RawMonitorExit * are allowed here (see the JVMTI Spec). */ RefIndex ref_index; RefIndex prev_ref_index; ObjectIndex referrer_object_index; ObjectIndex object_index; jlong object_tag; HPROF_ASSERT(tag_ptr!=NULL); HPROF_ASSERT(referrer_tag!=(jlong)0); if ( referrer_tag != (jlong)0 ) { referrer_object_index = tag_extract(referrer_tag); } else { return JVMTI_ITERATION_CONTINUE; } object_tag = *tag_ptr; if ( object_tag != (jlong)0 ) { object_index = tag_extract(object_tag); } else { SiteIndex site_index; site_index = site_find_or_create(find_cnum(class_tag), gdata->system_trace_index); object_index = object_new(site_index, (jint)size, OBJECT_SYSTEM, gdata->system_thread_serial_num); object_tag = tag_create(object_index); *tag_ptr = object_tag; } /* Save reference information */ prev_ref_index = object_get_references(referrer_object_index); ref_index = reference_new(prev_ref_index, reference_kind, class_tag, size, object_tag, referrer_index); object_set_references(referrer_object_index, ref_index); return JVMTI_ITERATION_CONTINUE; }
/* Primitive field data callback for FollowReferences */ static jint JNICALL cbPrimFieldData(jvmtiHeapReferenceKind reference_kind, const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, jlong* tag_ptr, jvalue value, jvmtiPrimitiveType value_type, void* user_data) { ObjectIndex object_index; jint field_index; RefIndex ref_index; RefIndex prev_ref_index; HPROF_ASSERT(tag_ptr!=NULL); HPROF_ASSERT(class_tag!=(jlong)0); HPROF_ASSERT((*tag_ptr)!=(jlong)0); if ( class_tag == (jlong)0 || (*tag_ptr) == (jlong)0 ) { /* We can't do anything with a class_tag==0, just skip it */ return JVMTI_VISIT_OBJECTS; } /* If the field is 0, just skip it, we assume 0 */ if ( value.j == (jlong)0 ) { return JVMTI_VISIT_OBJECTS; } /* Get field index */ field_index = reference_info->field.index; /* We assume the object was tagged */ object_index = tag_extract((*tag_ptr)); /* Save primitive field data */ prev_ref_index = object_get_references(object_index); ref_index = reference_prim_field(prev_ref_index, reference_kind, value_type, value, field_index); object_set_references(object_index, ref_index); return JVMTI_VISIT_OBJECTS; }
/* Store away plain object reference information */ static jint objectReference(jvmtiHeapReferenceKind reference_kind, const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, jlong size, jlong* tag_ptr, jlong* referrer_tag_ptr, jint length) { ObjectIndex object_index; jint reference_index; RefIndex ref_index; RefIndex prev_ref_index; ObjectIndex referrer_object_index; jlong object_tag; HPROF_ASSERT(tag_ptr!=NULL); HPROF_ASSERT(class_tag!=(jlong)0); HPROF_ASSERT(referrer_tag_ptr!=NULL); HPROF_ASSERT((*referrer_tag_ptr)!=(jlong)0); if ( class_tag == (jlong)0 || (*referrer_tag_ptr) == (jlong)0 ) { /* We can't do anything with a class_tag==0, just skip it */ return JVMTI_VISIT_OBJECTS; } switch ( reference_kind ) { default: /* Currently we don't need these */ return JVMTI_VISIT_OBJECTS; case JVMTI_HEAP_REFERENCE_FIELD: case JVMTI_HEAP_REFERENCE_STATIC_FIELD: reference_index = reference_info->field.index; break; case JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT: reference_index = reference_info->array.index; break; case JVMTI_HEAP_REFERENCE_CONSTANT_POOL: reference_index = reference_info->constant_pool.index; break; case JVMTI_HEAP_REFERENCE_SIGNERS: case JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN: case JVMTI_HEAP_REFERENCE_CLASS_LOADER: case JVMTI_HEAP_REFERENCE_INTERFACE: reference_index = 0; break; } /* We assume the referrer is tagged */ referrer_object_index = tag_extract((*referrer_tag_ptr)); /* Now check the referree */ object_tag = *tag_ptr; if ( object_tag != (jlong)0 ) { object_index = tag_extract(object_tag); } else { /* Create and set the tag. */ object_tag = make_new_tag(class_tag, size, gdata->system_trace_index, gdata->unknown_thread_serial_num, &object_index, NULL); *tag_ptr = object_tag; } HPROF_ASSERT(object_index!=0); /* Save reference information */ prev_ref_index = object_get_references(referrer_object_index); ref_index = reference_obj(prev_ref_index, reference_kind, object_index, reference_index, length); object_set_references(referrer_object_index, ref_index); return JVMTI_VISIT_OBJECTS; }