diff --git a/src/modules/module-client-device.c b/src/modules/module-client-device.c index 92a184b80..cf3bae362 100644 --- a/src/modules/module-client-device.c +++ b/src/modules/module-client-device.c @@ -56,7 +56,8 @@ struct pw_proxy *pw_core_spa_device_export(struct pw_core *core, struct pw_protocol *pw_protocol_native_ext_client_device_init(struct pw_context *context); struct factory_data { - struct pw_impl_factory *this; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; struct pw_impl_module *module; struct spa_hook module_listener; @@ -72,7 +73,7 @@ static void *create_object(void *_data, uint32_t new_id) { struct factory_data *data = _data; - struct pw_impl_factory *this = data->this; + struct pw_impl_factory *factory = data->factory; void *result; struct pw_resource *device_resource; struct pw_impl_client *client; @@ -98,7 +99,7 @@ static void *create_object(void *_data, } pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_global_get_id(pw_impl_factory_get_global(this))); + pw_global_get_id(pw_impl_factory_get_global(factory))); pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", pw_global_get_id(pw_impl_client_get_global(client))); @@ -134,22 +135,35 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; - spa_hook_remove(&d->module_listener); - spa_list_remove(&d->export_spadevice.link); - - pw_impl_factory_destroy(d->this); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -190,7 +204,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; pw_log_debug("module %p: new", module); @@ -206,12 +220,13 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) pw_protocol_native_ext_client_device_init(context); + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); pw_impl_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); return 0; error: - pw_impl_factory_destroy(data->this); + pw_impl_factory_destroy(data->factory); return res; } diff --git a/src/modules/module-client-node.c b/src/modules/module-client-node.c index 092d9854d..4dc9bf813 100644 --- a/src/modules/module-client-node.c +++ b/src/modules/module-client-node.c @@ -59,7 +59,8 @@ struct pw_protocol *pw_protocol_native_ext_client_node_init(struct pw_context *c struct pw_protocol *pw_protocol_native_ext_client_node0_init(struct pw_context *context); struct factory_data { - struct pw_impl_factory *this; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; struct pw_impl_module *module; struct spa_hook module_listener; @@ -121,23 +122,38 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; spa_hook_remove(&d->module_listener); - spa_list_remove(&d->export_node.link); spa_list_remove(&d->export_spanode.link); - pw_impl_factory_destroy(d->this); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -177,7 +193,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; pw_log_debug("module %p: new", module); @@ -199,6 +215,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) pw_protocol_native_ext_client_node_init(context); pw_protocol_native_ext_client_node0_init(context); + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); pw_impl_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); @@ -207,6 +224,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) error_remove: spa_list_remove(&data->export_node.link); error: - pw_impl_factory_destroy(data->this); + pw_impl_factory_destroy(data->factory); return res; } diff --git a/src/modules/module-link-factory.c b/src/modules/module-link-factory.c index 7e258a584..509b21137 100644 --- a/src/modules/module-link-factory.c +++ b/src/modules/module-link-factory.c @@ -56,14 +56,16 @@ static const struct spa_dict_item module_props[] = { }; struct factory_data { - struct pw_impl_module *module; struct pw_context *context; - struct pw_impl_factory *this; + + struct pw_impl_module *module; + struct spa_hook module_listener; + + struct pw_impl_factory *factory; + struct spa_hook factory_listener; struct spa_list link_list; - struct spa_hook module_listener; - struct pw_work_queue *work; }; @@ -407,7 +409,7 @@ static void *create_object(void *_data, linger = pw_properties_get_bool(properties, PW_KEY_OBJECT_LINGER, false); pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_impl_factory_get_info(d->this)->id); + pw_impl_factory_get_info(d->factory)->id); client = resource ? pw_resource_get_client(resource) : NULL; if (client && !linger) @@ -467,24 +469,40 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; -static void module_destroy(void *data) +static void factory_destroy(void *data) { struct factory_data *d = data; struct link_data *ld, *t; - spa_hook_remove(&d->module_listener); + spa_hook_remove(&d->factory_listener); spa_list_for_each_safe(ld, t, &d->link_list, l) pw_impl_link_destroy(ld->link); - pw_impl_factory_destroy(d->this); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + +static void module_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->module_listener); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -525,7 +543,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; data->context = context; data->work = pw_context_get_work_queue(context); @@ -540,6 +558,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) pw_impl_module_update_properties(module, &SPA_DICT_INIT_ARRAY(module_props)); + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); return 0; diff --git a/src/modules/module-session-manager/client-endpoint/client-endpoint.c b/src/modules/module-session-manager/client-endpoint/client-endpoint.c index 1ef5268ad..b2f2d98ea 100644 --- a/src/modules/module-session-manager/client-endpoint/client-endpoint.c +++ b/src/modules/module-session-manager/client-endpoint/client-endpoint.c @@ -38,9 +38,11 @@ #define NAME "client-endpoint" struct factory_data { - struct pw_impl_factory *factory; struct pw_impl_module *module; struct spa_hook module_listener; + + struct pw_impl_factory *factory; + struct spa_hook factory_listener; }; static struct endpoint_stream *find_stream(struct client_endpoint *this, uint32_t id) @@ -219,12 +221,27 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; - spa_hook_remove(&d->module_listener); - pw_impl_factory_destroy(d->factory); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) @@ -271,6 +288,7 @@ int client_endpoint_factory_init(struct pw_impl_module *module) data->module = module; pw_impl_factory_set_implementation(factory, &impl_factory, data); + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); diff --git a/src/modules/module-session-manager/client-session/client-session.c b/src/modules/module-session-manager/client-session/client-session.c index 5842ab35a..89997c94b 100644 --- a/src/modules/module-session-manager/client-session/client-session.c +++ b/src/modules/module-session-manager/client-session/client-session.c @@ -38,9 +38,11 @@ #define NAME "client-session" struct factory_data { - struct pw_impl_factory *factory; struct pw_impl_module *module; struct spa_hook module_listener; + + struct pw_impl_factory *factory; + struct spa_hook factory_listener; }; static struct endpoint_link *find_link(struct client_session *this, uint32_t id) @@ -218,12 +220,27 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; - spa_hook_remove(&d->module_listener); - pw_impl_factory_destroy(d->factory); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) @@ -270,6 +287,7 @@ int client_session_factory_init(struct pw_impl_module *module) data->module = module; pw_impl_factory_set_implementation(factory, &impl_factory, data); + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); diff --git a/src/modules/module-session-manager/endpoint-link.c b/src/modules/module-session-manager/endpoint-link.c index c09ec7cec..55ff580e2 100644 --- a/src/modules/module-session-manager/endpoint-link.c +++ b/src/modules/module-session-manager/endpoint-link.c @@ -78,7 +78,8 @@ struct resource_data struct factory_data { - struct pw_impl_factory *this; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; struct pw_impl_module *module; struct spa_hook module_listener; @@ -472,7 +473,7 @@ static void *create_object(void *data, pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", pw_impl_client_get_info(client)->id); pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_impl_factory_get_info(d->this)->id); + pw_impl_factory_get_info(d->factory)->id); result = link_new(pw_impl_client_get_context(client), impl_resource, properties); if (result == NULL) { @@ -502,20 +503,37 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; spa_hook_remove(&d->module_listener); spa_list_remove(&d->export.link); - pw_impl_factory_destroy(d->this); + d->module = NULL; + + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -552,7 +570,7 @@ int endpoint_link_factory_init(struct pw_impl_module *module) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; pw_impl_factory_set_implementation(factory, &impl_factory, data); @@ -562,10 +580,11 @@ int endpoint_link_factory_init(struct pw_impl_module *module) if ((res = pw_context_register_export_type(context, &data->export)) < 0) goto error; + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); return 0; error: - pw_impl_factory_destroy(data->this); + pw_impl_factory_destroy(data->factory); return res; } diff --git a/src/modules/module-session-manager/endpoint-stream.c b/src/modules/module-session-manager/endpoint-stream.c index dab6a74bd..ce2abdb31 100644 --- a/src/modules/module-session-manager/endpoint-stream.c +++ b/src/modules/module-session-manager/endpoint-stream.c @@ -78,11 +78,12 @@ struct resource_data struct factory_data { - struct pw_impl_factory *this; - struct pw_impl_module *module; struct spa_hook module_listener; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; + struct pw_export_type export; }; @@ -463,7 +464,7 @@ static void *create_object(void *data, pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", pw_impl_client_get_info(client)->id); pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_impl_factory_get_info(d->this)->id); + pw_impl_factory_get_info(d->factory)->id); result = stream_new(pw_impl_client_get_context(client), impl_resource, properties); if (result == NULL) { @@ -493,20 +494,37 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; spa_hook_remove(&d->module_listener); spa_list_remove(&d->export.link); - pw_impl_factory_destroy(d->this); + d->module = NULL; + + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -543,7 +561,7 @@ int endpoint_stream_factory_init(struct pw_impl_module *module) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; pw_impl_factory_set_implementation(factory, &impl_factory, data); @@ -553,10 +571,11 @@ int endpoint_stream_factory_init(struct pw_impl_module *module) if ((res = pw_context_register_export_type(context, &data->export)) < 0) goto error; + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); return 0; error: - pw_impl_factory_destroy(data->this); + pw_impl_factory_destroy(data->factory); return res; } diff --git a/src/modules/module-session-manager/endpoint.c b/src/modules/module-session-manager/endpoint.c index d900c5f92..752a529a8 100644 --- a/src/modules/module-session-manager/endpoint.c +++ b/src/modules/module-session-manager/endpoint.c @@ -78,11 +78,12 @@ struct resource_data struct factory_data { - struct pw_impl_factory *this; - struct pw_impl_module *module; struct spa_hook module_listener; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; + struct pw_export_type export; }; @@ -472,7 +473,7 @@ static void *create_object(void *data, pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", pw_impl_client_get_info(client)->id); pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_impl_factory_get_info(d->this)->id); + pw_impl_factory_get_info(d->factory)->id); result = endpoint_new(pw_impl_client_get_context(client), impl_resource, properties); if (result == NULL) { @@ -502,20 +503,37 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; spa_hook_remove(&d->module_listener); spa_list_remove(&d->export.link); - pw_impl_factory_destroy(d->this); + + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -552,7 +570,7 @@ int endpoint_factory_init(struct pw_impl_module *module) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; pw_impl_factory_set_implementation(factory, &impl_factory, data); @@ -562,10 +580,11 @@ int endpoint_factory_init(struct pw_impl_module *module) if ((res = pw_context_register_export_type(context, &data->export)) < 0) goto error; + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); return 0; error: - pw_impl_factory_destroy(data->this); + pw_impl_factory_destroy(data->factory); return res; } diff --git a/src/modules/module-session-manager/session.c b/src/modules/module-session-manager/session.c index e839b6c17..e3d721097 100644 --- a/src/modules/module-session-manager/session.c +++ b/src/modules/module-session-manager/session.c @@ -78,11 +78,12 @@ struct resource_data struct factory_data { - struct pw_impl_factory *this; - struct pw_impl_module *module; struct spa_hook module_listener; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; + struct pw_export_type export; }; @@ -461,7 +462,7 @@ static void *create_object(void *data, pw_properties_setf(properties, PW_KEY_CLIENT_ID, "%d", pw_impl_client_get_info(client)->id); pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_impl_factory_get_info(d->this)->id); + pw_impl_factory_get_info(d->factory)->id); result = session_new(pw_impl_client_get_context(client), impl_resource, properties); if (result == NULL) { @@ -491,20 +492,36 @@ static const struct pw_impl_factory_implementation impl_factory = { .create_object = create_object, }; +static void factory_destroy(void *data) +{ + struct factory_data *d = data; + spa_hook_remove(&d->factory_listener); + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); +} + +static const struct pw_impl_factory_events factory_events = { + PW_VERSION_IMPL_FACTORY_EVENTS, + .destroy = factory_destroy, +}; + static void module_destroy(void *data) { struct factory_data *d = data; spa_hook_remove(&d->module_listener); spa_list_remove(&d->export.link); - pw_impl_factory_destroy(d->this); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -541,7 +558,7 @@ int session_factory_init(struct pw_impl_module *module) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; pw_impl_factory_set_implementation(factory, &impl_factory, data); @@ -551,10 +568,11 @@ int session_factory_init(struct pw_impl_module *module) if ((res = pw_context_register_export_type(context, &data->export)) < 0) goto error; + pw_impl_factory_add_listener(factory, &data->factory_listener, &factory_events, data); pw_impl_module_add_listener(module, &data->module_listener, &module_events, data); return 0; error: - pw_impl_factory_destroy(data->this); + pw_impl_factory_destroy(data->factory); return res; } diff --git a/src/modules/spa/module-device-factory.c b/src/modules/spa/module-device-factory.c index 3d3569730..fd712a248 100644 --- a/src/modules/spa/module-device-factory.c +++ b/src/modules/spa/module-device-factory.c @@ -51,12 +51,13 @@ static const struct spa_dict_item module_props[] = { struct factory_data { struct pw_context *context; - struct pw_impl_module *module; - struct pw_impl_factory *this; - struct spa_hook factory_listener; + struct pw_impl_module *module; struct spa_hook module_listener; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; + struct spa_list device_list; }; @@ -120,7 +121,7 @@ static void *create_object(void *_data, goto error_properties; pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_global_get_id(pw_impl_factory_get_global(data->this))); + pw_global_get_id(pw_impl_factory_get_global(data->factory))); client = resource ? pw_resource_get_client(resource) : NULL; @@ -190,16 +191,19 @@ static const struct pw_impl_factory_implementation factory_impl = { .create_object = create_object, }; -static void factory_destroy(void *_data) +static void factory_destroy(void *data) { - struct factory_data *data = _data; + struct factory_data *d = data; struct device_data *nd; - spa_hook_remove(&data->factory_listener); - spa_hook_remove(&data->module_listener); + spa_hook_remove(&d->factory_listener); - spa_list_consume(nd, &data->device_list, link) + spa_list_consume(nd, &d->device_list, link) pw_impl_device_destroy(nd->device); + + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); } static const struct pw_impl_factory_events factory_events = { @@ -207,17 +211,21 @@ static const struct pw_impl_factory_events factory_events = { .destroy = factory_destroy, }; -static void module_destroy(void *_data) +static void module_destroy(void *data) { - struct factory_data *data = _data; - pw_impl_factory_destroy(data->this); + struct factory_data *d = data; + + spa_hook_remove(&d->module_listener); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -256,7 +264,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->module = module; data->context = context; spa_list_init(&data->device_list); diff --git a/src/modules/spa/module-node-factory.c b/src/modules/spa/module-node-factory.c index 72bccdcfe..9c66a62f7 100644 --- a/src/modules/spa/module-node-factory.c +++ b/src/modules/spa/module-node-factory.c @@ -51,12 +51,13 @@ static const struct spa_dict_item module_props[] = { struct factory_data { struct pw_context *context; - struct pw_impl_factory *this; - struct pw_impl_module *module; - struct spa_hook factory_listener; + struct pw_impl_module *module; struct spa_hook module_listener; + struct pw_impl_factory *factory; + struct spa_hook factory_listener; + struct spa_list node_list; }; @@ -121,7 +122,7 @@ static void *create_object(void *_data, goto error_properties; pw_properties_setf(properties, PW_KEY_FACTORY_ID, "%d", - pw_global_get_id(pw_impl_factory_get_global(data->this))); + pw_global_get_id(pw_impl_factory_get_global(data->factory))); linger = pw_properties_get_bool(properties, PW_KEY_OBJECT_LINGER, false); @@ -187,15 +188,17 @@ static const struct pw_impl_factory_implementation factory_impl = { .create_object = create_object, }; -static void factory_destroy(void *_data) +static void factory_destroy(void *data) { - struct factory_data *data = _data; + struct factory_data *d = data; struct node_data *nd; - spa_hook_remove(&data->factory_listener); - spa_list_consume(nd, &data->node_list, link) + spa_hook_remove(&d->factory_listener); + spa_list_consume(nd, &d->node_list, link) pw_impl_node_destroy(nd->node); - data->this = NULL; + d->factory = NULL; + if (d->module) + pw_impl_module_destroy(d->module); } static const struct pw_impl_factory_events factory_events = { @@ -203,19 +206,20 @@ static const struct pw_impl_factory_events factory_events = { .destroy = factory_destroy, }; -static void module_destroy(void *_data) +static void module_destroy(void *data) { - struct factory_data *data = _data; - spa_hook_remove(&data->module_listener); - if (data->this) - pw_impl_factory_destroy(data->this); + struct factory_data *d = data; + spa_hook_remove(&d->module_listener); + d->module = NULL; + if (d->factory) + pw_impl_factory_destroy(d->factory); } static void module_registered(void *data) { struct factory_data *d = data; struct pw_impl_module *module = d->module; - struct pw_impl_factory *factory = d->this; + struct pw_impl_factory *factory = d->factory; struct spa_dict_item items[1]; char id[16]; int res; @@ -254,7 +258,7 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args) return -errno; data = pw_impl_factory_get_user_data(factory); - data->this = factory; + data->factory = factory; data->context = context; data->module = module; spa_list_init(&data->node_list); diff --git a/src/pipewire/impl-module.c b/src/pipewire/impl-module.c index 7956bb520..0d4df47c0 100644 --- a/src/pipewire/impl-module.c +++ b/src/pipewire/impl-module.c @@ -320,7 +320,7 @@ void pw_impl_module_destroy(struct pw_impl_module *module) { struct impl *impl = SPA_CONTAINER_OF(module, struct impl, this); - pw_log_debug("%p: destroy", module); + pw_log_debug("%p: destroy %s", module, module->info.name); pw_impl_module_emit_destroy(module); spa_list_remove(&module->link);