Merge lp:~phablet-team/media-hub/disconnect-playback_status_changed_signal into lp:media-hub

Proposed by Jim Hodapp
Status: Merged
Approved by: Ricardo Mendoza
Approved revision: 131
Merged at revision: 128
Proposed branch: lp:~phablet-team/media-hub/disconnect-playback_status_changed_signal
Merge into: lp:media-hub
Prerequisite: lp:~phablet-team/media-hub/use-transact-method
Diff against target: 126 lines (+34/-6)
2 files modified
src/core/media/player_implementation.cpp (+30/-6)
src/core/media/player_implementation.h (+4/-0)
To merge this branch: bzr merge lp:~phablet-team/media-hub/disconnect-playback_status_changed_signal
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Ubuntu Phablet Team Pending
Review via email: mp+253564@code.launchpad.net

Commit message

Disconnect playback_status_changed_signal in ~Private() to avoid a deadlock.

Description of the change

* Disconnect playback_status_changed_signal in ~Private() to avoid a deadlock.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/core/media/player_implementation.cpp'
2--- src/core/media/player_implementation.cpp 2015-03-19 19:11:01 +0000
3+++ src/core/media/player_implementation.cpp 2015-03-19 19:11:01 +0000
4@@ -62,8 +62,10 @@
5 system_wakelock_count(0),
6 display_wakelock_count(0),
7 previous_state(Engine::State::stopped),
8- engine_state_change_connection(engine->state().changed().connect(make_state_change_handler()))
9+ engine_state_change_connection(engine->state().changed().connect(make_state_change_handler())),
10+ engine_playback_status_change_connection(engine->playback_status_changed_signal().connect(make_playback_status_change_handler()))
11 {
12+ std::cout << "Private parent instance: " << parent << std::endl;
13 // Poor man's logging of release/acquire events.
14 display_state_lock->acquired().connect([](media::power::DisplayState state)
15 {
16@@ -96,6 +98,12 @@
17 // trigger the state change handler. Ensure the handler is not called
18 // by disconnecting the state change signal
19 engine_state_change_connection.disconnect();
20+
21+ std::cout << "** Disconnecting playback_status_changed_signal connection";
22+ // The engine destructor can lead to a playback status change which will
23+ // trigger the playback status change handler. Ensure the handler is not called
24+ // by disconnecting the playback status change signal
25+ engine_playback_status_change_connection.disconnect();
26 }
27
28 std::function<void(const Engine::State& state)> make_state_change_handler()
29@@ -107,6 +115,7 @@
30 */
31 return [this](const Engine::State& state)
32 {
33+ std::cout << "Setting state for parent: " << parent << std::endl;
34 switch(state)
35 {
36 case Engine::State::ready:
37@@ -125,6 +134,7 @@
38 parent->meta_data_for_current_track().set(std::get<1>(engine->track_meta_data().get()));
39 // And update our playback status.
40 parent->playback_status().set(media::Player::playing);
41+ std::cout << "Requesting power state" << std::endl;
42 request_power_state();
43 break;
44 }
45@@ -155,14 +165,25 @@
46 };
47 }
48
49+ std::function<void(const media::Player::PlaybackStatus& status)> make_playback_status_change_handler()
50+ {
51+ return [this](const media::Player::PlaybackStatus& status)
52+ {
53+ std::cout << "Emiting playback_status_changed for parent: " << parent << std::endl;
54+ parent->emit_playback_status_changed(status);
55+ };
56+ }
57+
58 void request_power_state()
59 {
60+ std::cout << __PRETTY_FUNCTION__ << std::endl;
61 try
62 {
63 if (parent->is_video_source())
64 {
65 if (++display_wakelock_count == 1)
66 {
67+ std::cout << "Requesting new display wakelock." << std::endl;
68 display_state_lock->request_acquire(media::power::DisplayState::on);
69 std::cout << "Requested new display wakelock." << std::endl;
70 }
71@@ -171,6 +192,7 @@
72 {
73 if (++system_wakelock_count == 1)
74 {
75+ std::cout << "Requesting new system wakelock." << std::endl;
76 system_state_lock->request_acquire(media::power::SystemState::active);
77 std::cout << "Requested new system wakelock." << std::endl;
78 }
79@@ -274,6 +296,7 @@
80 Engine::State previous_state;
81 core::Signal<> on_client_disconnected;
82 core::Connection engine_state_change_connection;
83+ core::Connection engine_playback_status_change_connection;
84 };
85
86 template<typename Parent>
87@@ -379,11 +402,6 @@
88 Parent::end_of_stream()();
89 });
90
91- d->engine->playback_status_changed_signal().connect([this](const Player::PlaybackStatus& status)
92- {
93- Parent::playback_status_changed()(status);
94- });
95-
96 d->engine->video_dimension_changed_signal().connect([this](const media::video::Dimensions& dimensions)
97 {
98 Parent::video_dimension_changed()(dimensions);
99@@ -519,6 +537,12 @@
100 return d->on_client_disconnected;
101 }
102
103+template<typename Parent>
104+void media::PlayerImplementation<Parent>::emit_playback_status_changed(const media::Player::PlaybackStatus &status)
105+{
106+ Parent::playback_status_changed()(status);
107+}
108+
109 #include <core/media/player_skeleton.h>
110
111 // For linking purposes, we have to make sure that we have all symbols included within the dso.
112
113=== modified file 'src/core/media/player_implementation.h'
114--- src/core/media/player_implementation.h 2015-03-19 19:11:01 +0000
115+++ src/core/media/player_implementation.h 2015-03-19 19:11:01 +0000
116@@ -70,6 +70,10 @@
117 virtual void seek_to(const std::chrono::microseconds& offset);
118
119 const core::Signal<>& on_client_disconnected() const;
120+
121+protected:
122+ void emit_playback_status_changed(const Player::PlaybackStatus &status);
123+
124 private:
125 struct Private;
126 std::shared_ptr<Private> d;

Subscribers

People subscribed via source and target branches

to all changes: