#else
QString format = QLatin1String("%1:");
#endif
- QString buildPath = format.arg(BUILD_DIR);
+ QString buildPath = format.arg(APITRACE_BINARY_DIR);
m_processEnvironment = QProcessEnvironment::systemEnvironment();
m_processEnvironment.insert("PATH", buildPath +
m_processEnvironment.value("PATH"));
m_fileName = name;
}
+void Retracer::setAPI(trace::API api)
+{
+ m_api = api;
+}
+
bool Retracer::isBenchmarking() const
{
return m_benchmarking;
retrace->process()->setProcessEnvironment(m_processEnvironment);
retrace->setFileName(m_fileName);
+ retrace->setAPI(m_api);
retrace->setBenchmarking(m_benchmarking);
retrace->setDoubleBuffered(m_doubleBuffered);
retrace->setCaptureState(m_captureState);
this, SIGNAL(error(const QString&)));
connect(retrace, SIGNAL(foundState(ApiTraceState*)),
this, SIGNAL(foundState(ApiTraceState*)));
- connect(retrace, SIGNAL(retraceErrors(const QList<RetraceError>&)),
- this, SIGNAL(retraceErrors(const QList<RetraceError>&)));
+ connect(retrace, SIGNAL(retraceErrors(const QList<ApiTraceError>&)),
+ this, SIGNAL(retraceErrors(const QList<ApiTraceError>&)));
retrace->start();
void RetraceProcess::start()
{
+ QString prog;
QStringList arguments;
+ if (m_api == trace::API_GL) {
+ prog = QLatin1String("glretrace");
+ } else if (m_api == trace::API_EGL) {
+ prog = QLatin1String("eglretrace");
+ } else {
+ assert(0);
+ return;
+ }
+
if (m_doubleBuffered) {
arguments << QLatin1String("-db");
} else {
arguments << m_fileName;
- m_process->start(QLatin1String("glretrace"), arguments);
+ m_process->start(prog, arguments);
}
-void RetraceProcess::replayFinished()
+void RetraceProcess::replayFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
QByteArray output = m_process->readAllStandardOutput();
QString msg;
qDebug()<<"\terr = "<<errStr;
qDebug()<<"\tout = "<<output;
#endif
- if (m_captureState) {
- bool ok = false;
- QVariantMap parsedJson = m_jsonParser->parse(output, &ok).toMap();
- ApiTraceState *state = new ApiTraceState(parsedJson);
- emit foundState(state);
- msg = tr("State fetched.");
+
+ if (exitStatus != QProcess::NormalExit) {
+ msg = QLatin1String("Process crashed");
+ } else if (exitCode != 0) {
+ msg = QLatin1String("Process exited with non zero exit code");
} else {
- msg = QString::fromUtf8(output);
+ if (m_captureState) {
+ bool ok = false;
+ QVariantMap parsedJson = m_jsonParser->parse(output, &ok).toMap();
+ ApiTraceState *state = new ApiTraceState(parsedJson);
+ emit foundState(state);
+ msg = tr("State fetched.");
+ } else {
+ msg = QString::fromUtf8(output);
+ }
}
QStringList errorLines = errStr.split('\n');
- QList<RetraceError> errors;
+ QList<ApiTraceError> errors;
QRegExp regexp("(^\\d+): +(\\b\\w+\\b): (.+$)");
foreach(QString line, errorLines) {
if (regexp.indexIn(line) != -1) {
- RetraceError error;
+ ApiTraceError error;
error.callIndex = regexp.cap(1).toInt();
error.type = regexp.cap(2);
error.message = regexp.cap(3);
void RetraceProcess::replayError(QProcess::ProcessError err)
{
+ /*
+ * XXX: this function is likely unnecessary and should be eliminated given
+ * that replayFinished is always called, even on errors.
+ */
+
+#if 0
qDebug()<<"Process error = "<<err;
qDebug()<<"\terr = "<<m_process->readAllStandardError();
qDebug()<<"\tout = "<<m_process->readAllStandardOutput();
+#endif
emit error(
tr("Couldn't execute the replay file '%1'").arg(m_fileName));
}
-Q_DECLARE_METATYPE(QList<RetraceError>);
+Q_DECLARE_METATYPE(QList<ApiTraceError>);
RetraceProcess::RetraceProcess(QObject *parent)
: QObject(parent)
{
m_process = new QProcess(this);
m_jsonParser = new QJson::Parser();
- qRegisterMetaType<QList<RetraceError> >();
+ qRegisterMetaType<QList<ApiTraceError> >();
connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)),
- this, SLOT(replayFinished()));
+ this, SLOT(replayFinished(int, QProcess::ExitStatus)));
connect(m_process, SIGNAL(error(QProcess::ProcessError)),
this, SLOT(replayError(QProcess::ProcessError)));
}
m_fileName = name;
}
+void RetraceProcess::setAPI(trace::API api)
+{
+ m_api = api;
+}
+
bool RetraceProcess::isBenchmarking() const
{
return m_benchmarking;