#include "apitrace.h"
-#include "loaderthread.h"
+#include "traceloader.h"
#include "saverthread.h"
+#include <QDebug>
#include <QDir>
+#include <QThread>
ApiTrace::ApiTrace()
: m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
m_needsSaving(false)
{
- m_loader = new LoaderThread(this);
- connect(m_loader, SIGNAL(parsedFrames(const QList<ApiTraceFrame*>)),
+ 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<ApiTraceFrame*>)),
this, SLOT(addFrames(const QList<ApiTraceFrame*>)));
- connect(m_loader, SIGNAL(started()),
+ connect(m_loader, SIGNAL(frameLoaded(ApiTraceFrame*)),
+ this, SIGNAL(frameLoaded(ApiTraceFrame*)));
+
+ 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;
return m_frameMarker;
}
-QList<ApiTraceCall*> ApiTrace::calls() const
+QVector<ApiTraceCall*> 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();
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();
m_needsSaving = false;
emit invalidated();
- m_loader->loadFile(m_fileName);
+// m_loader->loadTrace(m_fileName);
+ emit loadTrace(m_fileName);
}
}
void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
{
- QList<ApiTraceCall*> calls;
+ QVector<ApiTraceCall*> calls;
int currentFrames = m_frames.count();
int numNewFrames = frames.count();
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();
}
- m_calls.reserve(m_calls.count() + calls.count());
+ m_calls.reserve(m_calls.count() + calls.count() + 1);
m_calls += calls;
emit endAddingFrames();
if (!currentFrame) {
currentFrame = new ApiTraceFrame(this);
currentFrame->number = m_frames.count();
+ currentFrame->setLoaded(true);
}
apiCall->setParentFrame(currentFrame);
currentFrame->addCall(apiCall);
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)
-{
- m_signatures[id] = signature;
-}
-
-ApiTraceEnumSignature * ApiTrace::enumSignature(unsigned id)
-{
- if (id >= m_enumSignatures.count()) {
- m_enumSignatures.resize(id + 1);
- return NULL;
- } else {
- return m_enumSignatures[id];
- }
-}
-
-void ApiTrace::addEnumSignature(unsigned id, ApiTraceEnumSignature *signature)
+void ApiTrace::loadFrame(ApiTraceFrame *frame)
{
- m_enumSignatures[id] = signature;
+ Q_ASSERT(!frame->loaded());
+ emit requestFrame(frame);
}
#include "apitrace.moc"