/** For the given class with non-NULL, non-system loader, save the supplied class file bytes permanently */ void save_class_file_bytes(JNIEnv *env, const char* name, jobject loader, jint class_data_len, const unsigned char* class_data) { int pos; /*printf("!!! Gonna save classfilebytes for class %s\n", name);*/ (*env)->MonitorEnter(env, _ctable_lock); if (_ctable_elements > _ctable_threshold) { grow_ctable(); } pos = hash(name, loader) % _ctable_size; while (_ctable_classnames[pos] != NULL) { if (strcmp(name, _ctable_classnames[pos]) == 0 && (*env)->IsSameObject(env, loader, _ctable_loaders[pos])) { /* do not save class' bytecode if it is already saved */ (*env)->MonitorExit(env, _ctable_lock); return; } else { pos = (pos + 1) % _ctable_size; } } _ctable_classnames[pos] = malloc(strlen(name) + 1); strcpy(_ctable_classnames[pos], name); _ctable_loaders[pos] = (*env)->NewWeakGlobalRef(env, loader); _ctable_classdata[pos] = malloc(class_data_len); memcpy(_ctable_classdata[pos], class_data, class_data_len); _ctable_classdata_lens[pos] = class_data_len; _ctable_elements++; /* Check if we should try to do some pruning */ if (++_total_cached_class_count % 250 == 0) { fprintf(stdout, "Profiler Agent: 250 classes cached.\n"); try_removing_bytes_for_unloaded_classes(env); } (*env)->MonitorExit(env, _ctable_lock); }
/* * Class: org_netbeans_lib_profiler_server_system_Classes * Method: notifyAboutClassLoaderUnloading * Signature: ()V */ JNIEXPORT void JNICALL Java_org_netbeans_lib_profiler_server_system_Classes_notifyAboutClassLoaderUnloading (JNIEnv *env, jclass clz) { try_removing_bytes_for_unloaded_classes(env); }