Files
tdesktop/Telegram/SourceFiles/core/deadlock_detector.h
allhaileris afb81b8278
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
init
2026-02-16 15:50:16 +03:00

84 lines
1.6 KiB
C++

/*
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