Skip to content

Commit fb2babf

Browse files
committed
Ericsson KMS crash try 1
(cherry picked from commit 7940818a6e63d1173d47b0748697afb5fbf466e5) (cherry picked from commit 0d2a430)
1 parent a96b537 commit fb2babf

File tree

5 files changed

+596
-38
lines changed

5 files changed

+596
-38
lines changed

src/server/implementation/objects/ComposedObjectImpl.cpp

+78-24
Original file line numberDiff line numberDiff line change
@@ -84,82 +84,124 @@ ComposedObjectImpl::disconnectForwardSignals ()
8484
void
8585
ComposedObjectImpl::connectForwardSignals ()
8686
{
87-
connElementConnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementConnected.connect([ & ] (
87+
std::weak_ptr<MediaObject> wt = shared_from_this ();
88+
89+
connElementConnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementConnected.connect([ &, wt ] (
8890
ElementConnected event) {
91+
std::shared_ptr<MediaObject> sth = wt.lock ();
92+
if (!sth)
93+
return;
94+
8995
//We don't raise internal connection events'
9096
if (event.getSource()==srcPt)
9197
return;
9298
if (event.getSink () == sinkPt)
9399
return;
94-
raiseEvent<ElementConnected> (event, shared_from_this(), signalElementConnected);
100+
raiseEvent<ElementConnected> (event, sth, signalElementConnected);
95101
});
96102

97-
connElementConnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementConnected.connect([ & ] (
103+
connElementConnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementConnected.connect([ &, wt ] (
98104
ElementConnected event) {
105+
std::shared_ptr<MediaObject> sth = wt.lock ();
106+
if (!sth)
107+
return;
108+
99109
//We don't raise internal connection events'
100110
if (event.getSource()==srcPt)
101111
return;
102112
if (event.getSink () == sinkPt)
103113
return;
104-
raiseEvent<ElementConnected> (event, shared_from_this(), signalElementConnected);
114+
raiseEvent<ElementConnected> (event, sth, signalElementConnected);
105115
});
106116

107-
connElementDisconnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementDisconnected.connect([ & ] (
117+
connElementDisconnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementDisconnected.connect([ &, wt ] (
108118
ElementDisconnected event) {
109119
try {
120+
std::shared_ptr<MediaObject> sth = wt.lock ();
121+
if (!sth)
122+
return;
123+
110124
//We don't raise internal connection events'
111125
if (event.getSource()==srcPt)
112126
return;
113127
if (event.getSink () == sinkPt)
114128
return;
115-
raiseEvent<ElementDisconnected> (event, shared_from_this(), signalElementDisconnected);
129+
raiseEvent<ElementDisconnected> (event, sth, signalElementDisconnected);
116130
} catch (const std::bad_weak_ptr &e) {
117131
// shared_from_this()
118132
}
119133
});
120134

121-
connElementDisconnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementDisconnected.connect([ & ] (
135+
connElementDisconnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementDisconnected.connect([ &, wt ] (
122136
ElementDisconnected event) {
123137
try {
138+
std::shared_ptr<MediaObject> sth = wt.lock ();
139+
if (!sth)
140+
return;
141+
124142
//We don't raise internal connection events'
125143
if (event.getSource()==srcPt)
126144
return;
127145
if (event.getSink () == sinkPt)
128146
return;
129-
raiseEvent<ElementDisconnected> (event, shared_from_this(), signalElementDisconnected);
147+
raiseEvent<ElementDisconnected> (event, sth, signalElementDisconnected);
130148
} catch (const std::bad_weak_ptr &e) {
131149
// shared_from_this()
132150
}
133151
});
134152

135-
connMediaTranscodingStateChangeSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaTranscodingStateChange.connect([ & ] (
153+
connMediaTranscodingStateChangeSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaTranscodingStateChange.connect([ &, wt ] (
136154
MediaTranscodingStateChange event) {
137-
raiseEvent<MediaTranscodingStateChange> (event, shared_from_this(), signalMediaTranscodingStateChange);
155+
std::shared_ptr<MediaObject> sth = wt.lock ();
156+
if (!sth)
157+
return;
158+
159+
raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
138160
});
139161

140-
connMediaTranscodingStateChangeSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaTranscodingStateChange.connect([ & ] (
162+
connMediaTranscodingStateChangeSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaTranscodingStateChange.connect([ &, wt ] (
141163
MediaTranscodingStateChange event) {
142-
raiseEvent<MediaTranscodingStateChange> (event, shared_from_this(), signalMediaTranscodingStateChange);
164+
std::shared_ptr<MediaObject> sth = wt.lock ();
165+
if (!sth)
166+
return;
167+
168+
raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
143169
});
144170

145-
connMediaFlowOutStateChange = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaFlowOutStateChange.connect([ & ] (
171+
connMediaFlowOutStateChange = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaFlowOutStateChange.connect([ &, wt ] (
146172
MediaFlowOutStateChange event) {
147-
raiseEvent<MediaFlowOutStateChange> (event, shared_from_this(), signalMediaFlowOutStateChange);
173+
std::shared_ptr<MediaObject> sth = wt.lock ();
174+
if (!sth)
175+
return;
176+
177+
raiseEvent<MediaFlowOutStateChange> (event, sth, signalMediaFlowOutStateChange);
148178
});
149179

150-
connMediaFlowInStateChange = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaFlowInStateChange.connect([ & ] (
180+
connMediaFlowInStateChange = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaFlowInStateChange.connect([ &, wt ] (
151181
MediaFlowInStateChange event) {
152-
raiseEvent<MediaFlowInStateChange> (event, shared_from_this(), signalMediaFlowInStateChange);
182+
std::shared_ptr<MediaObject> sth = wt.lock ();
183+
if (!sth)
184+
return;
185+
186+
raiseEvent<MediaFlowInStateChange> (event, sth, signalMediaFlowInStateChange);
153187
});
154188

155-
connErrorSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalError.connect([ & ] (
189+
connErrorSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalError.connect([ &, wt ] (
156190
Error event) {
157-
raiseEvent<Error> (event, shared_from_this(), signalError);
191+
std::shared_ptr<MediaObject> sth = wt.lock ();
192+
if (!sth)
193+
return;
194+
195+
raiseEvent<Error> (event, sth, signalError);
158196
});
159197

160-
connErrorSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalError.connect([ & ] (
198+
connErrorSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalError.connect([ &, wt ] (
161199
Error event) {
162-
raiseEvent<Error> (event, shared_from_this(), signalError);
200+
std::shared_ptr<MediaObject> sth = wt.lock ();
201+
if (!sth)
202+
return;
203+
204+
raiseEvent<Error> (event, sth, signalError);
163205
});
164206
}
165207

@@ -253,23 +295,35 @@ void ComposedObjectImpl::linkMediaElement(std::shared_ptr<MediaElement> linkSrc,
253295

254296
// Link source and sink from new composed object
255297
if (linkedSource != NULL) {
298+
std::weak_ptr<MediaObject> wt = shared_from_this();
299+
256300
// Link Source
257301
linkedSource->connect(sinkPt);
258302

259-
connErrorlinkedSrc = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalError.connect([ & ] (
303+
connErrorlinkedSrc = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalError.connect([ &, wt ] (
260304
Error event) {
261-
raiseEvent<Error> (event, shared_from_this(), signalError);
305+
std::shared_ptr<MediaObject> sth = wt.lock ();
306+
if (!sth)
307+
return;
308+
309+
raiseEvent<Error> (event, sth, signalError);
262310
});
263311

264312
}
265313
if (linkedSink != NULL) {
314+
std::weak_ptr<MediaObject> wt = shared_from_this();
315+
266316
// Link sink
267317
srcPt->connect(linkedSink);
268318

269319
if (linkedSink != linkedSource) {
270-
connErrorlinkedSink = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalError.connect([ & ] (
320+
connErrorlinkedSink = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalError.connect([ &, wt ] (
271321
Error event) {
272-
raiseEvent<Error> (event, shared_from_this(), signalError);
322+
std::shared_ptr<MediaObject> sth = wt.lock ();
323+
if (!sth)
324+
return;
325+
326+
raiseEvent<Error> (event, sth, signalError);
273327
});
274328
}
275329
}

src/server/implementation/objects/ComposedObjectImpl.hpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,24 @@ class ComposedObjectImpl : public MediaElementImpl
7171
template<typename T>
7272
sigc::connection connectEventToExternalHandler (sigc::signal<void, T>& signal, std::weak_ptr<EventHandler>& wh)
7373
{
74-
sigc::connection conn = signal.connect ([ &, wh] (T event) {
74+
std::weak_ptr<MediaObject> wt = shared_from_this();
75+
76+
sigc::connection conn = signal.connect ([ &, wh, wt] (T event) {
7577
std::shared_ptr<EventHandler> lh = wh.lock();
7678
if (!lh)
7779
return;
7880

81+
std::shared_ptr<MediaObject> sth = wt.lock ();
82+
if (!sth)
83+
return;
84+
7985
std::shared_ptr<T> ev_ref (new T(event));
80-
auto object = this->shared_from_this();
8186

82-
lh->sendEventAsync ([ev_ref, object, lh] {
87+
lh->sendEventAsync ([ev_ref, sth, lh] {
8388
JsonSerializer s (true);
8489

8590
s.Serialize ("data", ev_ref.get());
86-
s.Serialize ("object", object.get());
91+
s.Serialize ("object", sth.get());
8792
s.JsonValue["type"] = T::getName().c_str();
8893

8994
lh->sendEvent (s.JsonValue);

src/server/implementation/objects/FacadeRtpEndpointImpl.cpp

+31-10
Original file line numberDiff line numberDiff line change
@@ -1061,30 +1061,51 @@ FacadeRtpEndpointImpl::disconnectForwardSignals ()
10611061
void
10621062
FacadeRtpEndpointImpl::connectForwardSignals ()
10631063
{
1064+
std::weak_ptr<MediaObject> wt = shared_from_this ();
10641065

1065-
connMediaStateChanged = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalMediaStateChanged.connect([ & ] (
1066+
connMediaStateChanged = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalMediaStateChanged.connect([ &, wt ] (
10661067
MediaStateChanged event) {
1067-
raiseEvent<MediaStateChanged> (event, shared_from_this(), signalMediaStateChanged);
1068+
std::shared_ptr<MediaObject> sth = wt.lock ();
1069+
if (!sth)
1070+
return;
1071+
1072+
raiseEvent<MediaStateChanged> (event, sth, signalMediaStateChanged);
10681073
});
10691074

1070-
connConnectionStateChanged = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalConnectionStateChanged.connect([ & ] (
1075+
connConnectionStateChanged = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalConnectionStateChanged.connect([ &, wt ] (
10711076
ConnectionStateChanged event) {
1072-
raiseEvent<ConnectionStateChanged> (event, shared_from_this(), signalConnectionStateChanged);
1077+
std::shared_ptr<MediaObject> sth = wt.lock ();
1078+
if (!sth)
1079+
return;
1080+
1081+
raiseEvent<ConnectionStateChanged> (event, sth, signalConnectionStateChanged);
10731082
});
10741083

1075-
connMediaSessionStarted = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalMediaSessionStarted.connect([ & ] (
1084+
connMediaSessionStarted = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalMediaSessionStarted.connect([ &, wt ] (
10761085
MediaSessionStarted event) {
1077-
raiseEvent<MediaSessionStarted> (event, shared_from_this(), signalMediaSessionStarted);
1086+
std::shared_ptr<MediaObject> sth = wt.lock ();
1087+
if (!sth)
1088+
return;
1089+
1090+
raiseEvent<MediaSessionStarted> (event, sth, signalMediaSessionStarted);
10781091
});
10791092

1080-
connMediaSessionTerminated = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalMediaSessionTerminated.connect([ & ] (
1093+
connMediaSessionTerminated = std::dynamic_pointer_cast<BaseRtpEndpointImpl>(rtp_ep)->signalMediaSessionTerminated.connect([ &, wt ] (
10811094
MediaSessionTerminated event) {
1082-
raiseEvent<MediaSessionTerminated> (event, shared_from_this(), signalMediaSessionTerminated);
1095+
std::shared_ptr<MediaObject> sth = wt.lock ();
1096+
if (!sth)
1097+
return;
1098+
1099+
raiseEvent<MediaSessionTerminated> (event, sth, signalMediaSessionTerminated);
10831100
});
10841101

1085-
connOnKeySoftLimit = rtp_ep->signalOnKeySoftLimit.connect([ & ] (
1102+
connOnKeySoftLimit = rtp_ep->signalOnKeySoftLimit.connect([ &, wt ] (
10861103
OnKeySoftLimit event) {
1087-
raiseEvent<OnKeySoftLimit> (event, shared_from_this(), signalOnKeySoftLimit);
1104+
std::shared_ptr<MediaObject> sth = wt.lock ();
1105+
if (!sth)
1106+
return;
1107+
1108+
raiseEvent<OnKeySoftLimit> (event, sth, signalOnKeySoftLimit);
10881109
});
10891110

10901111
}

tests/server/CMakeLists.txt

+21
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,24 @@ target_link_libraries(test_sip_rtp_endpoint_agnostic_srtp
130130
${Boost_SYSTEM_LIBRARY}
131131
)
132132

133+
134+
add_test_program(test_event_forwarding eventForwarding.cpp)
135+
add_dependencies(test_event_forwarding kmssiprtpmodule)
136+
set_property(TARGET test_event_forwarding
137+
PROPERTY INCLUDE_DIRECTORIES
138+
${KmsJsonRpc_INCLUDE_DIRS}
139+
${sigc++-2.0_INCLUDE_DIRS}
140+
${CMAKE_CURRENT_SOURCE_DIR}/../../src/server/implementation/objects
141+
${CMAKE_CURRENT_SOURCE_DIR}/../../src/server/implementation
142+
${CMAKE_CURRENT_SOURCE_DIR}/../../src/server/interface
143+
${CMAKE_CURRENT_BINARY_DIR}/../../src/server/interface/generated-cpp
144+
${CMAKE_CURRENT_BINARY_DIR}/../../src/server/implementation/generated-cpp
145+
${KMSCORE_INCLUDE_DIRS}
146+
${gstreamer-1.5_INCLUDE_DIRS}
147+
)
148+
target_link_libraries(test_event_forwarding
149+
${LIBRARY_NAME}impl
150+
${KMSCORE_LIBRARIES}
151+
${Boost_FILESYSTEM_LIBRARY}
152+
${Boost_SYSTEM_LIBRARY}
153+
)

0 commit comments

Comments
 (0)