diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp index fb81819..d89cc75 100644 --- a/src/daemon/Display.cpp +++ b/src/daemon/Display.cpp @@ -336,7 +336,13 @@ namespace DDM { // Exec the desktop process connect(auth, &Auth::userProcessFinished, this, &Display::userProcessFinished); + // FIXME: Someone is triggering VT RELDISP signal during + // fork(), which will cause dead lock on glibc malloc arena + // lock. We have to disable our own VT signal handling + // temporarily... + VirtualTerminal::setVtSignalHandler(nullptr, nullptr); auth->startUserProcess(session.exec(), cookie); + daemonApp->treelandConnector()->setSignalHandler(); // The user process is ongoing, append to active auths // The auth will be delete later in userProcessFinished() diff --git a/src/daemon/TreelandConnector.cpp b/src/daemon/TreelandConnector.cpp index 7414890..5126f48 100644 --- a/src/daemon/TreelandConnector.cpp +++ b/src/daemon/TreelandConnector.cpp @@ -130,7 +130,7 @@ static void onReleaseDisplay() { // TreelandConnector TreelandConnector::TreelandConnector() : QObject(nullptr) { - VirtualTerminal::setVtSignalHandler(onAcquireDisplay, onReleaseDisplay); + setSignalHandler(); } TreelandConnector::~TreelandConnector() { @@ -146,6 +146,10 @@ void TreelandConnector::setPrivateObject(struct treeland_ddm *ddm) { m_ddm = ddm; } +void TreelandConnector::setSignalHandler() { + VirtualTerminal::setVtSignalHandler(onAcquireDisplay, onReleaseDisplay); +} + // Event implementation static void switchToVt([[maybe_unused]] void *data, [[maybe_unused]] struct treeland_ddm *ddm, int32_t vtnr) { diff --git a/src/daemon/TreelandConnector.h b/src/daemon/TreelandConnector.h index 534ca4a..b3c7659 100644 --- a/src/daemon/TreelandConnector.h +++ b/src/daemon/TreelandConnector.h @@ -16,6 +16,7 @@ class TreelandConnector : QObject { ~TreelandConnector(); bool isConnected(); void setPrivateObject(struct treeland_ddm *ddm); + void setSignalHandler(); void connect(const QString socketPath); void switchToGreeter();