13#include <QDBusConnection>
25FTraceLogger::FTraceLogger(QObject *parent)
28 if (qEnvironmentVariableIsSet(
"KWIN_PERF_FTRACE")) {
31 QDBusConnection::sessionBus().registerObject(QStringLiteral(
"/FTrace"),
this, QDBusConnection::ExportScriptableContents);
35bool FTraceLogger::isEnabled()
const
37 return m_file.isOpen();
40void FTraceLogger::setEnabled(
bool enabled)
42 QMutexLocker lock(&m_mutex);
43 if (enabled == isEnabled()) {
52 Q_EMIT enabledChanged();
55bool FTraceLogger::open()
57 const QString path = filePath();
62 m_file.setFileName(path);
63 if (!m_file.open(QIODevice::WriteOnly)) {
64 qWarning() <<
"No access to trace marker file at:" << path;
69QString FTraceLogger::filePath()
71 if (qEnvironmentVariableIsSet(
"KWIN_PERF_FTRACE_FILE")) {
72 return qgetenv(
"KWIN_PERF_FTRACE_FILE");
75 QFile mountsFile(
"/proc/mounts");
76 if (!mountsFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
77 qWarning() <<
"No access to mounts file. Can not determine trace marker file location.";
81 auto lineInfo = [](
const QString &line) {
82 const int start = line.indexOf(
' ') + 1;
83 const int end = line.indexOf(
' ', start);
84 const QString dirPath(line.mid(start, end - start));
85 if (dirPath.isEmpty() || !QFileInfo::exists(dirPath)) {
88 return QFileInfo(QDir(dirPath), QStringLiteral(
"trace_marker"));
90 QFileInfo markerFileInfo;
91 QTextStream mountsIn(&mountsFile);
92 QString mountsLine = mountsIn.readLine();
94 while (!mountsLine.isNull()) {
95 if (mountsLine.startsWith(
"tracefs")) {
96 const auto info = lineInfo(mountsLine);
98 markerFileInfo = info;
102 if (mountsLine.startsWith(
"debugfs")) {
103 markerFileInfo = lineInfo(mountsLine);
105 mountsLine = mountsIn.readLine();
108 if (!markerFileInfo.exists()) {
109 qWarning() <<
"Could not determine trace marker file location from mounts.";
113 return markerFileInfo.absoluteFilePath();
116FTraceDuration::~FTraceDuration()
118 FTraceLogger::self()->trace(m_message,
" end_ctx=", m_context);
123#include "moc_ftrace.cpp"
#define KWIN_SINGLETON_FACTORY(ClassName)