123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- From adfaa222fdfa6115ea2b320b0bbc2126db9270a5 Mon Sep 17 00:00:00 2001
- From: Fabian Vogt <fabian@ritter-vogt.de>
- Date: Thu, 12 Nov 2020 20:30:55 +0100
- Subject: [PATCH 1/3] Retry starting the display server
- Even if the CanGraphical property of a Seat is true, it's possible that it's
- still too early for X to start, as it might need some driver or device which
- isn't present yet.
- Fixes #1316
- ---
- src/daemon/Seat.cpp | 23 ++++++++++++++++++-----
- src/daemon/Seat.h | 4 +++-
- src/daemon/XorgDisplayServer.cpp | 10 ++++++----
- 3 files changed, 27 insertions(+), 10 deletions(-)
- diff --git a/src/daemon/Seat.cpp b/src/daemon/Seat.cpp
- index eef26da45..838c2221d 100644
- --- a/src/daemon/Seat.cpp
- +++ b/src/daemon/Seat.cpp
- @@ -28,6 +28,7 @@
-
- #include <QDebug>
- #include <QFile>
- +#include <QTimer>
-
- #include <functional>
-
- @@ -52,7 +53,7 @@ namespace SDDM {
- return m_name;
- }
-
- - bool Seat::createDisplay(int terminalId) {
- + void Seat::createDisplay(int terminalId) {
- //reload config if needed
- mainConfig.load();
-
- @@ -84,12 +85,24 @@ namespace SDDM {
- m_displays << display;
-
- // start the display
- - if (!display->start()) {
- - qCritical() << "Could not start Display server on vt" << terminalId;
- - return false;
- + startDisplay(display);
- + }
- +
- + void Seat::startDisplay(Display *display, int tryNr) {
- + if (display->start())
- + return;
- +
- + // It's possible that the system isn't ready yet (driver not loaded,
- + // device not enumerated, ...). It's not possible to tell when that changes,
- + // so try a few times with a delay in between.
- + qWarning() << "Attempt" << tryNr << "starting the Display server on vt" << display->terminalId() << "failed";
- +
- + if(tryNr >= 3) {
- + qCritical() << "Could not start Display server on vt" << display->terminalId();
- + return;
- }
-
- - return true;
- + QTimer::singleShot(2000, display, [=] { startDisplay(display, tryNr + 1); });
- }
-
- void Seat::removeDisplay(Display* display) {
- diff --git a/src/daemon/Seat.h b/src/daemon/Seat.h
- index bf22566b7..f9fe7331f 100644
- --- a/src/daemon/Seat.h
- +++ b/src/daemon/Seat.h
- @@ -35,13 +35,15 @@ namespace SDDM {
- const QString &name() const;
-
- public slots:
- - bool createDisplay(int terminalId = -1);
- + void createDisplay(int terminalId = -1);
- void removeDisplay(SDDM::Display* display);
-
- private slots:
- void displayStopped();
-
- private:
- + void startDisplay(SDDM::Display *display, int tryNr = 1);
- +
- QString m_name;
-
- QVector<Display *> m_displays;
- diff --git a/src/daemon/XorgDisplayServer.cpp b/src/daemon/XorgDisplayServer.cpp
- index e60c02210..5f40fe8c3 100644
- --- a/src/daemon/XorgDisplayServer.cpp
- +++ b/src/daemon/XorgDisplayServer.cpp
- @@ -248,6 +248,12 @@ namespace SDDM {
- }
-
- void XorgDisplayServer::finished() {
- + // clean up
- + if (process) {
- + process->deleteLater();
- + process = nullptr;
- + }
- +
- // check flag
- if (!m_started)
- return;
- @@ -283,10 +289,6 @@ namespace SDDM {
- displayStopScript->deleteLater();
- displayStopScript = nullptr;
-
- - // clean up
- - process->deleteLater();
- - process = nullptr;
- -
- // remove authority file
- QFile::remove(m_authPath);
-
- From d11e1e987b440fa1aaa741719b92472eeee79b17 Mon Sep 17 00:00:00 2001
- From: Fabian Vogt <fabian@ritter-vogt.de>
- Date: Wed, 9 Dec 2020 19:28:41 +0100
- Subject: [PATCH 2/3] Explicitly stop Xorg when starting fails
- When Xorg starts but there is an error, stop it explicitly instead of assuming
- that X exits itself. This avoids a possibly lingering Xorg process in the
- XorgDisplayServer instance. Add a check and warning message if Xorg is
- restarted too early (shouldn't happen).
- ---
- src/daemon/XorgDisplayServer.cpp | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
- diff --git a/src/daemon/XorgDisplayServer.cpp b/src/daemon/XorgDisplayServer.cpp
- index 5f40fe8c3..3a7bee0d8 100644
- --- a/src/daemon/XorgDisplayServer.cpp
- +++ b/src/daemon/XorgDisplayServer.cpp
- @@ -118,6 +118,11 @@ namespace SDDM {
- if (m_started)
- return false;
-
- + if (process) {
- + qCritical() << "Tried to start Xorg before previous instance exited";
- + return false;
- + }
- +
- // create process
- process = new QProcess(this);
-
- @@ -195,6 +200,7 @@ namespace SDDM {
- qCritical("Failed to open pipe to start X Server");
-
- close(pipeFds[0]);
- + stop();
- return false;
- }
- QByteArray displayNumber = readPipe.readLine();
- @@ -203,6 +209,7 @@ namespace SDDM {
- qCritical("Failed to read display number from pipe");
-
- close(pipeFds[0]);
- + stop();
- return false;
- }
- displayNumber.prepend(QByteArray(":"));
- @@ -219,6 +226,7 @@ namespace SDDM {
- if(m_display != QStringLiteral(":0")) {
- if(!addCookie(m_authPath)) {
- qCritical() << "Failed to write xauth file";
- + stop();
- return false;
- }
- }
- @@ -232,8 +240,7 @@ namespace SDDM {
- }
-
- void XorgDisplayServer::stop() {
- - // check flag
- - if (!m_started)
- + if (!process)
- return;
-
- // log message
- From 78048b22e3988d3daec9c271883fa114abc114dc Mon Sep 17 00:00:00 2001
- From: Fabian Vogt <fabian@ritter-vogt.de>
- Date: Wed, 9 Dec 2020 19:33:08 +0100
- Subject: [PATCH 3/3] Emit XorgDisplayServer::started only when the auth file
- is ready
- ---
- src/daemon/XorgDisplayServer.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
- diff --git a/src/daemon/XorgDisplayServer.cpp b/src/daemon/XorgDisplayServer.cpp
- index 3a7bee0d8..331adcda7 100644
- --- a/src/daemon/XorgDisplayServer.cpp
- +++ b/src/daemon/XorgDisplayServer.cpp
- @@ -219,8 +219,6 @@ namespace SDDM {
- // close our pipe
- close(pipeFds[0]);
-
- - emit started();
- -
- // The file is also used by the greeter, which does care about the
- // display number. Write the proper entry, if it's different.
- if(m_display != QStringLiteral(":0")) {
- @@ -232,6 +230,8 @@ namespace SDDM {
- }
- changeOwner(m_authPath);
-
- + emit started();
- +
- // set flag
- m_started = true;
-
|