X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Fapitrace.cpp;h=958009b7e383ff6a8b3ccd0984586c4174d52ee2;hb=f682e19bee94eb69a5cfc8b2db17d7f1ebb10c2b;hp=51c4755b28194a70b635ac16d3230ef5c03623b1;hpb=8216d8efc428dd336957433d743af5c4ac2d0d05;p=apitrace diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 51c4755..958009b 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -1,31 +1,52 @@ #include "apitrace.h" -#include "loaderthread.h" +#include "traceloader.h" #include "saverthread.h" +#include #include +#include ApiTrace::ApiTrace() : m_frameMarker(ApiTrace::FrameMarker_SwapBuffers), m_needsSaving(false) { - m_loader = new LoaderThread(this); - connect(m_loader, SIGNAL(parsedFrames(const QList)), + m_loader = new TraceLoader(); + + connect(this, SIGNAL(loadTrace(QString)), + m_loader, SLOT(loadTrace(QString))); + connect(this, SIGNAL(requestFrame(ApiTraceFrame*)), + m_loader, SLOT(loadFrame(ApiTraceFrame*))); + connect(m_loader, SIGNAL(framesLoaded(const QList)), this, SLOT(addFrames(const QList))); - connect(m_loader, SIGNAL(started()), + connect(m_loader, SIGNAL(frameLoaded(ApiTraceFrame*)), + this, SLOT(frameLoadFinished(ApiTraceFrame*))); + connect(m_loader, SIGNAL(finishedParsing()), + this, SLOT(finishedParsing())); + + connect(m_loader, SIGNAL(startedParsing()), this, SIGNAL(startedLoadingTrace())); - connect(m_loader, SIGNAL(finished()), + connect(m_loader, SIGNAL(parsed(int)), + this, SIGNAL(loaded(int))); + connect(m_loader, SIGNAL(finishedParsing()), this, SIGNAL(finishedLoadingTrace())); + m_saver = new SaverThread(this); connect(m_saver, SIGNAL(traceSaved()), this, SLOT(slotSaved())); connect(m_saver, SIGNAL(traceSaved()), this, SIGNAL(saved())); + + m_loaderThread = new QThread(); + m_loader->moveToThread(m_loaderThread); + m_loaderThread->start(); } ApiTrace::~ApiTrace() { + m_loaderThread->quit(); + m_loaderThread->deleteLater(); qDeleteAll(m_calls); qDeleteAll(m_frames); delete m_loader; @@ -79,11 +100,6 @@ QVector ApiTrace::calls() const return m_calls; } -ApiTraceCall * ApiTrace::callAt(int idx) const -{ - return m_calls.value(idx); -} - int ApiTrace::numCalls() const { return m_calls.count(); @@ -118,10 +134,6 @@ void ApiTrace::setFileName(const QString &name) if (m_fileName != name) { m_fileName = name; - if (m_loader->isRunning()) { - m_loader->terminate(); - m_loader->wait(); - } m_frames.clear(); m_calls.clear(); m_errors.clear(); @@ -129,7 +141,8 @@ void ApiTrace::setFileName(const QString &name) m_needsSaving = false; emit invalidated(); - m_loader->loadFile(m_fileName); +// m_loader->loadTrace(m_fileName); + emit loadTrace(m_fileName); } } @@ -157,7 +170,7 @@ void ApiTrace::addFrames(const QList &frames) int currentCalls = m_calls.count(); int numNewCalls = 0; foreach(ApiTraceFrame *frame, frames) { - Q_ASSERT(this == frame->parentTrace()); + frame->setParentTrace(this); numNewCalls += frame->numChildren(); calls += frame->calls(); } @@ -180,6 +193,7 @@ void ApiTrace::detectFrames() if (!currentFrame) { currentFrame = new ApiTraceFrame(this); currentFrame->number = m_frames.count(); + currentFrame->setLoaded(true); } apiCall->setParentFrame(currentFrame); currentFrame->addCall(apiCall); @@ -289,34 +303,24 @@ bool ApiTrace::hasErrors() const return !m_errors.isEmpty(); } -ApiTraceCallSignature * ApiTrace::signature(unsigned id) -{ - if (id >= m_signatures.count()) { - m_signatures.resize(id + 1); - return NULL; - } else { - return m_signatures[id]; - } -} - -void ApiTrace::addSignature(unsigned id, ApiTraceCallSignature *signature) +void ApiTrace::loadFrame(ApiTraceFrame *frame) { - m_signatures[id] = signature; + Q_ASSERT(!frame->loaded()); + emit beginLoadingFrame(frame, frame->numChildrenToLoad()); + emit requestFrame(frame); } -ApiTraceEnumSignature * ApiTrace::enumSignature(unsigned id) +void ApiTrace::finishedParsing() { - if (id >= m_enumSignatures.count()) { - m_enumSignatures.resize(id + 1); - return NULL; - } else { - return m_enumSignatures[id]; + ApiTraceFrame *firstFrame = m_frames[0]; + if (firstFrame && !firstFrame->loaded()) { + loadFrame(firstFrame); } } -void ApiTrace::addEnumSignature(unsigned id, ApiTraceEnumSignature *signature) +void ApiTrace::frameLoadFinished(ApiTraceFrame *frame) { - m_enumSignatures[id] = signature; + emit endLoadingFrame(frame); } #include "apitrace.moc"