Mir

Merge lp:~vanvugt/mir/fix-StaleFrames-test-race into lp:mir

Proposed by Daniel van Vugt
Status: Superseded
Proposed branch: lp:~vanvugt/mir/fix-StaleFrames-test-race
Merge into: lp:mir
Diff against target: 211 lines (+117/-3)
1 file modified
tests/integration-tests/test_stale_frames.cpp (+117/-3)
To merge this branch: bzr merge lp:~vanvugt/mir/fix-StaleFrames-test-race
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Needs Fixing
Mir development team Pending
Review via email: mp+313751@code.launchpad.net

Commit message

Fix a race in the StaleFrames integration tests and expand the tests
to cover both swap intervals (since zero exploits the problem most
easily).

To post a comment you must log in.
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3902
https://mir-jenkins.ubuntu.com/job/mir-ci/2479/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/3233
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3300
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3292
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3292
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3292
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3262
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3262/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3262
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3262/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3262
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3262/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3262
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3262/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3262
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3262/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3262
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3262/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2479/rebuild

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3903
https://mir-jenkins.ubuntu.com/job/mir-ci/2481/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3235/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3302
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3294
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3294
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3294
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3264
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3264/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3264
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3264/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3264
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3264/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3264/console
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3264/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3264
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3264/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3264
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3264/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2481/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3904
https://mir-jenkins.ubuntu.com/job/mir-ci/2482/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3236/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3303
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3295
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3295
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3295
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3265/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3265
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3265/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3265
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3265/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3265
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3265/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3265
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3265/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3265/console

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2482/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3905
https://mir-jenkins.ubuntu.com/job/mir-ci/2483/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/3237
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3304
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3296
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3296
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3296
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3266
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3266/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3266
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3266/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3266
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3266/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3266
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3266/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3266
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3266/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3266
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3266/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2483/rebuild

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3906
https://mir-jenkins.ubuntu.com/job/mir-ci/2574/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/3354
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3421
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3413
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3413
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3413
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3383
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3383/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3383
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3383/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3383
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3383/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3383
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3383/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3383
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3383/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3383
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3383/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2574/rebuild

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3907
https://mir-jenkins.ubuntu.com/job/mir-ci/2575/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/3355/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/3422
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/3414
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial+overlay/3414
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=yakkety/3414
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3384
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=yakkety/3384/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3384
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial+overlay/3384/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=yakkety/3384/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3384
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/3384/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3384
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/3384/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3384
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial+overlay/3384/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/2575/rebuild

review: Needs Fixing (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'tests/integration-tests/test_stale_frames.cpp'
--- tests/integration-tests/test_stale_frames.cpp 2017-01-09 06:48:47 +0000
+++ tests/integration-tests/test_stale_frames.cpp 2017-01-11 11:51:00 +0000
@@ -20,6 +20,9 @@
20#include "mir_toolkit/debug/surface.h"20#include "mir_toolkit/debug/surface.h"
2121
22#include "mir/compositor/compositor.h"22#include "mir/compositor/compositor.h"
23#include "mir/scene/surface.h"
24#include "mir/scene/surface_factory.h"
25#include "mir/scene/null_surface_observer.h"
23#include "mir/renderer/renderer_factory.h"26#include "mir/renderer/renderer_factory.h"
24#include "mir/graphics/renderable.h"27#include "mir/graphics/renderable.h"
25#include "mir/graphics/buffer.h"28#include "mir/graphics/buffer.h"
@@ -36,6 +39,7 @@
36#include <mutex>39#include <mutex>
37#include <condition_variable>40#include <condition_variable>
3841
42using namespace std::chrono_literals;
39namespace mtf = mir_test_framework;43namespace mtf = mir_test_framework;
40namespace mtd = mir::test::doubles;44namespace mtd = mir::test::doubles;
41namespace mc = mir::compositor;45namespace mc = mir::compositor;
@@ -114,8 +118,66 @@
114 StubRenderer* renderer_ = nullptr;118 StubRenderer* renderer_ = nullptr;
115};119};
116120
121class PostObserver : public mir::scene::NullSurfaceObserver
122{
123public:
124 PostObserver(std::function<void(int)> cb) : cb{cb}
125 {
126 }
127
128 void frame_posted(int count, geom::Size const&) override
129 {
130 cb(count);
131 }
132
133private:
134 std::function<void(int)> const cb;
135};
136
137class PublicSurfaceFactory : public mir::scene::SurfaceFactory
138{
139public:
140 using Surface = mir::scene::Surface;
141
142 PublicSurfaceFactory(std::shared_ptr<mir::scene::SurfaceFactory> const& real) : real_surface_factory{real} {}
143
144 std::shared_ptr<Surface> create_surface(
145 std::list<mir::scene::StreamInfo> const& streams,
146 mir::scene::SurfaceCreationParameters const& params) override
147 {
148 latest_surface = real_surface_factory->create_surface(streams, params);
149 return latest_surface;
150 }
151
152 std::shared_ptr<Surface> const latest() const
153 {
154 return latest_surface;
155 }
156
157 void forget_latest()
158 {
159 latest_surface.reset();
160 }
161
162private:
163 std::shared_ptr<mir::scene::SurfaceFactory> const real_surface_factory;
164 std::shared_ptr<Surface> latest_surface;
165};
166
117struct StubServerConfig : mtf::StubbedServerConfiguration167struct StubServerConfig : mtf::StubbedServerConfiguration
118{168{
169 std::shared_ptr<PublicSurfaceFactory> the_public_surface_factory()
170 {
171 return public_surface_factory(
172 [this]{ return std::make_shared<PublicSurfaceFactory>(
173 mtf::StubbedServerConfiguration::the_surface_factory()); });
174 }
175
176 std::shared_ptr<mir::scene::SurfaceFactory> the_surface_factory() override
177 {
178 return the_public_surface_factory();
179 }
180
119 std::shared_ptr<StubRendererFactory> the_stub_renderer_factory()181 std::shared_ptr<StubRendererFactory> the_stub_renderer_factory()
120 {182 {
121 return stub_renderer_factory(183 return stub_renderer_factory(
@@ -128,17 +190,30 @@
128 }190 }
129191
130 mir::CachedPtr<StubRendererFactory> stub_renderer_factory;192 mir::CachedPtr<StubRendererFactory> stub_renderer_factory;
193 mir::CachedPtr<PublicSurfaceFactory> public_surface_factory;
131};194};
132195
133using BasicFixture = mtf::BasicClientServerFixture<StubServerConfig>;196using BasicFixture = mtf::BasicClientServerFixture<StubServerConfig>;
134197
135struct StaleFrames : BasicFixture198struct StaleFrames : BasicFixture,
199 ::testing::WithParamInterface<int>
136{200{
201 StaleFrames()
202 : post_observer(std::make_shared<PostObserver>(
203 [this](int n){frame_posted(n);}))
204 {
205 }
206
137 void SetUp()207 void SetUp()
138 {208 {
139 BasicFixture::SetUp();209 BasicFixture::SetUp();
140210
141 client_create_surface();211 client_create_surface();
212 auto pub = server_configuration.the_public_surface_factory();
213 auto surface = pub->latest();
214 ASSERT_TRUE(surface);
215 surface->add_observer(post_observer);
216 pub->forget_latest();
142 }217 }
143218
144 void TearDown()219 void TearDown()
@@ -170,12 +245,45 @@
170 server_configuration.the_compositor()->start();245 server_configuration.the_compositor()->start();
171 }246 }
172247
248 /*
249 * NOTE that we wait for surface buffer posts as opposed to display posts.
250 * The difference is that surface buffer posts will precisely match the
251 * number of client swaps for any swap interval, but display posts may be
252 * fewer than the number of swaps if the client was quick and using
253 * interval zero.
254 */
255 void frame_posted(int count)
256 {
257 std::unique_lock<std::mutex> lock(mutex);
258 posts += count;
259 posted.notify_all();
260 }
261
262 bool wait_for_posts(int count, std::chrono::seconds timeout)
263 {
264 std::unique_lock<std::mutex> lock(mutex);
265 auto const deadline = std::chrono::steady_clock::now() + timeout;
266 while (posts < count)
267 {
268 if (posted.wait_until(lock, deadline) == std::cv_status::timeout)
269 return false;
270 }
271 posts -= count;
272 return true;
273 }
274
173 MirWindow* window;275 MirWindow* window;
276
277private:
278 std::shared_ptr<PostObserver> post_observer;
279 std::mutex mutex;
280 std::condition_variable posted;
281 int posts = 0;
174};282};
175283
176}284}
177285
178TEST_F(StaleFrames, are_dropped_when_restarting_compositor)286TEST_P(StaleFrames, are_dropped_when_restarting_compositor)
179{287{
180 using namespace testing;288 using namespace testing;
181289
@@ -186,6 +294,7 @@
186 stale_buffers.emplace(mir_debug_surface_current_buffer_id(window));294 stale_buffers.emplace(mir_debug_surface_current_buffer_id(window));
187295
188 auto bs = mir_window_get_buffer_stream(window);296 auto bs = mir_window_get_buffer_stream(window);
297 mir_buffer_stream_set_swapinterval(bs, GetParam());
189 mir_buffer_stream_swap_buffers_sync(bs);298 mir_buffer_stream_swap_buffers_sync(bs);
190299
191 stale_buffers.emplace(mir_debug_surface_current_buffer_id(window));300 stale_buffers.emplace(mir_debug_surface_current_buffer_id(window));
@@ -196,6 +305,7 @@
196 auto const fresh_buffer = mg::BufferID{mir_debug_surface_current_buffer_id(window)};305 auto const fresh_buffer = mg::BufferID{mir_debug_surface_current_buffer_id(window)};
197 mir_buffer_stream_swap_buffers_sync(bs);306 mir_buffer_stream_swap_buffers_sync(bs);
198307
308 ASSERT_TRUE(wait_for_posts(3, 60s));
199 start_compositor();309 start_compositor();
200310
201 // Note first stale buffer and fresh_buffer may be equal when defaulting to double buffers311 // Note first stale buffer and fresh_buffer may be equal when defaulting to double buffers
@@ -206,22 +316,26 @@
206 EXPECT_THAT(stale_buffers, Not(Contains(new_buffers[0])));316 EXPECT_THAT(stale_buffers, Not(Contains(new_buffers[0])));
207}317}
208318
209TEST_F(StaleFrames, only_fresh_frames_are_used_after_restarting_compositor)319TEST_P(StaleFrames, only_fresh_frames_are_used_after_restarting_compositor)
210{320{
211 using namespace testing;321 using namespace testing;
212322
213 stop_compositor();323 stop_compositor();
214324
215 auto bs = mir_window_get_buffer_stream(window);325 auto bs = mir_window_get_buffer_stream(window);
326 mir_buffer_stream_set_swapinterval(bs, GetParam());
216 mir_buffer_stream_swap_buffers_sync(bs);327 mir_buffer_stream_swap_buffers_sync(bs);
217 mir_buffer_stream_swap_buffers_sync(bs);328 mir_buffer_stream_swap_buffers_sync(bs);
218329
219 auto const fresh_buffer = mg::BufferID{mir_debug_surface_current_buffer_id(window)};330 auto const fresh_buffer = mg::BufferID{mir_debug_surface_current_buffer_id(window)};
220 mir_buffer_stream_swap_buffers_sync(bs);331 mir_buffer_stream_swap_buffers_sync(bs);
221332
333 ASSERT_TRUE(wait_for_posts(3, 60s));
222 start_compositor();334 start_compositor();
223335
224 auto const new_buffers = wait_for_new_rendered_buffers();336 auto const new_buffers = wait_for_new_rendered_buffers();
225 ASSERT_THAT(new_buffers.size(), Eq(1u));337 ASSERT_THAT(new_buffers.size(), Eq(1u));
226 EXPECT_THAT(new_buffers[0], Eq(fresh_buffer));338 EXPECT_THAT(new_buffers[0], Eq(fresh_buffer));
227}339}
340
341INSTANTIATE_TEST_CASE_P(PerSwapInterval, StaleFrames, ::testing::Values(0,1));

Subscribers

People subscribed via source and target branches