From: Marek P. <ma...@us...> - 2002-02-10 18:36:16
|
Update of /cvsroot/javaprofiler/library/src/prof In directory usw-pr-cvs1:/tmp/cvs-serv5925/src/prof Modified Files: prof_get.cpp prof_jvm.cpp prof_method.cpp prof_object.cpp Log Message: fixes; calltree implementation (for exact cpu profiling) Index: prof_get.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_get.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** prof_get.cpp 21 Nov 2001 22:31:44 -0000 1.8 --- prof_get.cpp 10 Feb 2002 18:36:13 -0000 1.9 *************** *** 249,253 **** key.objectKey.isArray = isArray; key.traceKey.numFrames = numFrames; ! key.objectKey.isArray = isArray; if (objectTrace = activeAllocObjectTraces.get(key)) return objectTrace; --- 249,253 ---- key.objectKey.isArray = isArray; key.traceKey.numFrames = numFrames; ! key.traceKey.frames = frames; if (objectTrace = activeAllocObjectTraces.get(key)) return objectTrace; Index: prof_jvm.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_jvm.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -r1.26 -r1.27 *** prof_jvm.cpp 26 Jan 2002 10:19:44 -0000 1.26 --- prof_jvm.cpp 10 Feb 2002 18:36:13 -0000 1.27 *************** *** 195,198 **** --- 195,226 ---- } + static int printAllObjectTraces( AllocObjectTrace* otr, void**) { + + cout << " AllocObjectTrace - ID = " << otr->getProfID() << endl; + cout << " parentLeftObjId = " << otr->trace->getProfID() << " (" << otr->trace << ")" << endl; + cout << " parentUpObjId = " << otr->objectMethod->getProfID() << endl; + + return 0; + } + + static int printAllObjectMethods( AllocObjectMethod* om, void**) { + + cout << " AllocObjectMethod - ID = " << om->getProfID() << endl; + cout << " parentLeftObjId = " << om->method->getProfID() << " (" << om->method << ")" << endl; + cout << " parentUpObjId = " << om->object->getProfID() << endl; + om->objectTraces.forEach( printAllObjectTraces, NULL); + + return 0; + } + + static int printAllObjects( AllocObject* o, void**) { + + cout << "AllocObject - ID = " << o->getProfID() << " (" << o << ")" << endl; + o->objectMethods.forEach( printAllObjectMethods, NULL); + cout << endl; + + return 0; + } + static void printHashStatistics() { *************** *** 482,485 **** --- 510,514 ---- printTotals(); printSampling(); + allocObjects.forEach( printAllObjects, NULL); #endif Index: prof_method.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_method.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -r1.7 -r1.8 *** prof_method.cpp 21 Nov 2001 22:31:44 -0000 1.7 --- prof_method.cpp 10 Feb 2002 18:36:13 -0000 1.8 *************** *** 41,73 **** void Prof::event_methodEntry( JVMPI_Event* event) { ! Synchronized sync(dataLock); - jlong entryTime; JVMPI_CallFrame callFrame; JVMPI_CallTrace callTrace; - Thread* thread; callTrace.env_id = event->env_id; ! callTrace.num_frames = (jint)1; callTrace.frames = &callFrame; ! jvmpiInterface->GetCallTrace(&callTrace, (jint)1); ! if (callTrace.num_frames != (jint)1) { ! PROF_ERROR("METHOD ENTRY", "GetCallTrace failed"); return; } ! if (callFrame.method_id != event->u.method.method_id) { ! PROF_ERROR("METHOD ENTRY", "callFrame.method_id != event->method.method_id"); return; } ! if (!(thread = getThread(event->env_id))) { ! PROF_ERROR("METHOD ENTRY", "Thread not found"); return; } ! entryTime = jvmpiInterface->GetCurrentThreadCpuTime(); ! thread->stack.push(callFrame, entryTime); static int firstTime = 1; --- 41,134 ---- void Prof::event_methodEntry( JVMPI_Event* event) { ! Synchronized sync( dataLock); JVMPI_CallFrame callFrame; JVMPI_CallTrace callTrace; callTrace.env_id = event->env_id; ! callTrace.num_frames = 1; callTrace.frames = &callFrame; ! jvmpiInterface->GetCallTrace( &callTrace, 1); ! if( callTrace.num_frames != 1) { ! ! PROF_ERROR( "METHOD ENTRY", "GetCallTrace failed"); return; } ! ! if( callFrame.method_id != event->u.method.method_id) { ! ! PROF_ERROR( "METHOD ENTRY", "callFrame.method_id != event->method.method_id"); return; } ! Thread* thread = getThread( event->env_id); ! ! if( !thread) { ! ! PROF_ERROR( "METHOD ENTRY", "Thread not found"); return; } ! jlong entryTime = jvmpiInterface->GetCurrentThreadCpuTime(); ! thread->stack.push( callFrame, entryTime); ! ! if( setup.cpu.callTreeEnabled) { ! ! CallTreeItem* current = thread->callTree.current; ! CallTreeItem* p = current; ! ! if( p) { ! ! CallTreeItem* q = p->children.first(); ! while( q) { ! ! if( q->method && q->method->isActive() && *q->method == event->u.method.method_id) break; ! q = p->children.next( q); ! } ! ! if( q) p->children.add( p->children.remove( q)); ! ! p = q; ! } ! ! if( !p) { ! ! Method* m = getMethod( event->u.method.method_id); ! if( m) { ! ! p = new CallTreeItem; ! ! p->method = m; ! p->parent = current; ! ! if( current) current->children.add( p); ! else thread->callTree.root = p; ! } ! } ! ! if( p) { ! ! thread->callTree.current = p; ! current = p; ! p = current->parent; ! ! current->hits++; ! current->startTime = entryTime; ! ! if( p) { ! ! jlong t = entryTime-p->startTime; ! p->pureTime += t; ! ! // while( p) { ! // ! // p->cumulativeTime += t; ! // p = p->parent; ! // } ! } ! } ! } static int firstTime = 1; *************** *** 81,123 **** void Prof::event_methodExit( JVMPI_Event* event) { ! Synchronized sync(dataLock); - Thread* thread; - JVMPI_CallFrame callFrames[MAX_TRACE]; - int numFrames; - jlong exitTime; - jlong totalTime; - jlong pureTime; - CpuStatData* stat; - - if (!(thread = getThread(event->env_id))) { PROF_ERROR("METHOD EXIT", "Thread not found"); return; } ! if (setup.cpu.level == Setup::LEVEL_METHOD) { ! numFrames = 1; ! } ! else numFrames = setup.cpu.traceDepth; - numFrames = thread->stack.getTopCallTrace(numFrames, callFrames); - if (numFrames == 0) { PROF_ERROR("METHOD EXIT", "Empty stack"); return; } ! if (callFrames[0].method_id != event->u.method.method_id) { PROF_ERROR("METHOD EXIT", "top method != event->method.method_id"); return; } ! exitTime = jvmpiInterface->GetCurrentThreadCpuTime(); ! thread->stack.pop(exitTime, totalTime, pureTime); ! if (setup.cpu.threadsEnabled) { ! if (setup.cpu.level == Setup::LEVEL_METHOD) { - if (!(stat = getCpuThreadMethod(event->env_id, callFrames[0].method_id))) { PROF_ERROR("METHOD EXIT", "Cannot get CpuThreadMethod"); return; --- 142,189 ---- void Prof::event_methodExit( JVMPI_Event* event) { ! Synchronized sync( dataLock); ! ! Thread* thread = getThread( event->env_id); ! ! if( !thread) { PROF_ERROR("METHOD EXIT", "Thread not found"); return; } ! int numFrames = setup.cpu.traceDepth; ! JVMPI_CallFrame callFrames[MAX_TRACE]; ! ! if( setup.cpu.level == Setup::LEVEL_METHOD) numFrames = 1; ! ! numFrames = thread->stack.getTopCallTrace( numFrames, callFrames); ! ! if( !numFrames) { PROF_ERROR("METHOD EXIT", "Empty stack"); return; } ! if( callFrames[0].method_id != event->u.method.method_id) { ! PROF_ERROR("METHOD EXIT", "top method != event->method.method_id"); return; } ! jlong exitTime = jvmpiInterface->GetCurrentThreadCpuTime(); ! ! jlong totalTime; ! jlong pureTime; ! thread->stack.pop( exitTime, totalTime, pureTime); ! CpuStatData* stat; ! ! if( setup.cpu.threadsEnabled) { ! ! if( setup.cpu.level == Setup::LEVEL_METHOD) { ! ! if( !(stat = getCpuThreadMethod( event->env_id, callFrames[0].method_id))) { PROF_ERROR("METHOD EXIT", "Cannot get CpuThreadMethod"); return; *************** *** 126,130 **** else { ! if (!(stat = getCpuThreadTrace(event->env_id, numFrames, callFrames))) { PROF_ERROR("METHOD EXIT", "Cannot get CpuThreadTrace"); return; --- 192,197 ---- else { ! if( !(stat = getCpuThreadTrace( event->env_id, numFrames, callFrames))) { ! PROF_ERROR("METHOD EXIT", "Cannot get CpuThreadTrace"); return; *************** *** 133,139 **** } else { - if (setup.cpu.level == Setup::LEVEL_METHOD) { ! if (!(stat = getMethod(callFrames[0].method_id))) { PROF_ERROR("METHOD EXIT", "Method not found"); return; --- 200,208 ---- } else { ! if( setup.cpu.level == Setup::LEVEL_METHOD) { ! ! if( !(stat = getMethod( callFrames[0].method_id))) { ! PROF_ERROR("METHOD EXIT", "Method not found"); return; *************** *** 142,146 **** else { ! if (!(stat = getCpuTrace(numFrames, callFrames))) { PROF_ERROR("METHOD EXIT", "Cannot get CPU trace"); return; --- 211,216 ---- else { ! if( !(stat = getCpuTrace( numFrames, callFrames))) { ! PROF_ERROR("METHOD EXIT", "Cannot get CPU trace"); return; *************** *** 149,152 **** } ! stat->addCpuStat((jlong)1, pureTime); } --- 219,246 ---- } ! stat->addCpuStat( 1, pureTime); ! ! if( setup.cpu.callTreeEnabled) { ! ! CallTreeItem* current = thread->callTree.current; ! ! if( current->method && ! current->method->isActive() && ! *current->method == callFrames[0].method_id) { ! ! jlong t = exitTime-current->startTime; ! current->pureTime += t; ! ! // CallTreeItem* p = current; ! // while( p) { ! // ! // p->cumulativeTime += t; ! // p = p->parent; ! // } ! ! if( current->parent) current->parent->startTime = exitTime; ! ! thread->callTree.current = current->parent; ! } ! } } Index: prof_object.cpp =================================================================== RCS file: /cvsroot/javaprofiler/library/src/prof/prof_object.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -r1.16 -r1.17 *** prof_object.cpp 21 Nov 2001 22:31:45 -0000 1.16 --- prof_object.cpp 10 Feb 2002 18:36:13 -0000 1.17 *************** *** 115,123 **** trace.env_id = envId; ! trace.num_frames = setup.alloc.traceDepth; trace.frames = frames; jvmpiInterface->GetCallTrace(&trace, setup.alloc.traceDepth); ! if (trace.num_frames == (jint)0) { PROF_ERROR("OBJECT ALLOC", "GetCallTrace failed"); return; --- 115,123 ---- trace.env_id = envId; ! trace.num_frames = setup.alloc.traceDepth+1; trace.frames = frames; jvmpiInterface->GetCallTrace(&trace, setup.alloc.traceDepth); ! if (trace.num_frames < 1 || trace.num_frames > setup.alloc.traceDepth) { PROF_ERROR("OBJECT ALLOC", "GetCallTrace failed"); return; |