stream: don't destroy proxy twice

When the proxy was removed, we remove the event listener and don't
set the proxy to NULL because the destroy event is not called anymore.
If we then call disconnect twice, we try to destroy the proxy again
and assert.
This commit is contained in:
Wim Taymans 2020-06-05 17:34:16 +02:00
parent 2462cac4f2
commit aaaa541775
2 changed files with 8 additions and 5 deletions

View file

@ -881,6 +881,7 @@ static const struct spa_node_methods impl_node = {
static void proxy_removed(void *_data) static void proxy_removed(void *_data)
{ {
struct pw_filter *filter = _data; struct pw_filter *filter = _data;
pw_log_debug(NAME" %p: removed", filter);
spa_hook_remove(&filter->proxy_listener); spa_hook_remove(&filter->proxy_listener);
filter->node_id = SPA_ID_INVALID; filter->node_id = SPA_ID_INVALID;
filter_set_state(filter, PW_FILTER_STATE_UNCONNECTED, NULL); filter_set_state(filter, PW_FILTER_STATE_UNCONNECTED, NULL);
@ -889,8 +890,8 @@ static void proxy_removed(void *_data)
static void proxy_destroy(void *_data) static void proxy_destroy(void *_data)
{ {
struct pw_filter *filter = _data; struct pw_filter *filter = _data;
pw_log_debug(NAME" %p: destroy", filter);
proxy_removed(_data); proxy_removed(_data);
filter->proxy = NULL;
} }
static void proxy_error(void *_data, int seq, int res, const char *message) static void proxy_error(void *_data, int seq, int res, const char *message)
@ -1280,9 +1281,10 @@ int pw_filter_disconnect(struct pw_filter *filter)
pw_log_debug(NAME" %p: disconnect", filter); pw_log_debug(NAME" %p: disconnect", filter);
impl->disconnecting = true; impl->disconnecting = true;
if (filter->proxy) if (filter->proxy) {
pw_proxy_destroy(filter->proxy); pw_proxy_destroy(filter->proxy);
filter->proxy = NULL;
}
if (impl->disconnect_core) { if (impl->disconnect_core) {
impl->disconnect_core = false; impl->disconnect_core = false;
spa_hook_remove(&filter->core_listener); spa_hook_remove(&filter->core_listener);

View file

@ -841,7 +841,6 @@ static void proxy_destroy(void *_data)
struct pw_stream *stream = _data; struct pw_stream *stream = _data;
pw_log_debug(NAME" %p: destroy", stream); pw_log_debug(NAME" %p: destroy", stream);
proxy_removed(_data); proxy_removed(_data);
stream->proxy = NULL;
} }
static void proxy_error(void *_data, int seq, int res, const char *message) static void proxy_error(void *_data, int seq, int res, const char *message)
@ -1582,8 +1581,10 @@ int pw_stream_disconnect(struct pw_stream *stream)
if (impl->node) if (impl->node)
pw_impl_node_set_active(impl->node, false); pw_impl_node_set_active(impl->node, false);
if (stream->proxy) if (stream->proxy) {
pw_proxy_destroy(stream->proxy); pw_proxy_destroy(stream->proxy);
stream->proxy = NULL;
}
if (impl->node) { if (impl->node) {
pw_impl_node_destroy(impl->node); pw_impl_node_destroy(impl->node);