Mir

Merge lp:~raof/mir/no-ipc-on-compositor-threads into lp:mir

Proposed by Chris Halse Rogers
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 4228
Proposed branch: lp:~raof/mir/no-ipc-on-compositor-threads
Merge into: lp:mir
Prerequisite: lp:~raof/mir/better-buffer-plumbing
Diff against target: 1038 lines (+399/-182)
18 files modified
include/server/mir/frontend/buffer_stream.h (+0/-5)
src/server/compositor/dropping_schedule.cpp (+0/-10)
src/server/compositor/dropping_schedule.h (+0/-2)
src/server/compositor/queueing_schedule.cpp (+0/-7)
src/server/compositor/queueing_schedule.h (+0/-2)
src/server/compositor/schedule.h (+0/-3)
src/server/compositor/stream.cpp (+1/-33)
src/server/compositor/stream.h (+0/-5)
src/server/frontend/default_ipc_factory.cpp (+186/-1)
src/server/frontend/default_ipc_factory.h (+4/-0)
src/server/frontend/published_socket_connector.cpp (+50/-10)
src/server/frontend/published_socket_connector.h (+1/-1)
src/server/frontend/session_mediator.cpp (+47/-21)
src/server/frontend/session_mediator.h (+6/-1)
tests/include/mir/test/doubles/stub_buffer_stream.h (+0/-2)
tests/unit-tests/compositor/test_multi_monitor_arbiter.cpp (+0/-6)
tests/unit-tests/compositor/test_queueing_schedule.cpp (+0/-19)
tests/unit-tests/frontend/test_session_mediator.cpp (+104/-54)
To merge this branch: bzr merge lp:~raof/mir/no-ipc-on-compositor-threads
Reviewer Review Type Date Requested Status
Alan Griffiths Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+326827@code.launchpad.net

Commit message

Move buffer-release IPC to a dedicated IPC thread.

Fixes: LP: #1395421

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

FAILED: Continuous integration, rev:4212
https://mir-jenkins.ubuntu.com/job/mir-ci/3474/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4747/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4905
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4894
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4894
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4894
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4784
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4784/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4784
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4784/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4784
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4784/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4784/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4784
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4784/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4784
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4784/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4784
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4784/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4784/console

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

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

FAILED: Continuous integration, rev:4216
https://mir-jenkins.ubuntu.com/job/mir-ci/3478/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4751/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4909
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4898
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4898
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4898
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4788
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4788/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4788
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4788/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4788/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4788
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4788/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4788
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4788/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4788
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4788/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4788
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4788/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4788
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4788/artifact/output/*zip*/output.zip

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

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

FAILED: Continuous integration, rev:4216
https://mir-jenkins.ubuntu.com/job/mir-ci/3480/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4753/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4911
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4900
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4900
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4900
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4790
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4790/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4790
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4790/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4790
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4790/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4790
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4790/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4790/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4790
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4790/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4790
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4790/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4790
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4790/artifact/output/*zip*/output.zip

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

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

PASSED: Continuous integration, rev:4217
https://mir-jenkins.ubuntu.com/job/mir-ci/3481/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4756
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4914
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4903
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4903
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4903
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4793/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4793/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4793/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4793/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4793/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4793/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4793/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4793
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4793/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

Ok. It's not clear to me how it was deadlocking, and I still can't reproduce this locally, so I'm going to hit rebuild on that. It *seems* that CI pretty reliably hits this, but let's check that it's not a fluke pass.

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

PASSED: Continuous integration, rev:4217
https://mir-jenkins.ubuntu.com/job/mir-ci/3482/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4757
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4915
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4904
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4904
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4904
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4794/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4794/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4794/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4794/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4794/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4794/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4794/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4794
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4794/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

OK. So looks like that's good.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Thanks for this - it's been on my to-tidy list far too long.

I'll withhold final approval until we've fixed the pre-requisite.

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

PASSED: Continuous integration, rev:4218
https://mir-jenkins.ubuntu.com/job/mir-ci/3497/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4778
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4950
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4939
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4939
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4939
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4815/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4815/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4815/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4815/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4815/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4815/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4815/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4815
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4815/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

OK

review: Approve
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Hmm, with more testing this may not be working right

review: Abstain
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> Hmm, with more testing this may not be working right

Sorry not to be clear. Hitting EOD.

I tried building miral against this, running miral-app hosted by mir_demo_server and running all the clients.

When I came to close things down things were hung.

Didn't get time to be more specific.

Revision history for this message
Chris Halse Rogers (raof) wrote :

Moar testing time! Thanks.

Revision history for this message
Chris Halse Rogers (raof) wrote :

Hm.

To be clear, this is miral-shell hanging if the underlying mir_demo_server goes away (such as by SIGINT)?

If I quit miral-shell first everything seems to go as expected.

Revision history for this message
Chris Halse Rogers (raof) wrote :

Oh, huh. Looks like it might be any EGL-using client...

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> Hm.
>
> To be clear, this is miral-shell hanging if the underlying mir_demo_server
> goes away (such as by SIGINT)?
>
> If I quit miral-shell first everything seems to go as expected.

No. I was just closing individual clients with Alt-F4 (or Alt-Shift-F4 for the few that don't listen).

I'll try to reproduce and narrow down exactly what went on. And check that it was actually this MP (and not something we already landed).

Revision history for this message
Chris Halse Rogers (raof) wrote :

Hm. New hypothesis: this has always been broken, and doesn't require nesting.

It seems that if you start up any fullscreen client (tested with eglplasma and _target) before the throbber has finished then the throbber client hangs in swapbuffers and prevents miral-shell shutdown.

This also happens with the archive mir and miral.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

OK, I can't reproduce what I saw yesterday.

Maybe I hit an intermittent, maybe I had screwed up my test. Either way, let's land this and monitor.

review: Approve
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> Hm. New hypothesis: this has always been broken, and doesn't require nesting.
>
> It seems that if you start up any fullscreen client (tested with eglplasma and
> _target) before the throbber has finished then the throbber client hangs in
> swapbuffers and prevents miral-shell shutdown.

"throbber"?

> This also happens with the archive mir and miral.

File a bug. We should fix it.

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

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1358/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4783/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1462/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4956
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4945
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4945
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4945
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4820
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4820/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4820
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4820/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4820
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4820/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4820/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4820
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4820/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4820
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4820/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4820
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4820/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4820
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4820/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

I don't think the failure is related.

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

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1359/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4786/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1464/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4960
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4949
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4949
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4949
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4823
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4823/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4823/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4823
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4823/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4823
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4823/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4823
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4823/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4823
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4823/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4823
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4823/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4823/console

review: Needs Fixing (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

On Thu, Jul 20, 2017 at 6:44 PM, Alan Griffiths <email address hidden>
wrote:
>> Hm. New hypothesis: this has always been broken, and doesn't
>> require nesting.
>>
>> It seems that if you start up any fullscreen client (tested with
>> eglplasma and
>> _target) before the throbber has finished then the throbber client
>> hangs in
>> swapbuffers and prevents miral-shell shutdown.
>
> "throbber"?

The splashscreen, spinning Ubuntu logo thingy.

Revision history for this message
Chris Halse Rogers (raof) wrote :

Hm. *Those* failures are due to real-time tests exceeding their thresholds. This branch plausibly increases the latency of those tests, as the buffer responses now require a context-switch rather than occurring on the compositor thread.

It might also just have been due to a transient load on the CI machine, so I'll give it another try...

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

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1362/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4789/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1467/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4964
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4953
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4953
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4953
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4826
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4826/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4826
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4826/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4826/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4826
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4826/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4826
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4826/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4826
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4826/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4826
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4826/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4826
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4826/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

(Spinner bug is bug #1705973)

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

PASSED: Continuous integration, rev:4218
https://mir-jenkins.ubuntu.com/job/mir-ci/3505/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4795
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4972
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4961
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4961
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4961
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4832/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4832/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4832/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4832/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4832/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4832/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4832/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4832
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4832/artifact/output/*zip*/output.zip

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

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

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1364/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4796/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1469/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4973
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4962
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4962
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4962
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4833/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4833
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4833/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4833
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4833/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4833
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4833/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4833
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4833/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4833
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4833/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4833
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4833/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4833
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4833/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

While this could change timing, I don't see why it should affect NestedServer.given_client_set_display_configuration_when_monitor_unplugs_client_can_set_display_configuration

Logged failure as lp:1706050 & re-approved

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

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1365/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4798/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1470/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4976
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4965
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4965
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4965
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4835
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4835/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4835
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4835/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4835
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4835/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4835
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4835/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4835
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4835/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4835
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4835/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4835
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4835/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4835/console

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Now a failure in NestedServer.display_orientation_changes_are_forwarded_to_host

...
12:28:26 terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::logic_error> >'
12:28:26 what(): stop_server() failed to stop server
12:28:26 ==18875==
12:28:26 ==18875== Process terminating with default action of signal 6 (SIGABRT)
12:28:26 ==18875== at 0x458AEA9: raise (raise.c:54)
12:28:26 ==18875== by 0x458C406: abort (abort.c:89)
12:28:26 ==18875== by 0x4420D34: __gnu_cxx::__verbose_terminate_handler() (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21)
12:28:26 ==18875== by 0x441E832: ??? (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21)
12:28:26 ==18875== by 0x441D648: ??? (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21)
12:28:26 ==18875== by 0x441DE10: __gxx_personality_v0 (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21)
12:28:26 ==18875== by 0x453A3DE: ??? (in /lib/i386-linux-gnu/libgcc_s.so.1)
12:28:26 ==18875== by 0x453A856: _Unwind_Resume (in /lib/i386-linux-gnu/libgcc_s.so.1)
12:28:26 ==18875== by 0x8727D93: ~unique_lock (mutex:450)
12:28:26 ==18875== by 0x8727D93: mir_test_framework::AsyncServerRunner::wait_for_server_exit() (async_server_runner.cpp:117)
...

I think that's (at least) a failure too many to be a coincidence.

Is this MP introducing a shutdown race that can deadlock?

review: Needs Information
Revision history for this message
Chris Halse Rogers (raof) wrote :

I cannot for the life of me get this to fail locally.

I've run “make test” on a valgrind and debflags build in a loop for hours, and the tests continue to reliably pass.

Aaargh.

Here are some changes which also don't fail locally, but might help?

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

PASSED: Continuous integration, rev:4220
https://mir-jenkins.ubuntu.com/job/mir-ci/3507/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4800
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4982
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4971
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4971
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4971
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4837/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4837/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4837/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4837/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4837/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4837/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4837/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4837
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4837/artifact/output/*zip*/output.zip

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

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

PASSED: Continuous integration, rev:4223
https://mir-jenkins.ubuntu.com/job/mir-ci/3508/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4801
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4983
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4972
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4972
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4972
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4838/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4838/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4838/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4838/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4838/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4838/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4838/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4838
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4838/artifact/output/*zip*/output.zip

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

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

FAILED: Continuous integration, rev:4225
https://mir-jenkins.ubuntu.com/job/mir-ci/3512/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4807/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/4994
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/4983
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/4983
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/4983
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4844
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4844/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4844
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4844/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4844/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4844
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4844/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4844/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4844
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4844/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4844
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4844/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4844/console

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Just looking at the last commit:

1. Do we really want four shared pointers in ThreadExecutor? Surely one pointer holding a "shared state" implementation object would be better?

2. The (potential) problem with detaching threads is ensuring they exit before the process does. I don't see this being a problem here except possibly with valgrind...

Revision history for this message
Chris Halse Rogers (raof) wrote :

It shouldn't matter if the threads don't end before the process does; valgrind doesn't count reachable objects as leaked, and if the thread hasn't finished then the objects are still reachable.

This should now *actually* work.

I'm somewhat surprised we haven't seen problems caused by the boost::...::socket outliving the io_service in the past. As far as I can tell, there's no mechanism to enforce that - we share SocketMessangers around pretty widely...

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

PASSED: Continuous integration, rev:4227
https://mir-jenkins.ubuntu.com/job/mir-ci/3518/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4814
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5012
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5001
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5001
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5001
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4851/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4851/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4851/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4851/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4851/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4851/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4851/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4851
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4851/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

It still feels untidy to exit while a detached thread might own resources, but that's probably less evil than the existing code.

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

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/1370/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4816/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/1484/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5014
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5003
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5003
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5003
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4853/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4853/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4853
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4853/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4853
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4853/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4853
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4853/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4853
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4853/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4853
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4853/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4853
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4853/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Hmm, this does look suspicious:

10:37:22 9: ==28377== 792 (24 direct, 768 indirect) bytes in 1 blocks are definitely lost in loss record 36 of 41
10:37:22 9: ==28377== at 0x4C2E19F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
10:37:22 9: ==28377== by 0x51B754A: _S_make_state<std::_Bind_simple<(lambda at /<<BUILDDIR>>/mir-0.27.0+artful5003bzr4227/src/server/frontend/default_ipc_factory.cpp:59:13) ()> > (thread:208)
10:37:22 9: ==28377== by 0x51B754A: thread<(lambda at /<<BUILDDIR>>/mir-0.27.0+artful5003bzr4227/src/server/frontend/default_ipc_factory.cpp:59:13)> (thread:137)

review: Needs Fixing
Revision history for this message
Chris Halse Rogers (raof) wrote :

Damnit, valgrind!

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

FAILED: Continuous integration, rev:4228
https://mir-jenkins.ubuntu.com/job/mir-ci/3520/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4817/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5018
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5007
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5007
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5007
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4854/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4854/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4854/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4854/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4854/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4854
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4854/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4854
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4854/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4854/console

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Chris Halse Rogers (raof) wrote :

Oh, dear.

This is now running into poor interactions with fork(); specifically:
Specifically:
       * After a fork() in a multithreaded program, the child can safely
          call only async-signal-safe functions (see signal-safety(7)) until
          such time as it calls execve(2).

When running “make test”, we've got a single process executing all the tests; since the ThreadExecutor is now static, we now have a thread waiting around before we get to fork().

This is why ptest doesn't fail; each test gets its own process...

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> Oh, dear.
>
> This is now running into poor interactions with fork(); specifically:
> Specifically:
> * After a fork() in a multithreaded program, the child can safely
> call only async-signal-safe functions (see signal-safety(7)) until
> such time as it calls execve(2).
>
> When running “make test”, we've got a single process executing all the tests;
> since the ThreadExecutor is now static, we now have a thread waiting around
> before we get to fork().

Ack. Objects with static duration can be problematic. :(

> This is why ptest doesn't fail; each test gets its own process...

I'm not convinced by that final reasoning: with ptest each test fixture gets its own process, but that still runs multiple tests (each of which may fork).

Revision history for this message
Chris Halse Rogers (raof) wrote :

On 2 August 2017 6:03:59 pm AEST, Alan Griffiths <email address hidden> wrote:
>> This is why ptest doesn't fail; each test gets its own process...
>
>I'm not convinced by that final reasoning: with ptest each test fixture
>gets its own process, but that still runs multiple tests (each of which
>may fork).

More correctly: our tests that fork do so *first*, and do all of their multi-threading in a child.

Then along comes this MP, and causes a thread to hang around - waiting on a condition variable - from a previous test. Now our top-level fork is mt.

A hack - delete and recreate the executor across fork boundaries using pthread_atfork() - resolves this. It should also work to quiesce the executor pre-fork and then resume it in the other end.
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

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

FAILED: Continuous integration, rev:4229
https://mir-jenkins.ubuntu.com/job/mir-ci/3524/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4822/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5023
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5012
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5012
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5012
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4859/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4859/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4859/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4859/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4859/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4859
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4859/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4859
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4859/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4859
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4859/artifact/output/*zip*/output.zip

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

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

FAILED: Continuous integration, rev:4230
https://mir-jenkins.ubuntu.com/job/mir-ci/3525/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4824/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5025
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5014
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5014
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5014
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4861/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4861
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4861/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4861/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4861
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4861/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4861
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4861/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4861
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4861/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4861
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4861/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4861
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4861/artifact/output/*zip*/output.zip

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Just artful/amd64/[g++|clang]?

That's also happening in two other branches. (I've reproduced locally yet.)

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> Just artful/amd64/[g++|clang]?
>
> That's also happening in two other branches. (I've reproduced locally yet.)

I've *not* reproduced locally yet.

Revision history for this message
Chris Halse Rogers (raof) wrote :

Yeah. *My* artful builds work fine!

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Hmm, the errors seem to be coming from DefaultPersistentSurfaceStore's unordered_map - and I see no synchronization primitives. Could this be accessed from multiple threads?

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

FAILED: Continuous integration, rev:4231
https://mir-jenkins.ubuntu.com/job/mir-ci/3531/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4830/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5031
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5020
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5020
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5020
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4867/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4867
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4867/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4867/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4867
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4867/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4867
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4867/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4867
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4867/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4867
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4867/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4867
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4867/artifact/output/*zip*/output.zip

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

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

FAILED: Continuous integration, rev:4232
https://mir-jenkins.ubuntu.com/job/mir-ci/3532/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4831/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5032
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5021
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5021
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5021
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4868/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4868/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4868/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4868/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4868/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4868/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4868/console
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4868/console

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

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

FAILED: Continuous integration, rev:4233
https://mir-jenkins.ubuntu.com/job/mir-ci/3533/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4832/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5033
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5022
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5022
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5022
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4869/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4869
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4869/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4869/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4869
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4869/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4869
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4869/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4869
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4869/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4869
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4869/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4869
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4869/artifact/output/*zip*/output.zip

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

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

FAILED: Continuous integration, rev:4234
https://mir-jenkins.ubuntu.com/job/mir-ci/3534/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4833/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5034
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5023
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5023
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5023
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4870/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4870
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4870/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4870/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4870
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4870/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4870
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4870/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4870
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4870/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4870
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4870/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4870
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4870/artifact/output/*zip*/output.zip

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

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

FAILED: Continuous integration, rev:4231
https://mir-jenkins.ubuntu.com/job/mir-ci/3543/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/4848/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5049
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5038
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5038
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5038
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4885
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4885/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4885
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4885/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4885
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4885/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4885
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4885/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4885
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4885/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4885
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4885/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4885
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4885/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4885/console

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

+mir::Executor& system_executor()
+{
+ static std::once_flag setup;
+ static ThreadExecutor executor;

Hmm, as well as the fight you started with fork() how does this scale well with having multiple Mir server instances in process? (I can see it doesn't break the test suite, but hopefully that isn't "just luck".)

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

make_socket_self_cotained

"cotained"?

~~~~

What is the intention of "system_executor()"? It seems to be used solely for all the IPC - possibly for multiple connectors on multiple servers. A more specific name would be appropriate.

review: Needs Fixing
Revision history for this message
Chris Halse Rogers (raof) wrote :

system_executor() is named as such in honour of the C++ TS. I guess it shouldn't really be named that :)

This shouldn't be a problem for multiple servers in a single process - they'll all use the same IPC thread for buffer-return messages, but each buffer-return task should be extremely quick - almost just a syscall - and there shouldn't be all that many of them - they'll generally max out at 60/s/client.

If you run *lots* of really busy servers in the same process that might start getting awkward.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Nit:

+ std::shared_ptr<boost::asio::io_service> const &io_service,
+ std::shared_ptr<boost::asio::local::stream_protocol::socket> const &socket)

Did you have CLion set to the wrong "&" placement style?

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

PASSED: Continuous integration, rev:4233
https://mir-jenkins.ubuntu.com/job/mir-ci/3552/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4864
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5077
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5066
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5066
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5066
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4901/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4901/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4901/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4901/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4901/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4901/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4901/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4901
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4901/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

I think this is OK but in the "good old days" I would have wanted another set of eyes. (I did ask Alberto, but he's not found time - yet.)

review: Approve
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Running miral-desktop (trunk) on this leads to orphaned titlebars and a hung server.

I need to run some more tests to isolate the problem.

review: Needs Information
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

$ sudo mir_demo_server --vt 4 --launch mir_demo_client_multistream

Wait 30 seconds(ish)...

the server hangs

review: Needs Fixing
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> $ sudo mir_demo_server --vt 4 --launch mir_demo_client_multistream
>
> Wait 30 seconds(ish)...
>
> the server hangs

Actually, the server isn't entirely hung - but killing the child process doesn't remove it from the scene.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

> > $ sudo mir_demo_server --vt 4 --launch mir_demo_client_multistream
> >
> > Wait 30 seconds(ish)...
> >
> > the server hangs
>
> Actually, the server isn't entirely hung - but killing the child process
> doesn't remove it from the scene.

Specifically, the server has exhausted file handles: /proc/.../fd/ has lots like this:

    lrwx------ 1 alan alan 64 Aug 15 12:03 999 -> /dev/shm/#128090392 (deleted)

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

OK, I've made some progress:

multi_stream is hitting the problem because it repeatedly creates new BufferStreams and destroying the old ones (and RenderSurfaces).

When BufferStreams are created and destroyed like this the buffer_cache in SessionMediator grows intermittently but inexorably.

Up until the point when file handles are exhausted closing the connection releases the cache and the buffers. (Once file handles are exhausted the server struggles to release the connection.)

I've not yet got my head around where the buffers created for mir_buffer_stream_get_graphics_region() are being tracked and should be released more consistently.

Revision history for this message
Chris Halse Rogers (raof) wrote :

Thanks for that!

That made it obvious that we were never actually freeing the buffers allocated on a BufferStream when it is destroyed.

I thought that (a) the client side did that, and (b) the server side *also* did that.

But it turns out that stream->associate_buffer() is actually a bunch of entirely unused bookeeping, so... :)

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

PASSED: Continuous integration, rev:4236
https://mir-jenkins.ubuntu.com/job/mir-ci/3556/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/4870
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/5083
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=artful/5072
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/5072
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=zesty/5072
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=artful/4907/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=zesty/4907/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=artful/4907/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/4907/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=zesty/4907/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=artful/4907/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=mesa,release=zesty/4907/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4907
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/4907/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Looking good!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'include/server/mir/frontend/buffer_stream.h'
--- include/server/mir/frontend/buffer_stream.h 2017-07-28 17:00:43 +0000
+++ include/server/mir/frontend/buffer_stream.h 2017-08-16 07:06:44 +0000
@@ -54,11 +54,6 @@
5454
55 virtual MirPixelFormat pixel_format() const = 0;55 virtual MirPixelFormat pixel_format() const = 0;
5656
57 //TODO: associate/disassociate_buffer are only used for timeout framedropping policy decisions.
58 // They will be removed once timeout framedropping policy moves to the client side.
59 virtual void associate_buffer(graphics::BufferID) = 0;
60 virtual void disassociate_buffer(graphics::BufferID) = 0;
61
62 //TODO: framedropping for swapinterval-0 can probably be effectively managed from the client57 //TODO: framedropping for swapinterval-0 can probably be effectively managed from the client
63 // side once we only support the NBS system.58 // side once we only support the NBS system.
64 virtual void allow_framedropping(bool) = 0;59 virtual void allow_framedropping(bool) = 0;
6560
=== modified file 'src/server/compositor/dropping_schedule.cpp'
--- src/server/compositor/dropping_schedule.cpp 2017-07-28 17:00:43 +0000
+++ src/server/compositor/dropping_schedule.cpp 2017-08-16 07:06:44 +0000
@@ -29,18 +29,8 @@
2929
30void mc::DroppingSchedule::schedule(std::shared_ptr<mg::Buffer> const& buffer)30void mc::DroppingSchedule::schedule(std::shared_ptr<mg::Buffer> const& buffer)
31{31{
32 auto drop = schedule_nonblocking(buffer);
33 if (drop.valid())
34 drop.wait();
35}
36
37std::future<void> mc::DroppingSchedule::schedule_nonblocking(
38 std::shared_ptr<mg::Buffer> const& buffer)
39{
40 std::future<void> drop;
41 std::lock_guard<decltype(mutex)> lk(mutex);32 std::lock_guard<decltype(mutex)> lk(mutex);
42 the_only_buffer = buffer;33 the_only_buffer = buffer;
43 return drop;
44}34}
4535
46unsigned int mc::DroppingSchedule::num_scheduled()36unsigned int mc::DroppingSchedule::num_scheduled()
4737
=== modified file 'src/server/compositor/dropping_schedule.h'
--- src/server/compositor/dropping_schedule.h 2017-07-28 17:00:43 +0000
+++ src/server/compositor/dropping_schedule.h 2017-08-16 07:06:44 +0000
@@ -32,8 +32,6 @@
32public:32public:
33 DroppingSchedule();33 DroppingSchedule();
34 void schedule(std::shared_ptr<graphics::Buffer> const& buffer) override;34 void schedule(std::shared_ptr<graphics::Buffer> const& buffer) override;
35 std::future<void> schedule_nonblocking(
36 std::shared_ptr<graphics::Buffer> const& buffer) override;
37 unsigned int num_scheduled() override;35 unsigned int num_scheduled() override;
38 std::shared_ptr<graphics::Buffer> next_buffer() override;36 std::shared_ptr<graphics::Buffer> next_buffer() override;
3937
4038
=== modified file 'src/server/compositor/queueing_schedule.cpp'
--- src/server/compositor/queueing_schedule.cpp 2017-07-28 17:00:43 +0000
+++ src/server/compositor/queueing_schedule.cpp 2017-08-16 07:06:44 +0000
@@ -32,13 +32,6 @@
32 queue.emplace_back(buffer);32 queue.emplace_back(buffer);
33}33}
3434
35std::future<void> mc::QueueingSchedule::schedule_nonblocking(
36 std::shared_ptr<graphics::Buffer> const& buffer)
37{
38 schedule(buffer);
39 return {};
40}
41
42unsigned int mc::QueueingSchedule::num_scheduled()35unsigned int mc::QueueingSchedule::num_scheduled()
43{36{
44 std::lock_guard<decltype(mutex)> lk(mutex);37 std::lock_guard<decltype(mutex)> lk(mutex);
4538
=== modified file 'src/server/compositor/queueing_schedule.h'
--- src/server/compositor/queueing_schedule.h 2017-07-28 17:00:43 +0000
+++ src/server/compositor/queueing_schedule.h 2017-08-16 07:06:44 +0000
@@ -32,8 +32,6 @@
32{32{
33public:33public:
34 void schedule(std::shared_ptr<graphics::Buffer> const& buffer) override;34 void schedule(std::shared_ptr<graphics::Buffer> const& buffer) override;
35 std::future<void> schedule_nonblocking(
36 std::shared_ptr<graphics::Buffer> const& buffer) override;
37 unsigned int num_scheduled() override;35 unsigned int num_scheduled() override;
38 std::shared_ptr<graphics::Buffer> next_buffer() override;36 std::shared_ptr<graphics::Buffer> next_buffer() override;
3937
4038
=== modified file 'src/server/compositor/schedule.h'
--- src/server/compositor/schedule.h 2017-07-28 17:00:43 +0000
+++ src/server/compositor/schedule.h 2017-08-16 07:06:44 +0000
@@ -19,7 +19,6 @@
19#define MIR_COMPOSITOR_SCHEDULE_H_19#define MIR_COMPOSITOR_SCHEDULE_H_
2020
21#include <memory>21#include <memory>
22#include <future>
2322
24namespace mir23namespace mir
25{24{
@@ -31,8 +30,6 @@
31{30{
32public:31public:
33 virtual void schedule(std::shared_ptr<graphics::Buffer> const& buffer) = 0;32 virtual void schedule(std::shared_ptr<graphics::Buffer> const& buffer) = 0;
34 virtual std::future<void> schedule_nonblocking(
35 std::shared_ptr<graphics::Buffer> const& buffer) = 0;
36 virtual unsigned int num_scheduled() = 0;33 virtual unsigned int num_scheduled() = 0;
37 virtual std::shared_ptr<graphics::Buffer> next_buffer() = 0;34 virtual std::shared_ptr<graphics::Buffer> next_buffer() = 0;
3835
3936
=== modified file 'src/server/compositor/stream.cpp'
--- src/server/compositor/stream.cpp 2017-07-28 17:00:43 +0000
+++ src/server/compositor/stream.cpp 2017-08-16 07:06:44 +0000
@@ -48,18 +48,8 @@
4848
49mc::Stream::~Stream() = default;49mc::Stream::~Stream() = default;
5050
51unsigned int mc::Stream::client_owned_buffer_count(std::lock_guard<decltype(mutex)> const&) const
52{
53 auto server_count = schedule->num_scheduled();
54 if (arbiter->has_buffer())
55 server_count++;
56 return associated_buffers.size() - server_count;
57}
58
59void mc::Stream::submit_buffer(std::shared_ptr<mg::Buffer> const& buffer)51void mc::Stream::submit_buffer(std::shared_ptr<mg::Buffer> const& buffer)
60{52{
61 std::future<void> deferred_io;
62
63 if (!buffer)53 if (!buffer)
64 BOOST_THROW_EXCEPTION(std::invalid_argument("cannot submit null buffer"));54 BOOST_THROW_EXCEPTION(std::invalid_argument("cannot submit null buffer"));
6555
@@ -67,17 +57,9 @@
67 std::lock_guard<decltype(mutex)> lk(mutex); 57 std::lock_guard<decltype(mutex)> lk(mutex);
68 first_frame_posted = true;58 first_frame_posted = true;
69 pf = buffer->pixel_format();59 pf = buffer->pixel_format();
70 deferred_io = schedule->schedule_nonblocking(buffer);60 schedule->schedule(buffer);
71 }61 }
72 observers.frame_posted(1, buffer->size());62 observers.frame_posted(1, buffer->size());
73
74 // Ensure that mutex is not locked while we do this (synchronous!) socket
75 // IO. Holding it locked blocks the compositor thread(s) from rendering.
76 if (deferred_io.valid())
77 {
78 // TODO: Throttling of GPU hogs goes here (LP: #1211700, LP: #1665802)
79 deferred_io.wait();
80 }
81}63}
8264
83void mc::Stream::with_most_recent_buffer_do(std::function<void(mg::Buffer&)> const& fn)65void mc::Stream::with_most_recent_buffer_do(std::function<void(mg::Buffer&)> const& fn)
@@ -184,20 +166,6 @@
184 return first_frame_posted;166 return first_frame_posted;
185}167}
186168
187void mc::Stream::associate_buffer(mg::BufferID id)
188{
189 std::lock_guard<decltype(mutex)> lk(mutex);
190 associated_buffers.insert(id);
191}
192
193void mc::Stream::disassociate_buffer(mg::BufferID id)
194{
195 std::lock_guard<decltype(mutex)> lk(mutex);
196 auto it = associated_buffers.find(id);
197 if (it != associated_buffers.end())
198 associated_buffers.erase(it);
199}
200
201void mc::Stream::set_scale(float)169void mc::Stream::set_scale(float)
202{170{
203}171}
204172
=== modified file 'src/server/compositor/stream.h'
--- src/server/compositor/stream.h 2017-07-28 17:00:43 +0000
+++ src/server/compositor/stream.h 2017-08-16 07:06:44 +0000
@@ -56,8 +56,6 @@
56 int buffers_ready_for_compositor(void const* user_id) const override;56 int buffers_ready_for_compositor(void const* user_id) const override;
57 void drop_old_buffers() override;57 void drop_old_buffers() override;
58 bool has_submitted_buffer() const override;58 bool has_submitted_buffer() const override;
59 void associate_buffer(graphics::BufferID) override;
60 void disassociate_buffer(graphics::BufferID) override;
61 void set_scale(float scale) override;59 void set_scale(float scale) override;
6260
63private:61private:
@@ -73,9 +71,6 @@
73 bool first_frame_posted;71 bool first_frame_posted;
7472
75 scene::SurfaceObservers observers;73 scene::SurfaceObservers observers;
76
77 std::set<graphics::BufferID> associated_buffers;
78 unsigned int client_owned_buffer_count(std::lock_guard<decltype(mutex)> const&) const;
79};74};
80}75}
81}76}
8277
=== modified file 'src/server/frontend/default_ipc_factory.cpp'
--- src/server/frontend/default_ipc_factory.cpp 2017-07-28 17:00:43 +0000
+++ src/server/frontend/default_ipc_factory.cpp 2017-08-16 07:06:44 +0000
@@ -29,12 +29,196 @@
29#include "event_sink_factory.h"29#include "event_sink_factory.h"
30#include "mir/graphics/graphic_buffer_allocator.h"30#include "mir/graphics/graphic_buffer_allocator.h"
31#include "mir/cookie/authority.h"31#include "mir/cookie/authority.h"
32#include "mir/executor.h"
33#include "mir/signal_blocker.h"
34
35#include <deque>
3236
33namespace mf = mir::frontend;37namespace mf = mir::frontend;
34namespace mg = mir::graphics;38namespace mg = mir::graphics;
35namespace mi = mir::input;39namespace mi = mir::input;
36namespace ms = mir::scene;40namespace ms = mir::scene;
3741
42namespace
43{
44class ThreadExecutor : public mir::Executor
45{
46public:
47 ThreadExecutor() = default;
48
49 ThreadExecutor(ThreadExecutor const&) = delete;
50 ThreadExecutor& operator=(ThreadExecutor const&) = delete;
51
52 void do_work() noexcept
53 {
54 std::unique_lock<std::mutex> lock{queue_mutex};
55 for(;;)
56 {
57 while (!tasks.empty())
58 {
59 std::function<void()> task;
60 task = std::move(tasks.front());
61 tasks.pop_front();
62
63 lock.unlock();
64 task();
65 /*
66 * The task functor may have captured resources with non-trivial
67 * destructors.
68 *
69 * Ensure those destructors are called outside the lock.
70 */
71 task = nullptr;
72 lock.lock();
73 }
74
75 if (state != State::Running)
76 {
77 return;
78 }
79
80 queue_notifier.wait(
81 lock,
82 [this]()
83 {
84 return (state != State::Running) || !tasks.empty();
85 });
86 }
87 }
88
89 ~ThreadExecutor()
90 {
91 quiesce();
92 }
93
94 void spawn(std::function<void()>&& work) override
95 {
96 {
97 std::lock_guard<std::mutex> lock{queue_mutex};
98 tasks.emplace_back(std::move(work));
99
100 if (state == State::NotYetStarted)
101 {
102 /*
103 * Block all signals on the dispatch thread.
104 *
105 * Threads inherit their parent's signal mask, so use a SignalBlocker to block
106 * all signals *before* spawning the thread (and then restore the signal mask
107 * when this constructor completes).
108 */
109 mir::SignalBlocker blocker;
110 state = State::Running;
111 dispatch_thread = std::thread{std::bind(&ThreadExecutor::do_work, this)};
112 }
113 }
114 queue_notifier.notify_all();
115 }
116
117 void quiesce()
118 {
119 {
120 std::lock_guard<std::mutex> lock{queue_mutex};
121 state = State::Quiesced;
122 }
123 queue_notifier.notify_all();
124
125 if (dispatch_thread.joinable())
126 dispatch_thread.join();
127 }
128
129 void resume()
130 {
131 std::lock_guard<std::mutex> lock{queue_mutex};
132 state = State::NotYetStarted;
133 if (!tasks.empty())
134 {
135 /*
136 * Block all signals on the dispatch thread.
137 *
138 * Threads inherit their parent's signal mask, so use a SignalBlocker to block
139 * all signals *before* spawning the thread (and then restore the signal mask
140 * when this constructor completes).
141 */
142 mir::SignalBlocker blocker;
143 state = State::Running;
144 dispatch_thread = std::thread{std::bind(&ThreadExecutor::do_work, this)};
145 }
146 }
147
148 void discard()
149 {
150 std::lock_guard<std::mutex> lock{queue_mutex};
151 tasks.clear();
152 state = State::NotYetStarted;
153 }
154private:
155 std::thread dispatch_thread;
156
157 std::mutex queue_mutex;
158 std::condition_variable queue_notifier;
159 enum class State
160 {
161 NotYetStarted,
162 Running,
163 Quiesced
164 } state{State::NotYetStarted};
165 std::deque<std::function<void()>> tasks;
166};
167
168mir::Executor& buffer_return_ipc_executor()
169{
170 static std::once_flag setup;
171 static ThreadExecutor executor;
172
173 std::call_once(
174 setup,
175 []()
176 {
177 /*
178 * fork() interacts with threads by screaming about being
179 * smothered by moths and then gibbering in a corner.
180 *
181 * Conveniently, our test-suite makes extensive use of fork(),
182 * and runs all the tests from a single main process, meaning
183 * that once a single test has called executor.spawn() every
184 * subsequent call to fork() is a call from a multithreaded
185 * program.
186 *
187 * Enter the moths.
188 *
189 * We can get around this by quiescing the executor; temporarily
190 * halting its execution thread and then resuming it post-fork.
191 */
192 pthread_atfork(
193 []()
194 {
195 // Pre-fork
196 executor.quiesce();
197 },
198 []()
199 {
200 /*
201 * Post-fork, in the parent:
202 * Resume execution, executing any functors queued
203 * since quiescence.
204 */
205 executor.resume();
206 },
207 []()
208 {
209 /*
210 * Post-fork, in the child:
211 * Discard any tasks that snuck in after pre-fork but before fork();
212 * they'll be handled in the parent.
213 */
214 executor.discard();
215 });
216 });
217
218 return executor;
219}
220}
221
38mf::DefaultIpcFactory::DefaultIpcFactory(222mf::DefaultIpcFactory::DefaultIpcFactory(
39 std::shared_ptr<Shell> const& shell,223 std::shared_ptr<Shell> const& shell,
40 std::shared_ptr<SessionMediatorObserver> const& sm_observer,224 std::shared_ptr<SessionMediatorObserver> const& sm_observer,
@@ -152,5 +336,6 @@
152 cookie_authority,336 cookie_authority,
153 input_changer,337 input_changer,
154 extensions,338 extensions,
155 buffer_allocator);339 buffer_allocator,
340 buffer_return_ipc_executor());
156}341}
157342
=== modified file 'src/server/frontend/default_ipc_factory.h'
--- src/server/frontend/default_ipc_factory.h 2017-07-28 17:00:43 +0000
+++ src/server/frontend/default_ipc_factory.h 2017-08-16 07:06:44 +0000
@@ -24,6 +24,9 @@
2424
25namespace mir25namespace mir
26{26{
27
28class Executor;
29
27namespace cookie30namespace cookie
28{31{
29class Authority;32class Authority;
@@ -109,6 +112,7 @@
109 std::shared_ptr<cookie::Authority> const cookie_authority;112 std::shared_ptr<cookie::Authority> const cookie_authority;
110 std::shared_ptr<InputConfigurationChanger> const input_changer;113 std::shared_ptr<InputConfigurationChanger> const input_changer;
111 std::vector<mir::ExtensionDescription> const extensions;114 std::vector<mir::ExtensionDescription> const extensions;
115 std::shared_ptr<mir::Executor> const execution_queue;
112};116};
113}117}
114}118}
115119
=== modified file 'src/server/frontend/published_socket_connector.cpp'
--- src/server/frontend/published_socket_connector.cpp 2017-08-15 10:04:24 +0000
+++ src/server/frontend/published_socket_connector.cpp 2017-08-16 07:06:44 +0000
@@ -95,6 +95,30 @@
95 }95 }
96 return socket_name;96 return socket_name;
97}97}
98
99std::shared_ptr<boost::asio::local::stream_protocol::socket> make_socket_self_contained(
100 std::shared_ptr<boost::asio::io_service> const &io_service,
101 std::shared_ptr<boost::asio::local::stream_protocol::socket> const &socket)
102{
103 struct SelfContainedSocket {
104 SelfContainedSocket(
105 std::shared_ptr<boost::asio::io_service> const& io_service,
106 std::shared_ptr<boost::asio::local::stream_protocol::socket> const& socket)
107 : io_service{io_service},
108 socket{socket}
109 {
110 }
111
112 std::shared_ptr<boost::asio::io_service> const io_service;
113 std::shared_ptr<boost::asio::local::stream_protocol::socket> const socket;
114 };
115
116 auto holder = std::make_shared<SelfContainedSocket>(io_service, socket);
117
118 return std::shared_ptr<boost::asio::local::stream_protocol::socket>(
119 holder,
120 holder->socket.get());
121}
98}122}
99123
100mf::PublishedSocketConnector::PublishedSocketConnector(124mf::PublishedSocketConnector::PublishedSocketConnector(
@@ -104,7 +128,7 @@
104 std::shared_ptr<ConnectorReport> const& report)128 std::shared_ptr<ConnectorReport> const& report)
105: BasicConnector(connection_creator, report),129: BasicConnector(connection_creator, report),
106 socket_file(remove_if_stale(socket_file)),130 socket_file(remove_if_stale(socket_file)),
107 acceptor(io_service, socket_file)131 acceptor(*io_service, socket_file)
108{132{
109 emergency_cleanup_registry.add(133 emergency_cleanup_registry.add(
110 [socket_file] { std::remove(socket_file.c_str()); });134 [socket_file] { std::remove(socket_file.c_str()); });
@@ -120,13 +144,26 @@
120{144{
121 report->listening_on(socket_file);145 report->listening_on(socket_file);
122146
123 auto socket = std::make_shared<boost::asio::local::stream_protocol::socket>(io_service);147 auto socket = std::make_shared<boost::asio::local::stream_protocol::socket>(*io_service);
124148
125 acceptor.async_accept(149 acceptor.async_accept(
126 *socket,150 *socket,
127 [this,socket](boost::system::error_code const& ec)151 [
152 this,
153 socket,
154 maybe_service = std::weak_ptr<boost::asio::io_service>(io_service)
155 ](boost::system::error_code const& ec)
128 {156 {
129 on_new_connection(socket, ec);157 /*
158 * This functor lives on a queue in the io_service. If we capture a strong
159 * reference to the io_service, we'll have a reference cycle.
160 *
161 * Neither io_service::reset() nor acceptor.close() appear to cause the
162 * destruction of the functor, so just take a weak reference to the
163 * io_service and upgrade it when something actually connects.
164 */
165 if (auto live_service = maybe_service.lock())
166 on_new_connection(make_socket_self_contained(live_service, socket), ec);
130 });167 });
131}168}
132169
@@ -148,7 +185,8 @@
148mf::BasicConnector::BasicConnector(185mf::BasicConnector::BasicConnector(
149 std::shared_ptr<ConnectionCreator> const& connection_creator,186 std::shared_ptr<ConnectionCreator> const& connection_creator,
150 std::shared_ptr<ConnectorReport> const& report)187 std::shared_ptr<ConnectorReport> const& report)
151: work(io_service),188: io_service(std::make_shared<boost::asio::io_service>()),
189 work(*io_service),
152 report(report),190 report(report),
153 connection_creator{connection_creator}191 connection_creator{connection_creator}
154{192{
@@ -163,7 +201,7 @@
163 try201 try
164 {202 {
165 report->thread_start();203 report->thread_start();
166 io_service.run();204 io_service->run();
167 report->thread_end();205 report->thread_end();
168 return;206 return;
169 }207 }
@@ -179,14 +217,14 @@
179void mf::BasicConnector::stop()217void mf::BasicConnector::stop()
180{218{
181 /* Stop processing new requests */219 /* Stop processing new requests */
182 io_service.stop();220 io_service->stop();
183221
184 /* Wait for io processing thread to finish */222 /* Wait for io processing thread to finish */
185 if (io_service_thread.joinable())223 if (io_service_thread.joinable())
186 io_service_thread.join();224 io_service_thread.join();
187225
188 /* Prepare for a potential restart */226 /* Prepare for a potential restart */
189 io_service.reset();227 io_service->reset();
190}228}
191229
192void mf::BasicConnector::create_session_for(230void mf::BasicConnector::create_session_for(
@@ -221,11 +259,13 @@
221 }259 }
222260
223 auto const server_socket = std::make_shared<boost::asio::local::stream_protocol::socket>(261 auto const server_socket = std::make_shared<boost::asio::local::stream_protocol::socket>(
224 io_service, boost::asio::local::stream_protocol(), socket_fd[server]);262 *io_service,
263 boost::asio::local::stream_protocol(),
264 socket_fd[server]);
225265
226 report->creating_socket_pair(socket_fd[server], socket_fd[client]);266 report->creating_socket_pair(socket_fd[server], socket_fd[client]);
227267
228 create_session_for(server_socket, connect_handler);268 create_session_for(make_socket_self_contained(io_service, server_socket), connect_handler);
229269
230 return socket_fd[client];270 return socket_fd[client];
231}271}
232272
=== modified file 'src/server/frontend/published_socket_connector.h'
--- src/server/frontend/published_socket_connector.h 2017-07-28 17:00:43 +0000
+++ src/server/frontend/published_socket_connector.h 2017-08-16 07:06:44 +0000
@@ -62,7 +62,7 @@
62 std::shared_ptr<boost::asio::local::stream_protocol::socket> const& server_socket,62 std::shared_ptr<boost::asio::local::stream_protocol::socket> const& server_socket,
63 std::function<void(std::shared_ptr<Session> const& session)> const& connect_handler) const;63 std::function<void(std::shared_ptr<Session> const& session)> const& connect_handler) const;
6464
65 boost::asio::io_service mutable io_service;65 std::shared_ptr<boost::asio::io_service> const io_service;
66 boost::asio::io_service::work work;66 boost::asio::io_service::work work;
67 std::shared_ptr<ConnectorReport> const report;67 std::shared_ptr<ConnectorReport> const report;
6868
6969
=== modified file 'src/server/frontend/session_mediator.cpp'
--- src/server/frontend/session_mediator.cpp 2017-07-28 17:00:43 +0000
+++ src/server/frontend/session_mediator.cpp 2017-08-16 07:06:44 +0000
@@ -60,6 +60,7 @@
60#include "mir/cookie/authority.h"60#include "mir/cookie/authority.h"
61#include "mir/module_properties.h"61#include "mir/module_properties.h"
62#include "mir/graphics/graphic_buffer_allocator.h"62#include "mir/graphics/graphic_buffer_allocator.h"
63#include "mir/executor.h"
6364
64#include "mir/geometry/rectangles.h"65#include "mir/geometry/rectangles.h"
65#include "protobuf_buffer_packer.h"66#include "protobuf_buffer_packer.h"
@@ -112,7 +113,8 @@
112 std::shared_ptr<mir::cookie::Authority> const& cookie_authority,113 std::shared_ptr<mir::cookie::Authority> const& cookie_authority,
113 std::shared_ptr<mf::InputConfigurationChanger> const& input_changer,114 std::shared_ptr<mf::InputConfigurationChanger> const& input_changer,
114 std::vector<mir::ExtensionDescription> const& extensions,115 std::vector<mir::ExtensionDescription> const& extensions,
115 std::shared_ptr<mg::GraphicBufferAllocator> const& allocator) :116 std::shared_ptr<mg::GraphicBufferAllocator> const& allocator,
117 mir::Executor& executor) :
116 client_pid_(0),118 client_pid_(0),
117 shell(shell),119 shell(shell),
118 ipc_operations(ipc_operations),120 ipc_operations(ipc_operations),
@@ -131,7 +133,8 @@
131 cookie_authority(cookie_authority),133 cookie_authority(cookie_authority),
132 input_changer(input_changer),134 input_changer(input_changer),
133 extensions(extensions),135 extensions(extensions),
134 allocator{allocator}136 allocator{allocator},
137 executor{executor}
135{138{
136}139}
137140
@@ -384,17 +387,21 @@
384 public:387 public:
385 AutoSendBuffer(388 AutoSendBuffer(
386 std::shared_ptr<mg::Buffer> const& wrapped,389 std::shared_ptr<mg::Buffer> const& wrapped,
390 mir::Executor& executor,
387 std::weak_ptr<mf::BufferSink> const& sink)391 std::weak_ptr<mf::BufferSink> const& sink)
388 : buffer{wrapped},392 : buffer{wrapped},
393 executor{executor},
389 sink{sink}394 sink{sink}
390 {395 {
391 }396 }
392 ~AutoSendBuffer()397 ~AutoSendBuffer()
393 {398 {
394 if (auto live_sink = sink.lock())399 executor.spawn(
395 {400 [maybe_sink = sink, to_send = std::move(buffer)]()
396 live_sink->update_buffer(*buffer);401 {
397 }402 if (auto const live_sink = maybe_sink.lock())
403 live_sink->update_buffer(*to_send);
404 });
398 }405 }
399406
400 std::shared_ptr<mir::graphics::NativeBuffer> native_buffer_handle() const override407 std::shared_ptr<mir::graphics::NativeBuffer> native_buffer_handle() const override
@@ -423,7 +430,8 @@
423 }430 }
424431
425 private:432 private:
426 std::shared_ptr<mg::Buffer> const buffer;433 std::shared_ptr<mg::Buffer> buffer;
434 mir::Executor& executor;
427 std::weak_ptr<mf::BufferSink> const sink;435 std::weak_ptr<mf::BufferSink> const sink;
428 };436 };
429437
@@ -446,7 +454,7 @@
446 auto b = buffer_cache.at(buffer_id);454 auto b = buffer_cache.at(buffer_id);
447 ipc_operations->unpack_buffer(request_msg, *b);455 ipc_operations->unpack_buffer(request_msg, *b);
448456
449 stream->submit_buffer(std::make_shared<AutoSendBuffer>(b, event_sink));457 stream->submit_buffer(std::make_shared<AutoSendBuffer>(b, executor, event_sink));
450458
451 done->Run();459 done->Run();
452}460}
@@ -520,8 +528,10 @@
520528
521 if (request->has_id())529 if (request->has_id())
522 {530 {
523 auto stream = session->get_buffer_stream(mf::BufferStreamId(request->id().value()));531 auto const stream_id = mf::BufferStreamId{request->id().value()};
524 stream->associate_buffer(buffer->id());532 // We don't need the stream, but we *do* need to know it exists
533 auto stream = session->get_buffer_stream(stream_id);
534 stream_associated_buffers.insert(std::make_pair(stream_id, buffer->id()));
525 }535 }
526536
527 // TODO: Throw if insert fails (duplicate ID)?537 // TODO: Throw if insert fails (duplicate ID)?
@@ -549,25 +559,35 @@
549 BOOST_THROW_EXCEPTION(std::logic_error("Invalid application session"));559 BOOST_THROW_EXCEPTION(std::logic_error("Invalid application session"));
550560
551 observer->session_release_buffers_called(session->name());561 observer->session_release_buffers_called(session->name());
562
563 std::vector<mg::BufferID> to_release(request->buffers().size());
564 std::transform(
565 request->buffers().begin(),
566 request->buffers().end(),
567 to_release.begin(),
568 [](auto buffer)
569 {
570 return mg::BufferID{static_cast<uint32_t>(buffer.buffer_id())};
571 });
572
552 if (request->has_id())573 if (request->has_id())
553 {574 {
554 auto stream_id = mf::BufferStreamId{request->id().value()};575 auto const stream_id = mf::BufferStreamId{request->id().value()};
555 try576
577 auto const associated_range = stream_associated_buffers.equal_range(stream_id);
578 for (auto match = associated_range.first; match != associated_range.second;)
556 {579 {
557 auto stream = session->get_buffer_stream(stream_id);580 auto const current = match;
558 for (auto i = 0; i < request->buffers().size(); i++)581 ++match;
582 if (std::find(to_release.begin(), to_release.end(), current->second) != to_release.end())
559 {583 {
560 mg::BufferID buffer_id{static_cast<uint32_t>(request->buffers(i).buffer_id())};584
561 stream->disassociate_buffer(buffer_id);585 stream_associated_buffers.erase(current);
562 }586 }
563 }587 }
564 catch(...)
565 {
566 }
567 }588 }
568 for (auto i = 0; i < request->buffers().size(); i++)589 for (auto const& buffer_id : to_release)
569 {590 {
570 mg::BufferID buffer_id{static_cast<uint32_t>(request->buffers(i).buffer_id())};
571 buffer_cache.erase(buffer_id);591 buffer_cache.erase(buffer_id);
572 }592 }
573 done->Run();593 done->Run();
@@ -1014,6 +1034,12 @@
10141034
1015 session->destroy_buffer_stream(id);1035 session->destroy_buffer_stream(id);
10161036
1037 auto const associated_range = stream_associated_buffers.equal_range(id) ;
1038 for (auto match = associated_range.first; match != associated_range.second; ++match)
1039 {
1040 buffer_cache.erase(match->second);
1041 }
1042
1017 done->Run();1043 done->Run();
1018}1044}
10191045
10201046
=== modified file 'src/server/frontend/session_mediator.h'
--- src/server/frontend/session_mediator.h 2017-07-28 17:00:43 +0000
+++ src/server/frontend/session_mediator.h 2017-08-16 07:06:44 +0000
@@ -40,6 +40,8 @@
4040
41namespace mir41namespace mir
42{42{
43class Executor;
44
43namespace cookie45namespace cookie
44{46{
45class Authority;47class Authority;
@@ -127,7 +129,8 @@
127 std::shared_ptr<cookie::Authority> const& cookie_authority,129 std::shared_ptr<cookie::Authority> const& cookie_authority,
128 std::shared_ptr<InputConfigurationChanger> const& input_changer,130 std::shared_ptr<InputConfigurationChanger> const& input_changer,
129 std::vector<mir::ExtensionDescription> const& extensions,131 std::vector<mir::ExtensionDescription> const& extensions,
130 std::shared_ptr<graphics::GraphicBufferAllocator> const& allocator);132 std::shared_ptr<graphics::GraphicBufferAllocator> const& allocator,
133 mir::Executor& executor);
131134
132 ~SessionMediator() noexcept;135 ~SessionMediator() noexcept;
133136
@@ -302,7 +305,9 @@
302 std::shared_ptr<InputConfigurationChanger> const input_changer;305 std::shared_ptr<InputConfigurationChanger> const input_changer;
303 std::vector<mir::ExtensionDescription> const extensions;306 std::vector<mir::ExtensionDescription> const extensions;
304 std::unordered_map<graphics::BufferID, std::shared_ptr<graphics::Buffer>> buffer_cache;307 std::unordered_map<graphics::BufferID, std::shared_ptr<graphics::Buffer>> buffer_cache;
308 std::unordered_multimap<BufferStreamId, graphics::BufferID> stream_associated_buffers;
305 std::shared_ptr<graphics::GraphicBufferAllocator> const allocator;309 std::shared_ptr<graphics::GraphicBufferAllocator> const allocator;
310 mir::Executor& executor;
306311
307 ScreencastBufferTracker screencast_buffer_tracker;312 ScreencastBufferTracker screencast_buffer_tracker;
308313
309314
=== modified file 'tests/include/mir/test/doubles/stub_buffer_stream.h'
--- tests/include/mir/test/doubles/stub_buffer_stream.h 2017-07-28 17:00:43 +0000
+++ tests/include/mir/test/doubles/stub_buffer_stream.h 2017-08-16 07:06:44 +0000
@@ -79,8 +79,6 @@
79 void add_observer(std::shared_ptr<scene::SurfaceObserver> const&) override {}79 void add_observer(std::shared_ptr<scene::SurfaceObserver> const&) override {}
80 void remove_observer(std::weak_ptr<scene::SurfaceObserver> const&) override {}80 void remove_observer(std::weak_ptr<scene::SurfaceObserver> const&) override {}
81 bool has_submitted_buffer() const override { return true; }81 bool has_submitted_buffer() const override { return true; }
82 void associate_buffer(graphics::BufferID) override {}
83 void disassociate_buffer(graphics::BufferID) override {}
84 void set_scale(float) override {}82 void set_scale(float) override {}
8583
86 std::shared_ptr<graphics::Buffer> stub_compositor_buffer;84 std::shared_ptr<graphics::Buffer> stub_compositor_buffer;
8785
=== modified file 'tests/unit-tests/compositor/test_multi_monitor_arbiter.cpp'
--- tests/unit-tests/compositor/test_multi_monitor_arbiter.cpp 2017-07-28 17:00:43 +0000
+++ tests/unit-tests/compositor/test_multi_monitor_arbiter.cpp 2017-08-16 07:06:44 +0000
@@ -39,12 +39,6 @@
39 {39 {
40 throw std::runtime_error("this stub doesnt support this");40 throw std::runtime_error("this stub doesnt support this");
41 }41 }
42 std::future<void> schedule_nonblocking(
43 std::shared_ptr<mg::Buffer> const&) override
44 {
45 throw std::runtime_error("this stub doesnt support this");
46 return {};
47 }
48 unsigned int num_scheduled() override42 unsigned int num_scheduled() override
49 {43 {
50 return sched.size() - current;44 return sched.size() - current;
5145
=== modified file 'tests/unit-tests/compositor/test_queueing_schedule.cpp'
--- tests/unit-tests/compositor/test_queueing_schedule.cpp 2017-07-28 17:00:43 +0000
+++ tests/unit-tests/compositor/test_queueing_schedule.cpp 2017-08-16 07:06:44 +0000
@@ -75,25 +75,6 @@
75 EXPECT_FALSE(schedule.num_scheduled());75 EXPECT_FALSE(schedule.num_scheduled());
76}76}
7777
78TEST_F(QueueingSchedule, nonblocking_schedule_queues_buffers_up)
79{
80 EXPECT_EQ(0u, schedule.num_scheduled());
81
82 std::vector<std::shared_ptr<mg::Buffer>> scheduled_buffers {
83 buffers[1], buffers[3], buffers[0], buffers[2], buffers[4]
84 };
85
86 for (auto& buffer : scheduled_buffers)
87 {
88 auto deferred_io = schedule.schedule_nonblocking(buffer);
89 EXPECT_FALSE(deferred_io.valid());
90 }
91
92 EXPECT_EQ(scheduled_buffers.size(), schedule.num_scheduled());
93 EXPECT_THAT(drain_queue(), ContainerEq(scheduled_buffers));
94 EXPECT_EQ(0u, schedule.num_scheduled());
95}
96
97TEST_F(QueueingSchedule, queuing_the_same_buffer_moves_it_to_front_of_queue)78TEST_F(QueueingSchedule, queuing_the_same_buffer_moves_it_to_front_of_queue)
98{79{
99 for(auto i = 0u; i < num_buffers; i++)80 for(auto i = 0u; i < num_buffers; i++)
10081
=== modified file 'tests/unit-tests/frontend/test_session_mediator.cpp'
--- tests/unit-tests/frontend/test_session_mediator.cpp 2017-07-28 17:00:43 +0000
+++ tests/unit-tests/frontend/test_session_mediator.cpp 2017-08-16 07:06:44 +0000
@@ -272,6 +272,22 @@
272 std::vector<std::weak_ptr<mg::Buffer>> allocated_buffers;272 std::vector<std::weak_ptr<mg::Buffer>> allocated_buffers;
273};273};
274274
275class MockExecutor : public mir::Executor
276{
277public:
278 MockExecutor()
279 {
280 ON_CALL(*this, spawn_thunk(_))
281 .WillByDefault(InvokeArgument<0>());
282 }
283
284 void spawn(std::function<void()>&& task) override
285 {
286 spawn_thunk(task);
287 }
288 MOCK_METHOD1(spawn_thunk, void(std::function<void()>));
289};
290
275struct SessionMediator : public ::testing::Test291struct SessionMediator : public ::testing::Test
276{292{
277 SessionMediator()293 SessionMediator()
@@ -296,7 +312,8 @@
296 mir::cookie::Authority::create(),312 mir::cookie::Authority::create(),
297 mt::fake_shared(mock_input_config_changer),313 mt::fake_shared(mock_input_config_changer),
298 {},314 {},
299 allocator}315 allocator,
316 executor}
300 {317 {
301 using namespace ::testing;318 using namespace ::testing;
302319
@@ -327,7 +344,8 @@
327 std::make_shared<mtd::NullANRDetector>(),344 std::make_shared<mtd::NullANRDetector>(),
328 mir::cookie::Authority::create(),345 mir::cookie::Authority::create(),
329 mt::fake_shared(mock_input_config_changer), std::vector<mir::ExtensionDescription>{},346 mt::fake_shared(mock_input_config_changer), std::vector<mir::ExtensionDescription>{},
330 allocator);347 allocator,
348 executor);
331 }349 }
332350
333 std::shared_ptr<mf::SessionMediator> create_session_mediator_with_screencast(351 std::shared_ptr<mf::SessionMediator> create_session_mediator_with_screencast(
@@ -343,7 +361,8 @@
343 std::make_shared<mtd::NullANRDetector>(),361 std::make_shared<mtd::NullANRDetector>(),
344 mir::cookie::Authority::create(),362 mir::cookie::Authority::create(),
345 mt::fake_shared(mock_input_config_changer), std::vector<mir::ExtensionDescription>{},363 mt::fake_shared(mock_input_config_changer), std::vector<mir::ExtensionDescription>{},
346 allocator);364 allocator,
365 executor);
347 }366 }
348367
349 std::shared_ptr<mf::SessionMediator> create_session_mediator_with_event_sink(368 std::shared_ptr<mf::SessionMediator> create_session_mediator_with_event_sink(
@@ -447,7 +466,8 @@
447 mir::cookie::Authority::create(),466 mir::cookie::Authority::create(),
448 mt::fake_shared(mock_input_config_changer),467 mt::fake_shared(mock_input_config_changer),
449 std::vector<mir::ExtensionDescription>{},468 std::vector<mir::ExtensionDescription>{},
450 allocator);469 allocator,
470 executor);
451 }471 }
452472
453 MockConnector connector;473 MockConnector connector;
@@ -462,6 +482,7 @@
462 std::shared_ptr<NiceMock<StubbedSession>> const stubbed_session;482 std::shared_ptr<NiceMock<StubbedSession>> const stubbed_session;
463 std::unique_ptr<google::protobuf::Closure> null_callback;483 std::unique_ptr<google::protobuf::Closure> null_callback;
464 std::shared_ptr<RecordingBufferAllocator> const allocator;484 std::shared_ptr<RecordingBufferAllocator> const allocator;
485 NiceMock<MockExecutor> executor;
465 mf::SessionMediator mediator;486 mf::SessionMediator mediator;
466487
467 mp::ConnectParameters connect_parameters;488 mp::ConnectParameters connect_parameters;
@@ -507,7 +528,8 @@
507 std::make_shared<mtd::NullANRDetector>(),528 std::make_shared<mtd::NullANRDetector>(),
508 mir::cookie::Authority::create(),529 mir::cookie::Authority::create(),
509 mt::fake_shared(mock_input_config_changer), {},530 mt::fake_shared(mock_input_config_changer), {},
510 allocator};531 allocator,
532 executor};
511533
512 EXPECT_THAT(connects_handled_count, Eq(0));534 EXPECT_THAT(connects_handled_count, Eq(0));
513535
@@ -997,7 +1019,8 @@
997 std::make_shared<mtd::NullANRDetector>(),1019 std::make_shared<mtd::NullANRDetector>(),
998 mir::cookie::Authority::create(),1020 mir::cookie::Authority::create(),
999 mt::fake_shared(mock_input_config_changer), {},1021 mt::fake_shared(mock_input_config_changer), {},
1000 allocator};1022 allocator,
1023 executor};
10011024
1002 ON_CALL(*shell, create_surface( _, _, _))1025 ON_CALL(*shell, create_surface( _, _, _))
1003 .WillByDefault(1026 .WillByDefault(
@@ -1155,54 +1178,6 @@
11551178
1156}1179}
11571180
1158TEST_F(SessionMediator, disassociates_buffers_from_stream_before_destroying)
1159{
1160 mp::BufferRelease release_buffer;
1161 mp::BufferAllocation allocate_buffer;
1162 mp::Void null;
1163
1164 // Add a fake BufferStream...
1165 auto stream_id = mf::BufferStreamId{42};
1166 auto stream = stubbed_session->create_mock_stream(stream_id);
1167
1168 // ...and allocate a buffer to it
1169 allocate_buffer.mutable_id()->set_value(42);
1170 auto buffer_props = allocate_buffer.add_buffer_requests();
1171 buffer_props->set_buffer_usage(0);
1172 buffer_props->set_pixel_format(0);
1173 buffer_props->set_width(230);
1174 buffer_props->set_height(230);
1175
1176 mediator.connect(&connect_parameters, &connection, null_callback.get());
1177 mediator.allocate_buffers(&allocate_buffer, &null, null_callback.get());
1178
1179 ASSERT_THAT(allocator->allocated_buffers.size(), Eq(1));
1180 auto allocated_buffer = allocator->allocated_buffers.front().lock();
1181 ASSERT_THAT(allocated_buffer, NotNull());
1182
1183 auto const buffer_id = allocated_buffer->id();
1184
1185 // Release our share of the buffer ownership.
1186 allocated_buffer.reset();
1187
1188 auto buffer_item = release_buffer.add_buffers();
1189 buffer_item->set_buffer_id(buffer_id.as_value());
1190 release_buffer.mutable_id()->set_value(stream_id.as_value());
1191
1192 EXPECT_CALL(*stream, disassociate_buffer(buffer_id))
1193 .WillOnce(InvokeWithoutArgs(
1194 [weak_buffer = allocator->allocated_buffers.front()]()
1195 {
1196 // The buffer should be live here!
1197 EXPECT_THAT(weak_buffer.lock(), NotNull());
1198 }));
1199
1200 mediator.release_buffers(&release_buffer, &null, null_callback.get());
1201
1202 // And now we expect the buffer to have been destroyed.
1203 EXPECT_THAT(allocator->allocated_buffers.front().lock(), IsNull());
1204}
1205
1206TEST_F(SessionMediator, releases_buffers_of_unknown_buffer_stream_does_not_throw)1181TEST_F(SessionMediator, releases_buffers_of_unknown_buffer_stream_does_not_throw)
1207{1182{
1208 mp::BufferStreamId stream_to_release;1183 mp::BufferStreamId stream_to_release;
@@ -1368,6 +1343,48 @@
1368 mediator->screencast_to_buffer(&screencast_request, &null, null_callback.get());1343 mediator->screencast_to_buffer(&screencast_request, &null, null_callback.get());
1369}1344}
13701345
1346TEST_F(SessionMediator, buffer_releases_are_sent_from_specified_executor)
1347{
1348 mp::BufferRelease release_buffer;
1349 mp::BufferAllocation allocate_buffer;
1350 mp::Void null;
1351
1352 // Add a fake BufferStream...
1353 auto stream_id = mf::BufferStreamId{42};
1354 auto stream = stubbed_session->create_mock_stream(stream_id);
1355
1356 // ...and allocate a buffer to it
1357 allocate_buffer.mutable_id()->set_value(42);
1358 auto buffer_props = allocate_buffer.add_buffer_requests();
1359 buffer_props->set_buffer_usage(0);
1360 buffer_props->set_pixel_format(0);
1361 buffer_props->set_width(230);
1362 buffer_props->set_height(230);
1363
1364 mediator.connect(&connect_parameters, &connection, null_callback.get());
1365 mediator.allocate_buffers(&allocate_buffer, &null, null_callback.get());
1366
1367 ASSERT_THAT(allocator->allocated_buffers.size(), Eq(1));
1368 auto allocated_buffer = allocator->allocated_buffers.front().lock();
1369 ASSERT_THAT(allocated_buffer, NotNull());
1370
1371 auto const buffer_id = allocated_buffer->id();
1372
1373 // Submit this buffer
1374 mp::BufferRequest submit_request;
1375 submit_request.mutable_id()->set_value(stream_id.as_value());
1376 submit_request.mutable_buffer()->set_buffer_id(buffer_id.as_value());
1377
1378 // Ensure the submitted buffer's lifetime ends immediately, and so should
1379 // get released to the client.
1380 ON_CALL(*stream, submit_buffer(_))
1381 .WillByDefault(Invoke([](auto const &){}));
1382 // And our buffer should be released by the executor.
1383 EXPECT_CALL(executor, spawn_thunk(_)).Times(1);
1384
1385 mediator.submit_buffer(&submit_request, &null, null_callback.get());
1386}
1387
1371namespace1388namespace
1372{1389{
1373void add_software_buffer_request(1390void add_software_buffer_request(
@@ -1540,3 +1557,36 @@
1540 allocator->allocated_buffers,1557 allocator->allocated_buffers,
1541 Each(Property(&std::weak_ptr<mg::Buffer>::expired, Eq(true))));1558 Each(Property(&std::weak_ptr<mg::Buffer>::expired, Eq(true))));
1542}1559}
1560
1561TEST_F(SessionMediator, release_buffer_stream_releases_associated_buffers)
1562{
1563 mp::BufferStreamId stream_id;
1564 mp::BufferAllocation allocate_buffer;
1565 mp::Void null;
1566
1567 // Add a fake BufferStream...
1568 stream_id.set_value(42);
1569 auto stream = stubbed_session->create_mock_stream(mf::BufferStreamId{stream_id.value()});
1570
1571 // ...and allocate some buffers to it
1572 *allocate_buffer.mutable_id() = stream_id;
1573 add_software_buffer_request(allocate_buffer, 640, 480, mir_pixel_format_argb_8888);
1574 add_software_buffer_request(allocate_buffer, 640, 480, mir_pixel_format_argb_8888);
1575 add_software_buffer_request(allocate_buffer, 640, 480, mir_pixel_format_argb_8888);
1576
1577 mediator.connect(&connect_parameters, &connection, null_callback.get());
1578 mediator.allocate_buffers(&allocate_buffer, &null, null_callback.get());
1579
1580 // All the buffers should have been allocated and should be live
1581 ASSERT_THAT(allocator->allocated_buffers.size(), Eq(3));
1582 ASSERT_THAT(
1583 allocator->allocated_buffers,
1584 Each(Property(&std::weak_ptr<mg::Buffer>::expired, Eq(false))));
1585
1586 mediator.release_buffer_stream(&stream_id, &null, null_callback.get());
1587
1588 // Releasing the BufferStream should have ended the lifetime of all the buffers allocated to it.
1589 EXPECT_THAT(
1590 allocator->allocated_buffers,
1591 Each(Property(&std::weak_ptr<mg::Buffer>::expired, Eq(true))));
1592}

Subscribers

People subscribed via source and target branches