/** * Interpret successive calls. */ void runLeg(trace::Call *call) { /* Consume successive calls for this thread. */ do { assert(call); assert(call->thread_id == leg); retraceCall(call); delete call; call = parser->parse_call(); } while (call && call->thread_id == leg); if (call) { /* Pass the baton */ assert(call->thread_id != leg); flushRendering(); race->passBaton(call); } else { /* Reached the finish line */ if (0) std::cerr << "finished on leg " << leg << "\n"; if (leg) { /* Notify the fore runner */ race->finishLine(); } else { /* We are the fore runner */ finished = true; } } }
/** * Interpret successive calls. */ void runLeg(trace::Call *call) { /* Consume successive calls for this thread. */ do { bool callEndsFrame = false; static trace::ParseBookmark frameStart; assert(call); assert(call->thread_id == leg); if (loopCount && call->flags & trace::CALL_FLAG_END_FRAME) { callEndsFrame = true; parser.getBookmark(frameStart); } retraceCall(call); delete call; call = parser.parse_call(); /* Restart last frame if looping is requested. */ if (loopCount) { if (!call) { parser.setBookmark(lastFrameStart); call = parser.parse_call(); if (loopCount > 0) { --loopCount; } } else if (callEndsFrame) { lastFrameStart = frameStart; } } } while (call && call->thread_id == leg); if (call) { /* Pass the baton */ assert(call->thread_id != leg); flushRendering(); race->passBaton(call); } else { /* Reached the finish line */ if (0) std::cerr << "finished on leg " << leg << "\n"; if (leg) { /* Notify the fore runner */ race->finishLine(); } else { /* We are the fore runner */ finished = true; } } }