mirror of
https://github.com/albfan/miraclecast.git
synced 2025-02-15 04:42:06 +00:00
miracle-dispd: fix session life-cycle managed issue
when a session is destroyed due to peer free event, dispd_out_session must detach from sink to it won't cause double free. Change-Id: I71ad7e977fa71ec84f12f5e914786aa24a650f34
This commit is contained in:
parent
13b0de7dec
commit
65535afa44
5 changed files with 29 additions and 5 deletions
|
@ -728,9 +728,14 @@ static int dispd_dbus_session_teardown(sd_bus_message *m,
|
|||
sd_bus_error *ret_error)
|
||||
{
|
||||
struct dispd_session *s = userdata;
|
||||
int r = dispd_session_teardown(s);
|
||||
int r = 0;
|
||||
|
||||
if(dispd_session_is_established(s)) {
|
||||
r = dispd_session_teardown(s);
|
||||
}
|
||||
|
||||
if(0 > r) {
|
||||
return log_ERRNO();
|
||||
dispd_session_destroy(s);
|
||||
}
|
||||
|
||||
r = sd_bus_reply_method_return(m, NULL);
|
||||
|
|
|
@ -902,6 +902,17 @@ static int dispd_out_session_request_set_parameter(struct dispd_session *s,
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int dispd_fn_sink_detach(struct dispd_sink *sink)
|
||||
{
|
||||
assert_ret(sink);
|
||||
assert_ret(dispd_is_out_session(sink->session));
|
||||
|
||||
dispd_out_session(sink->session)->sink = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct rtsp_dispatch_entry out_session_rtsp_disp_tbl[] = {
|
||||
[RTSP_M1_REQUEST_SINK_OPTIONS] = {
|
||||
.request = dispd_out_session_request_options,
|
||||
|
|
|
@ -165,7 +165,8 @@ bool dispd_session_is_established(struct dispd_session *s)
|
|||
{
|
||||
assert_retv(dispd_is_session(s), false);
|
||||
|
||||
return DISPD_SESSION_STATE_ESTABLISHED <= s->state;
|
||||
return DISPD_SESSION_STATE_ESTABLISHED <= s->state &&
|
||||
DISPD_SESSION_STATE_TEARING_DOWN > s->state;
|
||||
}
|
||||
|
||||
int dispd_session_resume(struct dispd_session *s)
|
||||
|
|
|
@ -36,11 +36,12 @@ static int dispd_sink_set_session(struct dispd_sink *sink,
|
|||
if(session) {
|
||||
r = dispd_add_session(dispd_get(), session);
|
||||
if(0 > r) {
|
||||
return r;
|
||||
return log_ERR(r);
|
||||
}
|
||||
}
|
||||
|
||||
if(sink->session) {
|
||||
dispd_fn_sink_detach(sink);
|
||||
dispd_remove_session_by_id(dispd_get(),
|
||||
dispd_session_get_id(sink->session),
|
||||
NULL);
|
||||
|
@ -152,9 +153,14 @@ int dispd_sink_create_session(struct dispd_sink *sink, struct dispd_session **ou
|
|||
|
||||
int dispd_fn_out_session_ended(struct dispd_session *s)
|
||||
{
|
||||
struct dispd_sink *sink;
|
||||
|
||||
assert_ret(dispd_is_out_session(s));
|
||||
|
||||
dispd_sink_set_session(dispd_out_session_get_sink(s), NULL);
|
||||
sink = dispd_out_session_get_sink(s);
|
||||
if(sink) {
|
||||
dispd_sink_set_session(sink, NULL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -216,5 +216,6 @@ int dispd_fn_out_session_ended(struct dispd_session *s);
|
|||
|
||||
int dispd_fn_sink_new(struct dispd_sink *s);
|
||||
int dispd_fn_sink_free(struct dispd_sink *s);
|
||||
int dispd_fn_sink_detach(struct dispd_sink *s);
|
||||
|
||||
#endif /* DISP_DISP_H */
|
||||
|
|
Loading…
Reference in a new issue