core-proxy: improve cleanup

Also disconnect filters.
Ignore multiple destroy calls. This can happen when the protocol
destroys the core-proxy and some implementation cleanup code
does the same. The cleanup code can't reliably know about this
cleanup.
This commit is contained in:
Wim Taymans 2019-12-09 12:30:49 +01:00
parent e27331a25e
commit b5811280ef
2 changed files with 13 additions and 6 deletions

View file

@ -183,30 +183,35 @@ static void core_proxy_destroy(void *data)
{ {
struct pw_core_proxy *core_proxy = data; struct pw_core_proxy *core_proxy = data;
struct pw_stream *stream, *s2; struct pw_stream *stream, *s2;
struct pw_filter *filter; struct pw_filter *filter, *f2;
if (core_proxy->destroyed)
return;
core_proxy->destroyed = true;
pw_log_debug(NAME" %p: core proxy destroy", core_proxy); pw_log_debug(NAME" %p: core proxy destroy", core_proxy);
spa_list_remove(&core_proxy->link);
spa_list_for_each_safe(stream, s2, &core_proxy->stream_list, link) spa_list_for_each_safe(stream, s2, &core_proxy->stream_list, link)
pw_stream_disconnect(stream); pw_stream_disconnect(stream);
spa_list_for_each_safe(filter, f2, &core_proxy->filter_list, link)
pw_filter_disconnect(filter);
pw_protocol_client_disconnect(core_proxy->conn); pw_protocol_client_disconnect(core_proxy->conn);
core_proxy->client_proxy = NULL; core_proxy->client_proxy = NULL;
pw_map_for_each(&core_proxy->objects, destroy_proxy, core_proxy); pw_map_for_each(&core_proxy->objects, destroy_proxy, core_proxy);
pw_map_reset(&core_proxy->objects); pw_map_reset(&core_proxy->objects);
pw_mempool_destroy(core_proxy->pool);
spa_list_consume(stream, &core_proxy->stream_list, link) spa_list_consume(stream, &core_proxy->stream_list, link)
pw_stream_destroy(stream); pw_stream_destroy(stream);
spa_list_consume(filter, &core_proxy->filter_list, link) spa_list_consume(filter, &core_proxy->filter_list, link)
pw_filter_destroy(filter); pw_filter_destroy(filter);
pw_protocol_client_destroy(core_proxy->conn); pw_mempool_destroy(core_proxy->pool);
spa_list_remove(&core_proxy->link); pw_protocol_client_destroy(core_proxy->conn);
pw_map_clear(&core_proxy->objects); pw_map_clear(&core_proxy->objects);

View file

@ -753,6 +753,8 @@ struct pw_core_proxy {
int recv_seq; /**< last received sequence number */ int recv_seq; /**< last received sequence number */
int send_seq; /**< last protocol result code */ int send_seq; /**< last protocol result code */
unsigned int destroyed:1;
void *user_data; /**< extra user data */ void *user_data; /**< extra user data */
}; };