Merge lp:~alan-griffiths/qtmir/new-migrate-to-mir-Server-API into lp:qtmir

Proposed by Alan Griffiths
Status: Merged
Approved by: Gerry Boland
Approved revision: 290
Merged at revision: 291
Proposed branch: lp:~alan-griffiths/qtmir/new-migrate-to-mir-Server-API
Merge into: lp:qtmir
Diff against target: 489 lines (+128/-139)
10 files modified
src/platforms/mirserver/display.cpp (+1/-1)
src/platforms/mirserver/display.h (+3/-3)
src/platforms/mirserver/miropenglcontext.cpp (+1/-1)
src/platforms/mirserver/miropenglcontext.h (+3/-3)
src/platforms/mirserver/mirserverconfiguration.cpp (+40/-77)
src/platforms/mirserver/mirserverconfiguration.h (+4/-14)
src/platforms/mirserver/mirserverintegration.cpp (+0/-12)
src/platforms/mirserver/qmirserver.cpp (+34/-0)
src/platforms/mirserver/qmirserver.h (+17/-8)
tests/modules/common/qtmir_test.h (+25/-20)
To merge this branch: bzr merge lp:~alan-griffiths/qtmir/new-migrate-to-mir-Server-API
Reviewer Review Type Date Requested Status
Gerry Boland (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+243177@code.launchpad.net

Commit message

Migration of qtmir from the legacy Mir API

Description of the change

Migration of qtmir from the legacy Mir API

This is somewhat minimalist - there's possibilities of code cleanup and improved naming. But it moves the dependencies over to the mir::Server based APIs and seems to run OK on krillin/15.04(r39).

I'll look at the cleanup work next week.

To post a comment you must log in.
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

 * Are there any related MPs required for this MP to build/function as expected? Please list.
N
 * Did you perform an exploratory manual test run of your code change and any related functionality?
Y
 * If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
N/A

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
289. By Alan Griffiths

Fix initialization order in tests

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Gerry Boland (gerboland) wrote :

I approve of the code-changes, but testing on a desktop machine, it crashes on startup: http://pastebin.ubuntu.com/9332816/

review: Needs Fixing
Revision history for this message
Gerry Boland (gerboland) wrote :

For more info, I just checked out this branch on my vivid machine, built it, installed it, and tried to log into a unity8 desktop session. The backtrace was what I managed to get manually, may not be actual issue.

290. By Alan Griffiths

Fix startup race condition

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Also tested on with desktop U8

Revision history for this message
Gerry Boland (gerboland) wrote :

Yep, working nicely now, thanks

 * Did you perform an exploratory manual test run of the code change and any related functionality?
Y
 * Did CI run pass? If not, please explain why.
Y

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/platforms/mirserver/display.cpp'
--- src/platforms/mirserver/display.cpp 2014-10-16 18:27:04 +0000
+++ src/platforms/mirserver/display.cpp 2014-12-02 12:30:45 +0000
@@ -27,7 +27,7 @@
2727
28// TODO: Listen for display changes and update the list accordingly28// TODO: Listen for display changes and update the list accordingly
2929
30Display::Display(const QSharedPointer<mir::DefaultServerConfiguration> &config, QObject *parent)30Display::Display(const QSharedPointer<mir::Server> &config, QObject *parent)
31 : QObject(parent)31 : QObject(parent)
32 , m_mirConfig(config)32 , m_mirConfig(config)
33{33{
3434
=== modified file 'src/platforms/mirserver/display.h'
--- src/platforms/mirserver/display.h 2014-10-10 18:52:44 +0000
+++ src/platforms/mirserver/display.h 2014-12-02 12:30:45 +0000
@@ -23,20 +23,20 @@
23#include <qpa/qplatformscreen.h>23#include <qpa/qplatformscreen.h>
2424
25#include "mir/graphics/display.h"25#include "mir/graphics/display.h"
26#include "mir/default_server_configuration.h"26#include "mir/server.h"
2727
28class Display : public QObject28class Display : public QObject
29{29{
30 Q_OBJECT30 Q_OBJECT
31public:31public:
32 Display(const QSharedPointer<mir::DefaultServerConfiguration> &config, QObject *parent = 0);32 Display(const QSharedPointer<mir::Server> &config, QObject *parent = 0);
33 ~Display();33 ~Display();
3434
35 QList<QPlatformScreen *> screens() const { return m_screens; }35 QList<QPlatformScreen *> screens() const { return m_screens; }
3636
37private:37private:
38 QList<QPlatformScreen *> m_screens;38 QList<QPlatformScreen *> m_screens;
39 const QSharedPointer<mir::DefaultServerConfiguration> m_mirConfig;39 const QSharedPointer<mir::Server> m_mirConfig;
40};40};
4141
42#endif // DISPLAY_H42#endif // DISPLAY_H
4343
=== modified file 'src/platforms/mirserver/miropenglcontext.cpp'
--- src/platforms/mirserver/miropenglcontext.cpp 2014-07-15 11:30:11 +0000
+++ src/platforms/mirserver/miropenglcontext.cpp 2014-12-02 12:30:45 +0000
@@ -35,7 +35,7 @@
35// The Mir "Display" generates a shared GL context for all DisplayBuffers35// The Mir "Display" generates a shared GL context for all DisplayBuffers
36// (i.e. individual display output buffers) to use as a common base context.36// (i.e. individual display output buffers) to use as a common base context.
3737
38MirOpenGLContext::MirOpenGLContext(const QSharedPointer<mir::DefaultServerConfiguration> &config, const QSurfaceFormat &format)38MirOpenGLContext::MirOpenGLContext(const QSharedPointer<mir::Server> &config, const QSurfaceFormat &format)
39 : m_mirConfig(config)39 : m_mirConfig(config)
40#if GL_DEBUG40#if GL_DEBUG
41 , m_logger(new QOpenGLDebugLogger(this))41 , m_logger(new QOpenGLDebugLogger(this))
4242
=== modified file 'src/platforms/mirserver/miropenglcontext.h'
--- src/platforms/mirserver/miropenglcontext.h 2014-05-16 16:45:00 +0000
+++ src/platforms/mirserver/miropenglcontext.h 2014-12-02 12:30:45 +0000
@@ -27,13 +27,13 @@
27#include <QOpenGLDebugLogger>27#include <QOpenGLDebugLogger>
28#endif28#endif
2929
30#include <mir/default_server_configuration.h>30#include <mir/server.h>
3131
32class MirOpenGLContext : public QObject, public QPlatformOpenGLContext32class MirOpenGLContext : public QObject, public QPlatformOpenGLContext
33{33{
34 Q_OBJECT34 Q_OBJECT
35public:35public:
36 MirOpenGLContext(const QSharedPointer<mir::DefaultServerConfiguration> &, const QSurfaceFormat &);36 MirOpenGLContext(const QSharedPointer<mir::Server> &, const QSurfaceFormat &);
37 ~MirOpenGLContext() = default;37 ~MirOpenGLContext() = default;
3838
39 QSurfaceFormat format() const override;39 QSurfaceFormat format() const override;
@@ -52,7 +52,7 @@
52#endif52#endif
5353
54private:54private:
55 const QSharedPointer<mir::DefaultServerConfiguration> m_mirConfig;55 const QSharedPointer<mir::Server> m_mirConfig;
56 QSurfaceFormat m_format;56 QSurfaceFormat m_format;
57#if GL_DEBUG57#if GL_DEBUG
58 QOpenGLDebugLogger *m_logger;58 QOpenGLDebugLogger *m_logger;
5959
=== modified file 'src/platforms/mirserver/mirserverconfiguration.cpp'
--- src/platforms/mirserver/mirserverconfiguration.cpp 2014-09-17 12:48:54 +0000
+++ src/platforms/mirserver/mirserverconfiguration.cpp 2014-12-02 12:30:45 +0000
@@ -14,6 +14,8 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */15 */
1616
17#include <QCoreApplication>
18
17#include "mirserverconfiguration.h"19#include "mirserverconfiguration.h"
1820
19// local21// local
@@ -50,115 +52,76 @@
5052
51MirServerConfiguration::MirServerConfiguration(int argc, char const* argv[], QObject* parent)53MirServerConfiguration::MirServerConfiguration(int argc, char const* argv[], QObject* parent)
52 : QObject(parent)54 : QObject(parent)
53 , DefaultServerConfiguration(std::make_shared<mo::DefaultConfiguration>(argc, argv, &ignore_unparsed_arguments))
54{55{
55 qCDebug(QTMIR_MIR_MESSAGES) << "MirServerConfiguration created";56 set_command_line_handler(&ignore_unparsed_arguments);
56}57 set_command_line(argc, argv);
5758
58std::shared_ptr<ms::PlacementStrategy>59 override_the_placement_strategy([this]
59MirServerConfiguration::the_placement_strategy()
60{
61 return shell_placement_strategy(
62 [this]
63 {60 {
64 return std::make_shared<MirPlacementStrategy>(the_shell_display_layout());61 return std::make_shared<MirPlacementStrategy>(the_shell_display_layout());
65 });62 });
66}
6763
68std::shared_ptr<ms::SessionListener>64 override_the_session_listener([]
69MirServerConfiguration::the_session_listener()
70{
71 return session_listener(
72 [this]
73 {65 {
74 return std::make_shared<SessionListener>();66 return std::make_shared<SessionListener>();
75 });67 });
76}
7768
78std::shared_ptr<ms::PromptSessionListener>69 override_the_prompt_session_listener([]
79MirServerConfiguration::the_prompt_session_listener()
80{
81 return prompt_session_listener(
82 [this]
83 {70 {
84 return std::make_shared<PromptSessionListener>();71 return std::make_shared<PromptSessionListener>();
85 });72 });
86}
8773
88std::shared_ptr<ms::SurfaceConfigurator>74 override_the_surface_configurator([]
89MirServerConfiguration::the_surface_configurator()
90{
91 return surface_configurator(
92 [this]()
93 {75 {
94 return std::make_shared<SurfaceConfigurator>();76 return std::make_shared<SurfaceConfigurator>();
95 });77 });
96}78
9779 override_the_session_authorizer([]
98std::shared_ptr<mir::frontend::SessionAuthorizer>80 {
99MirServerConfiguration::the_session_authorizer()81 return std::make_shared<SessionAuthorizer>();
100{82 });
101 return session_authorizer(83
102 []84 override_the_compositor([]
103 {
104 return std::make_shared<SessionAuthorizer>();
105 });
106}
107
108std::shared_ptr<mir::compositor::Compositor>
109MirServerConfiguration::the_compositor()
110{
111 return compositor(
112 [this]()
113 {85 {
114 return std::make_shared<QtCompositor>();86 return std::make_shared<QtCompositor>();
115 });87 });
116}88
11789 override_the_input_dispatcher([]
118std::shared_ptr<mir::input::InputDispatcher>90 {
119MirServerConfiguration::the_input_dispatcher()91 return std::make_shared<QtEventFeeder>();
120{92 });
121 return input_dispatcher(93
122 [this]()94 override_the_gl_config([]
123 {95 {
124 return std::make_shared<QtEventFeeder>();
125 });
126}
127
128std::shared_ptr<mir::graphics::GLConfig>
129MirServerConfiguration::the_gl_config()
130{
131 return gl_config(
132 [this]()
133 {
134#ifdef QTMIR_USE_OPENGL96#ifdef QTMIR_USE_OPENGL
135 // Should desktop-GL be desired, need to bind that API before a context is created97 // Should desktop-GL be desired, need to bind that API before a context is created
136 eglBindAPI(EGL_OPENGL_API);98 eglBindAPI(EGL_OPENGL_API);
137#endif99#endif
138 return std::make_shared<MirGLConfig>();100 return std::make_shared<MirGLConfig>();
139 });101 });
140}
141102
142std::shared_ptr<mir::ServerStatusListener>103 override_the_server_status_listener([]
143MirServerConfiguration::the_server_status_listener()
144{
145 return server_status_listener(
146 []()
147 {104 {
148 return std::make_shared<MirServerStatusListener>();105 return std::make_shared<MirServerStatusListener>();
149 });106 });
150}
151107
152std::shared_ptr<mir::shell::FocusSetter>108 override_the_shell_focus_setter([]
153MirServerConfiguration::the_shell_focus_setter()
154{
155 return shell_focus_setter(
156 [this]
157 {109 {
158 return std::make_shared<FocusSetter>();110 return std::make_shared<FocusSetter>();
159 });111 });
112
113 set_terminator([&](int)
114 {
115 qDebug() << "Signal caught by Mir, stopping Mir server..";
116 QCoreApplication::quit();
117 });
118
119 apply_settings();
120
121 qCDebug(QTMIR_MIR_MESSAGES) << "MirServerConfiguration created";
160}122}
161123
124
162/************************************ Shell side ************************************/125/************************************ Shell side ************************************/
163126
164//127//
165128
=== modified file 'src/platforms/mirserver/mirserverconfiguration.h'
--- src/platforms/mirserver/mirserverconfiguration.h 2014-09-17 12:34:40 +0000
+++ src/platforms/mirserver/mirserverconfiguration.h 2014-12-02 12:30:45 +0000
@@ -18,7 +18,7 @@
18#define MIRSERVERCONFIGURATION_H18#define MIRSERVERCONFIGURATION_H
1919
20#include <QObject>20#include <QObject>
21#include <mir/default_server_configuration.h>21#include <mir/server.h>
2222
23class QtEventFeeder;23class QtEventFeeder;
24class SessionListener;24class SessionListener;
@@ -26,7 +26,9 @@
26class SurfaceConfigurator;26class SurfaceConfigurator;
27class PromptSessionListener;27class PromptSessionListener;
2828
29class MirServerConfiguration : public QObject, public mir::DefaultServerConfiguration29// We use virtual inheritance of mir::Server to facilitate derived classes (e.g. testing)
30// calling initialization functions before MirServerConfiguration is constructed.
31class MirServerConfiguration : public QObject, public virtual mir::Server
30{32{
31 Q_OBJECT33 Q_OBJECT
3234
@@ -39,18 +41,6 @@
39 MirServerConfiguration(int argc, char const* argv[], QObject* parent = 0);41 MirServerConfiguration(int argc, char const* argv[], QObject* parent = 0);
40 ~MirServerConfiguration() = default;42 ~MirServerConfiguration() = default;
4143
42 /* mir specific */
43 std::shared_ptr<mir::compositor::Compositor> the_compositor() override;
44 std::shared_ptr<mir::scene::PlacementStrategy> the_placement_strategy() override;
45 std::shared_ptr<mir::scene::SessionListener> the_session_listener() override;
46 std::shared_ptr<mir::scene::PromptSessionListener> the_prompt_session_listener() override;
47 std::shared_ptr<mir::scene::SurfaceConfigurator> the_surface_configurator() override;
48 std::shared_ptr<mir::frontend::SessionAuthorizer> the_session_authorizer() override;
49 std::shared_ptr<mir::input::InputDispatcher> the_input_dispatcher() override;
50 std::shared_ptr<mir::graphics::GLConfig> the_gl_config() override;
51 std::shared_ptr<mir::ServerStatusListener> the_server_status_listener() override;
52 std::shared_ptr<mir::shell::FocusSetter> the_shell_focus_setter() override;
53
54 /* qt specific */44 /* qt specific */
55 // getters45 // getters
56 SessionAuthorizer *sessionAuthorizer();46 SessionAuthorizer *sessionAuthorizer();
5747
=== modified file 'src/platforms/mirserver/mirserverintegration.cpp'
--- src/platforms/mirserver/mirserverintegration.cpp 2014-10-01 18:42:26 +0000
+++ src/platforms/mirserver/mirserverintegration.cpp 2014-12-02 12:30:45 +0000
@@ -42,7 +42,6 @@
42// Mir42// Mir
43#include <mir/graphics/display.h>43#include <mir/graphics/display.h>
44#include <mir/graphics/display_buffer.h>44#include <mir/graphics/display_buffer.h>
45#include <mir/main_loop.h>
4645
47// std46// std
48#include <csignal>47#include <csignal>
@@ -179,17 +178,6 @@
179 for (QPlatformScreen *screen : m_display->screens())178 for (QPlatformScreen *screen : m_display->screens())
180 screenAdded(screen);179 screenAdded(screen);
181180
182 // install signal handler into the Mir event loop
183 auto mainLoop = m_mirConfig->the_main_loop();
184
185 mainLoop->register_signal_handler(
186 {SIGINT, SIGTERM},
187 [&](int)
188 {
189 qDebug() << "Signal caught by Mir, stopping Mir server..";
190 QCoreApplication::quit();
191 });
192
193 m_clipboard->setupDBusService();181 m_clipboard->setupDBusService();
194}182}
195183
196184
=== modified file 'src/platforms/mirserver/qmirserver.cpp'
--- src/platforms/mirserver/qmirserver.cpp 2014-05-16 16:45:00 +0000
+++ src/platforms/mirserver/qmirserver.cpp 2014-12-02 12:30:45 +0000
@@ -19,10 +19,38 @@
19#include <QCoreApplication>19#include <QCoreApplication>
20#include <QDebug>20#include <QDebug>
2121
22#include <mir/main_loop.h>
23
22// local24// local
23#include "qmirserver.h"25#include "qmirserver.h"
2426
2527
28void MirServerWorker::run()
29{
30 auto const main_loop = config->the_main_loop();
31 // By enqueuing the notification code in the main loop, we are
32 // ensuring that the server has really and fully started before
33 // leaving wait_for_startup().
34 main_loop->enqueue(
35 this,
36 [&]
37 {
38 std::lock_guard<std::mutex> lock(mutex);
39 mir_running = true;
40 started_cv.notify_one();
41 });
42
43 config->run();
44 Q_EMIT stopped();
45}
46
47bool MirServerWorker::wait_for_mir_startup()
48{
49 std::unique_lock<decltype(mutex)> lock(mutex);
50 started_cv.wait_for(lock, std::chrono::seconds{10}, [&]{ return mir_running; });
51 return mir_running;
52}
53
26QMirServer::QMirServer(const QSharedPointer<MirServerConfiguration> &config, QObject *parent)54QMirServer::QMirServer(const QSharedPointer<MirServerConfiguration> &config, QObject *parent)
27 : QObject(parent)55 : QObject(parent)
28 , m_mirServer(new MirServerWorker(config))56 , m_mirServer(new MirServerWorker(config))
@@ -37,6 +65,12 @@
3765
38 m_mirThread.start(QThread::TimeCriticalPriority);66 m_mirThread.start(QThread::TimeCriticalPriority);
39 Q_EMIT run();67 Q_EMIT run();
68
69 if (!m_mirServer->wait_for_mir_startup())
70 {
71 qCritical() << "ERROR: QMirServer - Mir failed to start";
72 QCoreApplication::quit();
73 }
40}74}
4175
42QMirServer::~QMirServer()76QMirServer::~QMirServer()
4377
=== modified file 'src/platforms/mirserver/qmirserver.h'
--- src/platforms/mirserver/qmirserver.h 2014-05-16 16:45:00 +0000
+++ src/platforms/mirserver/qmirserver.h 2014-12-02 12:30:45 +0000
@@ -22,28 +22,37 @@
22#include <QThread>22#include <QThread>
23#include <QSharedPointer>23#include <QSharedPointer>
2424
25// Mir
26#include <mir/display_server.h>
27
28// local25// local
29#include "mirserverconfiguration.h"26#include "mirserverconfiguration.h"
3027
31// Wrap mir::DisplayServer with QObject, so it can be controlled via QThread28#include <condition_variable>
32class MirServerWorker : public QObject, public mir::DisplayServer29#include <mutex>
30
31// Wrap mir::Server with QObject, so it can be controlled via QThread
32class MirServerWorker : public QObject
33{33{
34 Q_OBJECT34 Q_OBJECT
3535
36public:36public:
37 MirServerWorker(const QSharedPointer<MirServerConfiguration> &config)37 MirServerWorker(const QSharedPointer<MirServerConfiguration> &config)
38 : mir::DisplayServer(*config.data())38 : config(config)
39 {}39 {}
4040
41 bool wait_for_mir_startup();
42
41Q_SIGNALS:43Q_SIGNALS:
42 void stopped();44 void stopped();
4345
44public Q_SLOTS:46public Q_SLOTS:
45 void run() { mir::DisplayServer::run(); Q_EMIT stopped(); }47 void run();
46 void stop() { mir::DisplayServer::stop(); }48 void stop() { config->stop(); }
49
50private:
51 std::mutex mutex;
52 std::condition_variable started_cv;
53 bool mir_running{false};
54
55 const QSharedPointer<MirServerConfiguration> config;
47};56};
4857
4958
5059
=== modified file 'tests/modules/common/qtmir_test.h'
--- tests/modules/common/qtmir_test.h 2014-10-06 21:23:39 +0000
+++ tests/modules/common/qtmir_test.h 2014-12-02 12:30:45 +0000
@@ -41,31 +41,36 @@
4141
42namespace qtmir {42namespace qtmir {
4343
44class FakeMirServerConfiguration: public MirServerConfiguration44// Initialization of mir::Server needed for by tests
45class TestMirServerInit : virtual mir::Server
45{46{
47public:
48 TestMirServerInit()
49 {
50 override_the_prompt_session_manager(
51 [this]{ return the_mock_prompt_session_manager(); });
52 }
53
54 std::shared_ptr<mir::scene::MockPromptSessionManager> the_mock_prompt_session_manager()
55 {
56 return mock_prompt_session_manager;
57 }
58
59private:
46 typedef testing::NiceMock<mir::scene::MockPromptSessionManager> StubPromptSessionManager;60 typedef testing::NiceMock<mir::scene::MockPromptSessionManager> StubPromptSessionManager;
61 std::shared_ptr<StubPromptSessionManager> const mock_prompt_session_manager
62 {std::make_shared<StubPromptSessionManager>()};
63};
64
65class FakeMirServerConfiguration: private TestMirServerInit, public MirServerConfiguration
66{
47public:67public:
48 FakeMirServerConfiguration()68 FakeMirServerConfiguration()
49 : MirServerConfiguration(0, nullptr)69 : MirServerConfiguration(0, nullptr)
50 , mock_prompt_session_manager(std::make_shared<StubPromptSessionManager>())70 {
51 {71 }
52 }72
5373 using TestMirServerInit::the_mock_prompt_session_manager;
54 std::shared_ptr<ms::PromptSessionManager> the_prompt_session_manager() override
55 {
56 return prompt_session_manager([this]()
57 ->std::shared_ptr<ms::PromptSessionManager>
58 {
59 return the_mock_prompt_session_manager();
60 });
61 }
62
63 std::shared_ptr<StubPromptSessionManager> the_mock_prompt_session_manager()
64 {
65 return mock_prompt_session_manager;
66 }
67
68 std::shared_ptr<StubPromptSessionManager> mock_prompt_session_manager;
69};74};
7075
71} // namespace qtmir76} // namespace qtmir

Subscribers

People subscribed via source and target branches