blob: 8074fa1658a2e16ea3fa717226979caccffe02a2 [file] [log] [blame]
Zack Rusinca164112011-04-11 02:23:09 -04001#include "traceprocess.h"
2
3#include <QDebug>
4#include <QDir>
5#include <QFile>
6#include <QFileInfo>
7
8static QString
9findPreloader()
10{
11 QString libPath = QString::fromLatin1("%1/libglxtrace.so")
12 .arg(BUILD_DIR);
13
14 QFileInfo fi(libPath);
15 if (fi.exists())
16 return libPath;
17
18 libPath = QString::fromLatin1("/usr/local/lib/libglxtrace.so");
19 fi = QFileInfo(libPath);
20 if (fi.exists())
21 return libPath;
22
23 libPath = QString::fromLatin1("/usr/lib/libglxtrace.so");
24 fi = QFileInfo(libPath);
25 if (fi.exists())
26 return libPath;
27
28 return QString();
29}
30
31TraceProcess::TraceProcess(QObject *parent)
32 : QObject(parent),
33 m_canTrace(true)
34{
35 m_process = new QProcess(this);
36
37 connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)),
38 this, SLOT(traceFinished()));
39 connect(m_process, SIGNAL(error(QProcess::ProcessError)),
40 this, SLOT(traceError(QProcess::ProcessError)));
41
42#ifdef Q_OS_WIN
43 qWarning()<<"Windows tracing isn't supported right now!";
44 m_canTrace = false;
45#else
46 QString var = QLatin1String("LD_PRELOAD");
47 QString libPath = findPreloader();
48 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
49
50 if (libPath.isEmpty()) {
51 m_canTrace = false;
52 }
53
54 env.insert("LD_PRELOAD", libPath);
55 qputenv("LD_PRELOAD", env.value("LD_PRELOAD").toLatin1());
56
57 m_process->setProcessEnvironment(env);
58#endif
59}
60
61TraceProcess::~TraceProcess()
62{
63}
64
65void TraceProcess::setExecutablePath(const QString &str)
66{
67 m_execPath = str;
68
69 QFileInfo fi(m_execPath);
70
71 m_process->setWorkingDirectory(fi.absolutePath());
72
73 QString format = QString::fromLatin1("%1%2%3.trace");
74
75 m_tracePath = format
76 .arg(fi.absolutePath())
77 .arg(QDir::separator())
78 .arg(fi.baseName());
79
80 int i = 1;
81 while (QFile::exists(m_tracePath)) {
82 QString format = QString::fromLatin1("%1%2%3.%4.trace");
83 m_tracePath = format
84 .arg(fi.absolutePath())
85 .arg(QDir::separator())
86 .arg(fi.baseName())
87 .arg(i++);
88 }
89}
90
91QString TraceProcess::executablePath() const
92{
93 return m_execPath;
94}
95
96void TraceProcess::setArguments(const QStringList &args)
97{
98 m_args = args;
99}
100
101QStringList TraceProcess::arguments() const
102{
103 return m_args;
104}
105
106void TraceProcess::traceFinished()
107{
108#if 0
109 qDebug()<<"trace finished on " << m_tracePath;
110 qDebug()<<"\terr = "<<m_process->readAllStandardError();
111 qDebug()<<"\tout = "<<m_process->readAllStandardOutput();
112#endif
113 emit tracedFile(m_tracePath);
114}
115
116void TraceProcess::traceError(QProcess::ProcessError err)
117{
118#if 1
119 qDebug()<<"trace error = "<<m_tracePath;
120 qDebug()<<"\terr = "<<m_process->readAllStandardError();
121 qDebug()<<"\tout = "<<m_process->readAllStandardOutput();
122#endif
123 emit error(m_process->readAllStandardError());
124}
125
126
127void TraceProcess::start()
128{
129 m_process->start(m_execPath, m_args);
130}
131
132bool TraceProcess::canTrace() const
133{
134 return m_canTrace;
135}
136
137#include "traceprocess.moc"