Update of /cvsroot/javaprofiler/library/src/prof In directory usw-pr-cvs1:/tmp/cvs-serv21227/src/prof Modified Files: prof.cpp prof.h prof_class.cpp prof_get.cpp prof_method.cpp prof_monitor.cpp prof_object.cpp prof_thread.cpp Log Message: serious bug fixes - monitors, deactivating... interface version checking added new test program for testing of memory profiling added Index: prof.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -r1.28 -r1.29 *** prof.cpp 25 Nov 2001 23:32:29 -0000 1.28 --- prof.cpp 15 Apr 2002 21:04:18 -0000 1.29 *************** *** 51,55 **** shuttingDown( 0), ! threadsSuspended( 0) { tF( 0, JVMPI_EVENT_ARENA_DELETE, &Prof::event_arenaDelete); --- 51,57 ---- shuttingDown( 0), ! threadsSuspended( 0), ! ! requestEvent( 0) { tF( 0, JVMPI_EVENT_ARENA_DELETE, &Prof::event_arenaDelete); *************** *** 81,85 **** tF( 26, JVMPI_EVENT_MONITOR_WAITED, &Prof::event_monitorWaited); tF( 27, JVMPI_EVENT_OBJECT_ALLOC, &Prof::event_objectAlloc); ! tF( 28, JVMPI_EVENT_OBJECT_DUMP, NULL); tF( 29, JVMPI_EVENT_OBJECT_FREE, &Prof::event_objectFree); tF( 30, JVMPI_EVENT_OBJECT_MOVE, &Prof::event_objectMove); --- 83,87 ---- tF( 26, JVMPI_EVENT_MONITOR_WAITED, &Prof::event_monitorWaited); tF( 27, JVMPI_EVENT_OBJECT_ALLOC, &Prof::event_objectAlloc); ! tF( 28, JVMPI_EVENT_OBJECT_DUMP , NULL); tF( 29, JVMPI_EVENT_OBJECT_FREE, &Prof::event_objectFree); tF( 30, JVMPI_EVENT_OBJECT_MOVE, &Prof::event_objectMove); *************** *** 90,102 **** tF( 35, JVMPI_EVENT_THREAD_START, &Prof::event_threadStart); tF( 36, JVMPI_EVENT_INSTRUCTION_START, NULL); - - tF( 37, JVMPI_EVENT_CLASS_LOAD | JVMPI_REQUESTED_EVENT, &Prof::event_classLoad); - tF( 38, JVMPI_EVENT_THREAD_START | JVMPI_REQUESTED_EVENT, &Prof::event_threadStart); - tF( 39, JVMPI_EVENT_OBJECT_ALLOC | JVMPI_REQUESTED_EVENT, &Prof::event_objectAlloc); - } - - Prof::~Prof() { - - delete &setup; } --- 92,95 ---- *************** *** 132,136 **** Prof* Prof::create( char* options, JVMPI_Interface* jvmpi) { ! return (_prof = new Prof( *(new Setup( options)), jvmpi)); } --- 125,134 ---- Prof* Prof::create( char* options, JVMPI_Interface* jvmpi) { ! _prof = new Prof( *(new Setup( options)), jvmpi); ! ! jvmpi->NotifyEvent = Prof::notifyEvent; ! jvmpi->EnableEvent( JVMPI_EVENT_JVM_INIT_DONE, NULL); ! ! return _prof; } *************** *** 142,146 **** destroying = 1; ! if( _prof) delete _prof; _prof = NULL; } --- 140,154 ---- destroying = 1; ! if( _prof) { ! ! delete &_prof->setup; ! delete _prof; ! } ! _prof = NULL; + } + + void Prof::notifyEvent( JVMPI_Event* event) { + + if( _prof) _prof->runEvent( event); } Index: prof.h =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof.h,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -r1.43 -r1.44 *** prof.h 4 Apr 2002 00:49:15 -0000 1.43 --- prof.h 15 Apr 2002 21:04:18 -0000 1.44 *************** *** 76,80 **** /// number of rows in the event handler table ! TAB_FUNC_SIZE = 40 }; --- 76,80 ---- /// number of rows in the event handler table ! TAB_FUNC_SIZE = 37 }; *************** *** 210,214 **** /// Destructor. ! virtual ~Prof(); /** Main fork for all received JVMPI events. For each event received by profiler --- 210,214 ---- /// Destructor. ! virtual ~Prof() {} /** Main fork for all received JVMPI events. For each event received by profiler *************** *** 235,242 **** ** @return pointer to Class object or NULL */ ! Class* getClass( jobjectID classId, int create = 1) { ! ! return activeClasses.get( classId); ! } /** Returns corresponding Method object. --- 235,239 ---- ** @return pointer to Class object or NULL */ ! Class* getClass( jobjectID classId, int create = 1); /** Returns corresponding Method object. *************** *** 250,257 **** ** @return pointer to Method object or NULL */ ! Method* getMethod( jmethodID methodId, int create = 1) { ! ! return activeMethods.get( methodId); ! } /** Returns corresponding Thread object. --- 247,251 ---- ** @return pointer to Method object or NULL */ ! Method* getMethod( jmethodID methodId, int create = 1); /** Returns corresponding Thread object. *************** *** 1123,1126 **** --- 1117,1122 ---- static void destroy(); + private: + /** Universal handler for all JVMPI events. JVM calls this ** function for each event it propagates. *************** *** 1132,1139 **** ** @see JVM_OnLoad(), JVMPI specification */ ! static void notifyEvent( JVMPI_Event* event) { ! if( _prof) _prof->runEvent( event); ! } private: --- 1128,1137 ---- ** @see JVM_OnLoad(), JVMPI specification */ ! static void notifyEvent( JVMPI_Event* event); ! private: ! ! /// request event notification ! int requestEvent; private: Index: prof_class.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_class.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -r1.11 -r1.12 *** prof_class.cpp 21 Nov 2001 22:31:44 -0000 1.11 --- prof_class.cpp 15 Apr 2002 21:04:18 -0000 1.12 *************** *** 40,46 **** Synchronized sync( dataLock, 0); ! if( !(event->event_type & JVMPI_REQUESTED_EVENT)) sync.enter(); ! if( !event->u.class_load.class_id) return; static int firstTime = 1; --- 40,48 ---- Synchronized sync( dataLock, 0); ! if( !requestEvent) sync.enter(); ! jobjectID classId = event->u.class_load.class_id; ! ! if( !classId) return; static int firstTime = 1; *************** *** 54,63 **** jvmpiInterface->EnableEvent( JVMPI_EVENT_METHOD_ENTRY, NULL); ! if( setup.mon.turnedOn) jvmpiInterface->EnableEvent( JVMPI_EVENT_MONITOR_CONTENDED_ENTER, NULL); firstTime = 0; } Class* c = new Class; --- 56,76 ---- jvmpiInterface->EnableEvent( JVMPI_EVENT_METHOD_ENTRY, NULL); ! if( setup.mon.turnedOn) { ! jvmpiInterface->EnableEvent( JVMPI_EVENT_MONITOR_CONTENDED_ENTER, NULL); + jvmpiInterface->EnableEvent( JVMPI_EVENT_MONITOR_WAITED, NULL); + } firstTime = 0; } + if( getClass( classId, 0)) return; + + jint numMethods = event->u.class_load.num_methods; + JVMPI_Method* pm = event->u.class_load.methods; + + for( jint l = 0; l < numMethods; l++, pm++) + if( getMethod( pm->method_id, 0)) return; + Class* c = new Class; *************** *** 66,75 **** c->numInterfaces = event->u.class_load.num_interfaces; ! c->numMethods = event->u.class_load.num_methods; c->numStaticFields = event->u.class_load.num_static_fields; c->numInstanceFields = event->u.class_load.num_instance_fields; ! JVMPI_Method* pm = event->u.class_load.methods; ! for( jint i = 0; i < c->numMethods; i++, pm++) { Method* m = new Method; --- 79,88 ---- c->numInterfaces = event->u.class_load.num_interfaces; ! c->numMethods = numMethods; c->numStaticFields = event->u.class_load.num_static_fields; c->numInstanceFields = event->u.class_load.num_instance_fields; ! pm = event->u.class_load.methods; ! for( jint i = 0; i < numMethods; i++, pm++) { Method* m = new Method; *************** *** 109,116 **** } ! c->classId = event->u.class_load.class_id; classes.add( c); ! activeClasses.add(c); Method* m = c->methods.first(); --- 122,129 ---- } ! c->classId = classId; classes.add( c); ! activeClasses.add( c); Method* m = c->methods.first(); *************** *** 126,130 **** Synchronized sync( dataLock); ! Class* c = getClass(event->u.class_unload.class_id, 0); if( c) c->deactivate(); } --- 139,143 ---- Synchronized sync( dataLock); ! Class* c = getClass( event->u.class_unload.class_id, 0); if( c) c->deactivate(); } Index: prof_get.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_get.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -r1.10 -r1.11 *** prof_get.cpp 12 Mar 2002 22:17:56 -0000 1.10 --- prof_get.cpp 15 Apr 2002 21:04:18 -0000 1.11 *************** *** 51,73 **** #include "../mon/monThreadTrace.h" ! CpuTrace* Prof::getCpuTrace(int numFrames, JVMPI_CallFrame* frames, int create) { TraceKey key; - CpuTrace* trace; key.numFrames = numFrames; ! key.frames = frames; [...1040 lines suppressed...] + event.event_type = JVMPI_EVENT_CLASS_LOAD; + event.env_id = NULL; + + event.u.class_load.class_name = buf; + event.u.class_load.source_name = NULL; + event.u.class_load.num_interfaces = 0; + event.u.class_load.num_methods = 0; + event.u.class_load.methods = NULL; + event.u.class_load.num_static_fields = 0; + event.u.class_load.statics = NULL; + event.u.class_load.num_instance_fields = 0; + event.u.class_load.instances = NULL; + event.u.class_load.class_id = classId; + + requestEvent++; + event_classLoad( &event); + requestEvent--; + + return activeClasses.get( classId); + } Index: prof_method.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_method.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -r1.11 -r1.12 *** prof_method.cpp 8 Apr 2002 23:30:01 -0000 1.11 --- prof_method.cpp 15 Apr 2002 21:04:18 -0000 1.12 *************** *** 46,51 **** jint lineno = 0; ! if (setup.cpu.linenoEnabled || setup.cpu.callTreeLinenoEnabled) ! { JVMPI_CallFrame callFrame; JVMPI_CallTrace callTrace; --- 46,51 ---- jint lineno = 0; ! if (setup.cpu.linenoEnabled || setup.cpu.callTreeLinenoEnabled) { ! JVMPI_CallFrame callFrame; JVMPI_CallTrace callTrace; *************** *** 74,83 **** Thread* thread = getThread( event->env_id); - if( !thread) { - - PROF_ERROR( "METHOD ENTRY", "Thread not found"); - return; - } - JVMPI_CallFrame tempFrame; --- 74,77 ---- *************** *** 119,133 **** Method* m = getMethod( methodID); - if( m) { ! p = new CallTreeItem; ! p->method = m; ! p->lineno = ctLineno; ! p->parent = current; ! if( current) current->children.add( p); ! else thread->callTree.root = p; ! } } --- 113,125 ---- Method* m = getMethod( methodID); ! p = new CallTreeItem; ! p->method = m; ! p->lineno = ctLineno; ! p->parent = current; ! if( current) current->children.add( p); ! else thread->callTree.root = p; } *************** *** 166,176 **** jmethodID methodID = event->u.method.method_id; - Thread* thread = getThread( event->env_id); ! if( !thread) { ! ! PROF_ERROR("METHOD EXIT", "Thread not found"); ! return; ! } int numFrames = setup.cpu.traceDepth; --- 158,164 ---- jmethodID methodID = event->u.method.method_id; ! Thread* thread = getThread( event->env_id, 0); ! if( !thread) return; int numFrames = setup.cpu.traceDepth; *************** *** 204,245 **** if( setup.cpu.threadsEnabled) { ! if( setup.cpu.level == Setup::LEVEL_METHOD) { ! if( !(stat = getCpuThreadMethod( event->env_id, methodID))) { ! PROF_ERROR("METHOD EXIT", "Cannot get CpuThreadMethod"); ! return; ! } ! } ! else { ! ! if( !(stat = getCpuThreadTrace( event->env_id, numFrames, callFrames))) { ! PROF_ERROR("METHOD EXIT", "Cannot get CpuThreadTrace"); ! return; ! } ! } } else { ! if( setup.cpu.level == Setup::LEVEL_METHOD) { ! if( !(stat = getMethod( methodID))) { ! PROF_ERROR("METHOD EXIT", "Method not found"); ! return; ! } ! } ! else { ! ! if( !(stat = getCpuTrace( numFrames, callFrames))) { ! PROF_ERROR("METHOD EXIT", "Cannot get CPU trace"); ! return; ! } ! } } ! stat->addCpuStat( 1, pureTime); stat->addCpuStat( -1, 0); --- 192,215 ---- if( setup.cpu.threadsEnabled) { ! if( setup.cpu.level == Setup::LEVEL_METHOD) ! stat = getCpuThreadMethod( event->env_id, methodID); ! else ! stat = getCpuThreadTrace( event->env_id, numFrames, callFrames); } else { ! if( setup.cpu.level == Setup::LEVEL_METHOD) ! stat = getMethod( methodID); ! else ! stat = getCpuTrace( numFrames, callFrames); } ! stat->addCpuStat( 1, pureTime); stat->addCpuStat( -1, 0); Index: prof_monitor.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_monitor.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** prof_monitor.cpp 8 Apr 2002 23:30:01 -0000 1.6 --- prof_monitor.cpp 15 Apr 2002 21:04:18 -0000 1.7 *************** *** 42,52 **** void Prof::event_monitorContendedEnter( JVMPI_Event* event) { ! Synchronized sync(dataLock); ! Thread* t; ! if (!(t = getThread(event->env_id))) { ! PROF_ERROR("MONITOR CONTENDED ENTER", "Thread not found"); ! return; ! } static int firstTime = 1; --- 42,48 ---- void Prof::event_monitorContendedEnter( JVMPI_Event* event) { ! Synchronized sync( dataLock); ! Thread* t = getThread( event->env_id); static int firstTime = 1; *************** *** 54,59 **** jvmpiInterface->EnableEvent( JVMPI_EVENT_MONITOR_CONTENDED_ENTERED, NULL); - jvmpiInterface->EnableEvent( JVMPI_EVENT_MONITOR_WAITED, NULL); - firstTime = 0; } --- 50,53 ---- *************** *** 66,82 **** void Prof::event_monitorContendedEntered( JVMPI_Event* event) { ! Synchronized sync(dataLock); - Thread* t; - if (!(t = getThread(event->env_id))) { PROF_ERROR("MONITOR CONTENDED ENTERED", "Thread not found"); return; } ! if ((!(t->monitorEnter)) || (t->monitorEnterObject != event->u.monitor.object)) { PROF_ERROR("MONITOR CONTENDED ENTERED", "No corresponding MONITOR CONTENDED ENTER"); t->monitorEnter = 0; return; } t->monitorEnter = 0; --- 60,80 ---- void Prof::event_monitorContendedEntered( JVMPI_Event* event) { ! Synchronized sync( dataLock); ! ! Thread* t = getThread( event->env_id, 0); ! if( !t) { PROF_ERROR("MONITOR CONTENDED ENTERED", "Thread not found"); return; } ! if ( !t->monitorEnter || t->monitorEnterObject != event->u.monitor.object) { ! PROF_ERROR("MONITOR CONTENDED ENTERED", "No corresponding MONITOR CONTENDED ENTER"); t->monitorEnter = 0; + return; } + t->monitorEnter = 0; *************** *** 91,100 **** callTrace.env_id = event->env_id; ! callTrace.num_frames = (jint)numFrames; callTrace.frames = callFrames; ! jvmpiInterface->GetCallTrace(&callTrace, (jint)numFrames); numFrames = callTrace.num_frames; ! if (numFrames == 0) { PROF_ERROR("MONITOR CONTENDED ENTERED", "GetCallTrace failed"); return; --- 89,100 ---- callTrace.env_id = event->env_id; ! callTrace.num_frames = numFrames; callTrace.frames = callFrames; ! jvmpiInterface->GetCallTrace(&callTrace, numFrames); numFrames = callTrace.num_frames; ! ! if( numFrames < 1) { ! PROF_ERROR("MONITOR CONTENDED ENTERED", "GetCallTrace failed"); return; *************** *** 109,158 **** if (setup.mon.threadsEnabled) { ! if (setup.mon.level == Setup::LEVEL_METHOD) { ! if (!(stat = getMonThreadMethod(event->env_id, callFrames[0].method_id))) { ! PROF_ERROR("MONITOR CONTENDED ENTERED", "Cannot get MonThreadMethod"); ! return; ! } ! } ! else { ! ! if (!(stat = getMonThreadTrace(event->env_id, numFrames, callFrames))) { ! PROF_ERROR("MONITOR CONTENDED ENTERED", "Cannot get MonThreadTrace"); ! return; ! } ! } } else { - if (setup.mon.level == Setup::LEVEL_METHOD) { ! if (!(stat = getMethod(callFrames[0].method_id))) { ! PROF_ERROR("MONITOR CONTENDED ENTERED", "Method not found"); ! return; ! } ! } ! else { ! ! if (!(stat = getMonTrace(numFrames, callFrames))) { ! PROF_ERROR("MONITOR CONTENDED ENTERED", "Cannot get MonTrace"); ! return; ! } ! } } int hits = (stat->wait) ? 0 : 1; ! stat->addMonStat(hits, curTime - t->monitorEnterTime); stat->addMonStat( -1, 0); } void Prof::event_monitorWaited( JVMPI_Event* event) { ! Synchronized sync(dataLock); ! Thread* t; ! if (!(t = getThread(event->env_id))) { ! PROF_ERROR("MONITOR WAITED", "Thread not found"); ! return; ! } int numFrames = 1; --- 109,143 ---- if (setup.mon.threadsEnabled) { ! if (setup.mon.level == Setup::LEVEL_METHOD) ! stat = getMonThreadMethod(event->env_id, callFrames[0].method_id); ! ! else ! ! stat = getMonThreadTrace(event->env_id, numFrames, callFrames); } else { ! if (setup.mon.level == Setup::LEVEL_METHOD) ! ! stat = getMethod(callFrames[0].method_id); ! ! else ! ! stat = getMonTrace(numFrames, callFrames); } int hits = (stat->wait) ? 0 : 1; ! stat->addMonStat( hits, curTime-t->monitorEnterTime); stat->addMonStat( -1, 0); + + stat->wait = 0; } void Prof::event_monitorWaited( JVMPI_Event* event) { ! Synchronized sync( dataLock); ! Thread* t = getThread( event->env_id); int numFrames = 1; *************** *** 163,172 **** callTrace.env_id = event->env_id; ! callTrace.num_frames = (jint)numFrames; callTrace.frames = callFrames; ! jvmpiInterface->GetCallTrace(&callTrace, (jint)numFrames); numFrames = callTrace.num_frames; ! if (numFrames == 0) { PROF_ERROR("MONITOR WAITED", "GetCallTrace failed"); return; --- 148,159 ---- callTrace.env_id = event->env_id; ! callTrace.num_frames = numFrames; callTrace.frames = callFrames; ! jvmpiInterface->GetCallTrace(&callTrace, numFrames); numFrames = callTrace.num_frames; ! ! if( numFrames < 1) { ! PROF_ERROR("MONITOR WAITED", "GetCallTrace failed"); return; *************** *** 177,214 **** if (setup.mon.threadsEnabled) { ! if (setup.mon.level == Setup::LEVEL_METHOD) { ! if (!(stat = getMonThreadMethod(event->env_id, callFrames[0].method_id))) { ! PROF_ERROR("MONITOR WAITED", "Cannot get MonThreadMethod"); ! return; ! } ! } ! else { ! ! if (!(stat = getMonThreadTrace(event->env_id, numFrames, callFrames))) { ! PROF_ERROR("MONITOR WAITED", "Cannot get MonThreadTrace"); ! return; ! } ! } } else { - if (setup.mon.level == Setup::LEVEL_METHOD) { ! if (!(stat = getMethod(callFrames[0].method_id))) { ! PROF_ERROR("MONITOR WAITED", "Method not found"); ! return; ! } ! } ! else { ! ! if (!(stat = getMonTrace(numFrames, callFrames))) { ! PROF_ERROR("MONITOR WAITED", "Cannot get MonTrace"); ! return; ! } ! } } stat->wait = 1; ! stat->addMonStat(1, event->u.monitor_wait.timeout); stat->addMonStat( -1, 0); } --- 164,188 ---- if (setup.mon.threadsEnabled) { ! if (setup.mon.level == Setup::LEVEL_METHOD) ! ! stat = getMonThreadMethod(event->env_id, callFrames[0].method_id); ! ! else ! stat = getMonThreadTrace(event->env_id, numFrames, callFrames); } else { ! if (setup.mon.level == Setup::LEVEL_METHOD) ! ! stat = getMethod(callFrames[0].method_id); ! ! else ! ! stat = getMonTrace(numFrames, callFrames); } stat->wait = 1; ! stat->addMonStat( 1, event->u.monitor_wait.timeout); stat->addMonStat( -1, 0); } Index: prof_object.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_object.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -r1.19 -r1.20 *** prof_object.cpp 8 Apr 2002 23:30:01 -0000 1.19 --- prof_object.cpp 15 Apr 2002 21:04:18 -0000 1.20 *************** *** 46,61 **** void Prof::event_objectAlloc( JVMPI_Event* event) { ! Synchronized sync(dataLock, 0); ! if (!(event->event_type & JVMPI_REQUESTED_EVENT)) sync.enter(); ! JNIEnv* envId = event->env_id; ! jint arenaId = event->u.obj_alloc.arena_id; jobjectID classId = event->u.obj_alloc.class_id; ! jint isArray = event->u.obj_alloc.is_array; ! jint size = event->u.obj_alloc.size; ! jobjectID objId = event->u.obj_alloc.obj_id; ! if (!envId) return; ! if (!objId) return; AllocAbstractStatThreadObject* stat; --- 46,60 ---- void Prof::event_objectAlloc( JVMPI_Event* event) { ! Synchronized sync( dataLock); ! JNIEnv* envId = event->env_id; ! jint arenaId = event->u.obj_alloc.arena_id; jobjectID classId = event->u.obj_alloc.class_id; ! jint isArray = event->u.obj_alloc.is_array; ! jint size = event->u.obj_alloc.size; ! jobjectID objId = event->u.obj_alloc.obj_id; ! if( !envId) return; ! if( !objId) return; AllocAbstractStatThreadObject* stat; *************** *** 63,80 **** if (setup.alloc.level == Setup::LEVEL_OBJECT) { ! if (setup.alloc.threadsEnabled) { ! if (!(stat = getAllocThreadObject(envId, classId, isArray))) { ! PROF_ERROR("OBJECT ALLOC", "Cannot get AllocThreadObject"); ! return; ! } ! } ! else { ! if (!(stat = getAllocObject(classId, isArray))) { ! PROF_ERROR("OBJECT ALLOC", "Cannot get AllocObject"); ! return; ! } ! } } else if (setup.alloc.level == Setup::LEVEL_METHOD) { --- 62,72 ---- if (setup.alloc.level == Setup::LEVEL_OBJECT) { ! if (setup.alloc.threadsEnabled) ! stat = getAllocThreadObject(envId, classId, isArray); ! else ! ! stat = getAllocObject(classId, isArray); } else if (setup.alloc.level == Setup::LEVEL_METHOD) { *************** *** 84,92 **** trace.env_id = envId; ! trace.num_frames = (jint)1; trace.frames = &frame; ! jvmpiInterface->GetCallTrace(&trace, (jint)1); ! if (trace.num_frames == (jint)0) { PROF_ERROR("OBJECT ALLOC", "GetCallTrace failed"); return; --- 76,86 ---- trace.env_id = envId; ! trace.num_frames = 1; trace.frames = &frame; ! jvmpiInterface->GetCallTrace(&trace, 1); ! ! if (trace.num_frames != 1) { ! PROF_ERROR("OBJECT ALLOC", "GetCallTrace failed"); return; *************** *** 95,114 **** jmethodID methodId = frame.method_id; ! if (setup.alloc.threadsEnabled) { ! if (!(stat = getAllocThreadObjectMethod(envId, classId, isArray, methodId))) { ! PROF_ERROR("OBJECT ALLOC", "Cannot get AllocThreadObjectMethod"); ! return; ! } ! } ! else { ! if (!(stat = getAllocObjectMethod(classId, isArray, methodId))) { ! PROF_ERROR("OBJECT ALLOC", "Cannot get AllocObjectMethod"); ! return; ! } ! } } else { JVMPI_CallTrace trace; JVMPI_CallFrame frames[MAX_TRACE]; --- 89,102 ---- jmethodID methodId = frame.method_id; ! if (setup.alloc.threadsEnabled) ! stat = getAllocThreadObjectMethod(envId, classId, isArray, methodId); ! else ! ! stat = getAllocObjectMethod(classId, isArray, methodId); } else { + JVMPI_CallTrace trace; JVMPI_CallFrame frames[MAX_TRACE]; *************** *** 119,123 **** --- 107,113 ---- jvmpiInterface->GetCallTrace(&trace, setup.alloc.traceDepth); + if (trace.num_frames < 1 || trace.num_frames > setup.alloc.traceDepth) { + PROF_ERROR("OBJECT ALLOC", "GetCallTrace failed"); return; *************** *** 130,147 **** frames[i].lineno = 0; ! if (setup.alloc.threadsEnabled) { ! if (!(stat = getAllocThreadObjectTrace(envId, classId, isArray, numFrames, frames))) { ! PROF_ERROR("OBJECT ALLOC", "Cannot get AllocThreadObjectTrace"); ! return; ! } ! } ! else { ! if (!(stat = getAllocObjectTrace(classId, isArray, numFrames, frames))) { ! PROF_ERROR("OBJECT ALLOC", "Cannot get AllocObjectTrace"); ! return; ! } ! } } --- 120,130 ---- frames[i].lineno = 0; ! if (setup.alloc.threadsEnabled) ! stat = getAllocThreadObjectTrace(envId, classId, isArray, numFrames, frames); ! else ! ! stat = getAllocObjectTrace(classId, isArray, numFrames, frames); } *************** *** 196,200 **** void Prof::event_objectMove( JVMPI_Event* event) { ! jobjectID obj_id = event->u.obj_move.obj_id; AllocInstance* ins = instances.get( obj_id); --- 179,183 ---- void Prof::event_objectMove( JVMPI_Event* event) { ! jobjectID obj_id = event->u.obj_move.obj_id; AllocInstance* ins = instances.get( obj_id); Index: prof_thread.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_thread.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -r1.15 -r1.16 *** prof_thread.cpp 12 Mar 2002 22:17:56 -0000 1.15 --- prof_thread.cpp 15 Apr 2002 21:04:18 -0000 1.16 *************** *** 62,73 **** Synchronized sync( dataLock, 0); ! if( !(event->event_type & JVMPI_REQUESTED_EVENT)) sync.enter(); JNIEnv* envId = event->u.thread_start.thread_env_id; ! char* name = event->u.thread_start.thread_name; ! if (!envId) return; ! if (strcmp(name, COMMUN_THREAD) == 0) return; ! if (strcmp(name, SAMPLING_THREAD) == 0) return; static int firstTime = 1; --- 62,73 ---- Synchronized sync( dataLock, 0); ! if( !requestEvent) sync.enter(); JNIEnv* envId = event->u.thread_start.thread_env_id; ! char* name = event->u.thread_start.thread_name; ! if( !envId) return; ! if( !strcmp( name, COMMUN_THREAD)) return; ! if( !strcmp( name, SAMPLING_THREAD)) return; static int firstTime = 1; *************** *** 78,84 **** } ! Thread* t; ! if( t = getThread( envId, 0)) return; ! else t = new Thread; t->threadName = event->u.thread_start.thread_name; --- 78,84 ---- } ! if( getThread( envId, 0)) return; ! ! Thread* t = new Thread; t->threadName = event->u.thread_start.thread_name; *************** *** 119,123 **** Synchronized sync( dataLock); ! Thread* t = getThread(event->env_id, 0); ! if (t) t->deactivate(); } --- 119,123 ---- Synchronized sync( dataLock); ! Thread* t = getThread( event->env_id, 0); ! if( t) t->deactivate(); } |