mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 22:54:01 +02:00
Main thread deadlock detector for debug mode
This commit is contained in:
parent
d10b7e8402
commit
ff9321e971
4 changed files with 98 additions and 0 deletions
|
@ -413,6 +413,7 @@ PRIVATE
|
||||||
core/crash_report_window.h
|
core/crash_report_window.h
|
||||||
core/crash_reports.cpp
|
core/crash_reports.cpp
|
||||||
core/crash_reports.h
|
core/crash_reports.h
|
||||||
|
core/deadlock_detector.h
|
||||||
core/file_utilities.cpp
|
core/file_utilities.cpp
|
||||||
core/file_utilities.h
|
core/file_utilities.h
|
||||||
core/launcher.cpp
|
core/launcher.cpp
|
||||||
|
|
83
Telegram/SourceFiles/core/deadlock_detector.h
Normal file
83
Telegram/SourceFiles/core/deadlock_detector.h
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
This file is part of Telegram Desktop,
|
||||||
|
the official desktop application for the Telegram messaging service.
|
||||||
|
|
||||||
|
For license and copyright information please follow this link:
|
||||||
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Core::DeadlockDetector {
|
||||||
|
|
||||||
|
class PingPongEvent : public QEvent {
|
||||||
|
public:
|
||||||
|
static auto Type() {
|
||||||
|
static const auto Result = QEvent::Type(QEvent::registerEventType());
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
PingPongEvent(not_null<QObject*> sender)
|
||||||
|
: QEvent(Type())
|
||||||
|
, _sender(sender) {
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] not_null<QObject*> sender() const {
|
||||||
|
return _sender;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
not_null<QObject*> _sender;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Pinger : public QObject {
|
||||||
|
public:
|
||||||
|
Pinger(not_null<QObject*> receiver)
|
||||||
|
: _receiver(receiver)
|
||||||
|
, _abortTimer([] { Unexpected("Deadlock found!"); }) {
|
||||||
|
const auto callback = [=] {
|
||||||
|
QCoreApplication::postEvent(_receiver, new PingPongEvent(this));
|
||||||
|
_abortTimer.callOnce(30000);
|
||||||
|
};
|
||||||
|
_pingTimer.setCallback(callback);
|
||||||
|
_pingTimer.callEach(60000);
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool event(QEvent *e) override {
|
||||||
|
if (e->type() == PingPongEvent::Type()
|
||||||
|
&& static_cast<PingPongEvent*>(e)->sender() == _receiver) {
|
||||||
|
_abortTimer.cancel();
|
||||||
|
}
|
||||||
|
return QObject::event(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
not_null<QObject*> _receiver;
|
||||||
|
base::Timer _pingTimer;
|
||||||
|
base::Timer _abortTimer;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class PingThread : public QThread {
|
||||||
|
public:
|
||||||
|
PingThread(not_null<QObject*> parent)
|
||||||
|
: QThread(parent) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
~PingThread() {
|
||||||
|
quit();
|
||||||
|
wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void run() override {
|
||||||
|
Pinger pinger(parent());
|
||||||
|
QThread::run();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Core::DeadlockDetector
|
|
@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "core/launcher.h"
|
#include "core/launcher.h"
|
||||||
#include "core/local_url_handlers.h"
|
#include "core/local_url_handlers.h"
|
||||||
#include "core/update_checker.h"
|
#include "core/update_checker.h"
|
||||||
|
#include "core/deadlock_detector.h"
|
||||||
#include "base/timer.h"
|
#include "base/timer.h"
|
||||||
#include "base/concurrent_timer.h"
|
#include "base/concurrent_timer.h"
|
||||||
#include "base/invoke_queued.h"
|
#include "base/invoke_queued.h"
|
||||||
|
@ -198,6 +199,13 @@ void Sandbox::launchApplication() {
|
||||||
}
|
}
|
||||||
setupScreenScale();
|
setupScreenScale();
|
||||||
|
|
||||||
|
#ifndef _DEBUG
|
||||||
|
if (Logs::DebugEnabled()) {
|
||||||
|
using DeadlockDetector::PingThread;
|
||||||
|
_deadlockDetector = std::make_unique<PingThread>(this);
|
||||||
|
}
|
||||||
|
#endif // !_DEBUG
|
||||||
|
|
||||||
_application = std::make_unique<Application>();
|
_application = std::make_unique<Application>();
|
||||||
|
|
||||||
// Ideally this should go to constructor.
|
// Ideally this should go to constructor.
|
||||||
|
@ -267,6 +275,10 @@ bool Sandbox::event(QEvent *e) {
|
||||||
return false;
|
return false;
|
||||||
} else if (e->type() == QEvent::Close) {
|
} else if (e->type() == QEvent::Close) {
|
||||||
Quit();
|
Quit();
|
||||||
|
} else if (e->type() == DeadlockDetector::PingPongEvent::Type()) {
|
||||||
|
postEvent(
|
||||||
|
static_cast<DeadlockDetector::PingPongEvent*>(e)->sender(),
|
||||||
|
new DeadlockDetector::PingPongEvent(this));
|
||||||
}
|
}
|
||||||
return QApplication::event(e);
|
return QApplication::event(e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,8 @@ private:
|
||||||
|
|
||||||
rpl::event_stream<> _widgetUpdateRequests;
|
rpl::event_stream<> _widgetUpdateRequests;
|
||||||
|
|
||||||
|
std::unique_ptr<QThread> _deadlockDetector;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
Loading…
Add table
Reference in a new issue