From ac4dd9a23fe0e08496368a0e013ad538675106f3 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Sun, 28 Aug 2011 00:38:13 -0400 Subject: [PATCH] Share function signatures. reduces memory usage by ~150mb on a 40mb trace. --- gui/apitrace.cpp | 15 +++++-- gui/apitrace.h | 4 ++ gui/apitracecall.cpp | 99 +++++++++++++++++++++++++++----------------- gui/apitracecall.h | 35 ++++++++++++---- gui/loaderthread.cpp | 15 +++---- gui/loaderthread.h | 3 +- 6 files changed, 115 insertions(+), 56 deletions(-) diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index d9a248d..9c99cfa 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -156,7 +156,7 @@ void ApiTrace::addFrames(const QList &frames) int currentCalls = m_calls.count(); int numNewCalls = 0; foreach(ApiTraceFrame *frame, frames) { - frame->setParentTrace(this); + Q_ASSERT(this == frame->parentTrace()); numNewCalls += frame->numChildren(); m_calls += frame->calls(); } @@ -175,8 +175,7 @@ void ApiTrace::detectFrames() ApiTraceFrame *currentFrame = 0; foreach(ApiTraceCall *apiCall, m_calls) { if (!currentFrame) { - currentFrame = new ApiTraceFrame(); - currentFrame->setParentTrace(this); + currentFrame = new ApiTraceFrame(this); currentFrame->number = m_frames.count(); } apiCall->setParentFrame(currentFrame); @@ -287,4 +286,14 @@ bool ApiTrace::hasErrors() const return !m_errors.isEmpty(); } +ApiTraceCallSignature * ApiTrace::signature(const QString &callName) +{ + return m_signatures[callName]; +} + +void ApiTrace::addSignature(ApiTraceCallSignature *signature) +{ + m_signatures.insert(signature->name(), signature); +} + #include "apitrace.moc" diff --git a/gui/apitrace.h b/gui/apitrace.h index d52c669..abcdb01 100644 --- a/gui/apitrace.h +++ b/gui/apitrace.h @@ -33,6 +33,9 @@ public: ApiTraceState defaultState() const; + ApiTraceCallSignature *signature(const QString &callName); + void addSignature(ApiTraceCallSignature *signature); + QList calls() const; ApiTraceCall *callAt(int idx) const; ApiTraceCall *callWithIndex(int idx) const; @@ -94,6 +97,7 @@ private: bool m_needsSaving; QSet m_errors; + QHash m_signatures; }; #endif diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index afc4b35..ab358c1 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -511,6 +511,27 @@ const QList & ApiTraceState::framebuffers() const return m_framebuffers; } +ApiTraceCallSignature::ApiTraceCallSignature(const QString &name, + const QStringList &argNames) + : m_name(name), + m_argNames(argNames) +{ +} + +ApiTraceCallSignature::~ApiTraceCallSignature() +{ +} + +QUrl ApiTraceCallSignature::helpUrl() const +{ + return m_helpUrl; +} + +void ApiTraceCallSignature::setHelpUrl(const QUrl &url) +{ + m_helpUrl = url; +} + ApiTraceEvent::ApiTraceEvent() : m_type(ApiTraceEvent::None), m_staticText(0) @@ -543,27 +564,29 @@ void ApiTraceEvent::setState(const ApiTraceState &state) m_state = state; } - -ApiTraceCall::ApiTraceCall() +ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame, const Trace::Call *call) : ApiTraceEvent(ApiTraceEvent::Call), + m_parentFrame(parentFrame), m_hasBinaryData(false), m_binaryDataIndex(0) { -} + ApiTrace *trace = parentTrace(); + Q_ASSERT(trace); -ApiTraceCall::ApiTraceCall(const Trace::Call *call) - : ApiTraceEvent(ApiTraceEvent::Call), - m_hasBinaryData(false), - m_binaryDataIndex(0) -{ - m_name = QString::fromStdString(call->sig->name); m_index = call->no; - QString argumentsText; - for (int i = 0; i < call->sig->num_args; ++i) { - m_argNames += - QString::fromStdString(call->sig->arg_names[i]); + QString name = QString::fromStdString(call->sig->name); + m_signature = trace->signature(name); + + if (!m_signature) { + QStringList argNames; + for (int i = 0; i < call->sig->num_args; ++i) { + argNames += + QString::fromStdString(call->sig->arg_names[i]); + } + m_signature = new ApiTraceCallSignature(name, argNames); + trace->addSignature(m_signature); } if (call->ret) { VariantVisitor retVisitor; @@ -656,7 +679,7 @@ void ApiTraceCall::revert() void ApiTraceCall::setHelpUrl(const QUrl &url) { - m_helpUrl = url; + m_signature->setHelpUrl(url); } void ApiTraceCall::setParentFrame(ApiTraceFrame *frame) @@ -676,12 +699,12 @@ int ApiTraceCall::index() const QString ApiTraceCall::name() const { - return m_name; + return m_signature->name(); } QStringList ApiTraceCall::argNames() const { - return m_argNames; + return m_signature->argNames(); } QVariantList ApiTraceCall::arguments() const @@ -699,7 +722,7 @@ QVariant ApiTraceCall::returnValue() const QUrl ApiTraceCall::helpUrl() const { - return m_helpUrl; + return m_signature->helpUrl(); } bool ApiTraceCall::hasBinaryData() const @@ -720,8 +743,10 @@ QStaticText ApiTraceCall::staticText() const QVariantList argValues = arguments(); QString richText = QString::fromLatin1( - "%1(").arg(m_name); - for (int i = 0; i < m_argNames.count(); ++i) { + "%1(").arg( + m_signature->name()); + QStringList argNames = m_signature->argNames(); + for (int i = 0; i < argNames.count(); ++i) { richText += QLatin1String(""); QString argText = apiVariantToString(argValues[i]); @@ -739,7 +764,7 @@ QStaticText ApiTraceCall::staticText() const richText += argText; } richText += QLatin1String(""); - if (i < m_argNames.count() - 1) + if (i < argNames.count() - 1) richText += QLatin1String(", "); } richText += QLatin1String(")"); @@ -770,30 +795,32 @@ QString ApiTraceCall::toHtml() const m_richText = QLatin1String("
"); - if (m_helpUrl.isEmpty()) { + QUrl helpUrl = m_signature->helpUrl(); + if (helpUrl.isEmpty()) { m_richText += QString::fromLatin1( "%1) %2(") .arg(m_index) - .arg(m_name); + .arg(m_signature->name()); } else { m_richText += QString::fromLatin1( "%1) %3(") .arg(m_index) - .arg(m_helpUrl.toString()) - .arg(m_name); + .arg(helpUrl.toString()) + .arg(m_signature->name()); } QVariantList argValues = arguments(); - for (int i = 0; i < m_argNames.count(); ++i) { + QStringList argNames = m_signature->argNames(); + for (int i = 0; i < argNames.count(); ++i) { m_richText += QLatin1String("") + - m_argNames[i] + + argNames[i] + QLatin1String("") + QLatin1Literal(" = ") + QLatin1Literal("") + apiVariantToString(argValues[i], true) + QLatin1Literal(""); - if (i < m_argNames.count() - 1) + if (i < argNames.count() - 1) m_richText += QLatin1String(", "); } m_richText += QLatin1String(")"); @@ -833,12 +860,13 @@ QString ApiTraceCall::searchText() const return m_searchText; QVariantList argValues = arguments(); - m_searchText = m_name + QLatin1Literal("("); - for (int i = 0; i < m_argNames.count(); ++i) { - m_searchText += m_argNames[i] + + m_searchText = m_signature->name() + QLatin1Literal("("); + QStringList argNames = m_signature->argNames(); + for (int i = 0; i < argNames.count(); ++i) { + m_searchText += argNames[i] + QLatin1Literal(" = ") + apiVariantToString(argValues[i]); - if (i < m_argNames.count() - 1) + if (i < argNames.count() - 1) m_searchText += QLatin1String(", "); } m_searchText += QLatin1String(")"); @@ -856,9 +884,9 @@ int ApiTraceCall::numChildren() const return 0; } -ApiTraceFrame::ApiTraceFrame() +ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace) : ApiTraceEvent(ApiTraceEvent::Frame), - m_parentTrace(0), + m_parentTrace(parentTrace), m_binaryDataSize(0) { } @@ -908,11 +936,6 @@ ApiTrace * ApiTraceFrame::parentTrace() const return m_parentTrace; } -void ApiTraceFrame::setParentTrace(ApiTrace *trace) -{ - m_parentTrace = trace; -} - void ApiTraceFrame::addCall(ApiTraceCall *call) { m_calls.append(call); diff --git a/gui/apitracecall.h b/gui/apitracecall.h index 4892368..89f3102 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -150,6 +150,31 @@ private: }; Q_DECLARE_METATYPE(ApiTraceState); +class ApiTraceCallSignature +{ +public: + ApiTraceCallSignature(const QString &name, + const QStringList &argNames); + ~ApiTraceCallSignature(); + + QString name() const + { + return m_name; + } + QStringList argNames() const + { + return m_argNames; + } + + QUrl helpUrl() const; + void setHelpUrl(const QUrl &url); + +private: + QString m_name; + QStringList m_argNames; + QUrl m_helpUrl; +}; + class ApiTraceEvent { public: @@ -183,8 +208,7 @@ Q_DECLARE_METATYPE(ApiTraceEvent*); class ApiTraceCall : public ApiTraceEvent { public: - ApiTraceCall(); - ApiTraceCall(const Trace::Call *tcall); + ApiTraceCall(ApiTraceFrame *parentFrame, const Trace::Call *tcall); ~ApiTraceCall(); int index() const; @@ -218,12 +242,10 @@ public: int binaryDataIndex() const; private: int m_index; - QString m_name; - QStringList m_argNames; + ApiTraceCallSignature *m_signature; QVariantList m_argValues; QVariant m_returnValue; ApiTraceFrame *m_parentFrame; - QUrl m_helpUrl; QVariantList m_editedValues; @@ -239,13 +261,12 @@ Q_DECLARE_METATYPE(ApiTraceCall*); class ApiTraceFrame : public ApiTraceEvent { public: - ApiTraceFrame(); + ApiTraceFrame(ApiTrace *parent); int number; bool isEmpty() const; ApiTrace *parentTrace() const; - void setParentTrace(ApiTrace *trace); int numChildren() const; QStaticText staticText() const; diff --git a/gui/loaderthread.cpp b/gui/loaderthread.cpp index de5e3f8..0545453 100644 --- a/gui/loaderthread.cpp +++ b/gui/loaderthread.cpp @@ -12,18 +12,20 @@ static ApiTraceCall * apiCallFromTraceCall(const Trace::Call *call, - const QHash &helpHash) + const QHash &helpHash, + ApiTraceFrame *frame) { - ApiTraceCall *apiCall = new ApiTraceCall(call); + ApiTraceCall *apiCall = new ApiTraceCall(frame, call); apiCall->setHelpUrl(helpHash.value(apiCall->name())); return apiCall; } -LoaderThread::LoaderThread(QObject *parent) +LoaderThread::LoaderThread(ApiTrace *parent) : QThread(parent), - m_frameMarker(ApiTrace::FrameMarker_SwapBuffers) + m_frameMarker(ApiTrace::FrameMarker_SwapBuffers), + m_trace(parent) { } @@ -58,13 +60,12 @@ void LoaderThread::run() while (call) { //std::cout << *call; if (!currentFrame) { - currentFrame = new ApiTraceFrame(); + currentFrame = new ApiTraceFrame(m_trace); currentFrame->number = frameCount; ++frameCount; } ApiTraceCall *apiCall = - apiCallFromTraceCall(call, helpHash); - apiCall->setParentFrame(currentFrame); + apiCallFromTraceCall(call, helpHash, currentFrame); currentFrame->addCall(apiCall); if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) { diff --git a/gui/loaderthread.h b/gui/loaderthread.h index 5073e14..c847c73 100644 --- a/gui/loaderthread.h +++ b/gui/loaderthread.h @@ -12,7 +12,7 @@ class LoaderThread : public QThread { Q_OBJECT public: - LoaderThread(QObject *parent=0); + LoaderThread(ApiTrace *parent); ApiTrace::FrameMarker frameMarker() const; void setFrameMarker(ApiTrace::FrameMarker marker); @@ -28,6 +28,7 @@ protected: private: QString m_fileName; ApiTrace::FrameMarker m_frameMarker; + ApiTrace *m_trace; }; #endif -- 2.43.0