mirror of
https://github.com/albfan/miraclecast.git
synced 2025-03-09 23:38:56 +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)
|
sd_bus_error *ret_error)
|
||||||
{
|
{
|
||||||
struct dispd_session *s = userdata;
|
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) {
|
if(0 > r) {
|
||||||
return log_ERRNO();
|
dispd_session_destroy(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
r = sd_bus_reply_method_return(m, NULL);
|
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;
|
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[] = {
|
static const struct rtsp_dispatch_entry out_session_rtsp_disp_tbl[] = {
|
||||||
[RTSP_M1_REQUEST_SINK_OPTIONS] = {
|
[RTSP_M1_REQUEST_SINK_OPTIONS] = {
|
||||||
.request = dispd_out_session_request_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);
|
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)
|
int dispd_session_resume(struct dispd_session *s)
|
||||||
|
|
|
@ -36,11 +36,12 @@ static int dispd_sink_set_session(struct dispd_sink *sink,
|
||||||
if(session) {
|
if(session) {
|
||||||
r = dispd_add_session(dispd_get(), session);
|
r = dispd_add_session(dispd_get(), session);
|
||||||
if(0 > r) {
|
if(0 > r) {
|
||||||
return r;
|
return log_ERR(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sink->session) {
|
if(sink->session) {
|
||||||
|
dispd_fn_sink_detach(sink);
|
||||||
dispd_remove_session_by_id(dispd_get(),
|
dispd_remove_session_by_id(dispd_get(),
|
||||||
dispd_session_get_id(sink->session),
|
dispd_session_get_id(sink->session),
|
||||||
NULL);
|
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)
|
int dispd_fn_out_session_ended(struct dispd_session *s)
|
||||||
{
|
{
|
||||||
|
struct dispd_sink *sink;
|
||||||
|
|
||||||
assert_ret(dispd_is_out_session(s));
|
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;
|
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_new(struct dispd_sink *s);
|
||||||
int dispd_fn_sink_free(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 */
|
#endif /* DISP_DISP_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue