diff --git a/src/modules/module-audio-dsp.c b/src/modules/module-audio-dsp.c index 498b5cd04..043f4350c 100644 --- a/src/modules/module-audio-dsp.c +++ b/src/modules/module-audio-dsp.c @@ -168,18 +168,18 @@ static void *create_object(void *_data, no_resource: pw_log_error("audio-dsp needs a resource"); - pw_resource_error(resource, -EINVAL, "no resource"); + pw_resource_error(resource, new_id, -EINVAL, "no resource"); goto done; no_props: pw_log_error("audio-dsp needs a property"); - pw_resource_error(resource, -EINVAL, "no property"); + pw_resource_error(resource, new_id, -EINVAL, "no property"); goto done; no_mem: pw_log_error("can't create node"); - pw_resource_error(resource, -ENOMEM, "no memory"); + pw_resource_error(resource, new_id, -ENOMEM, "no memory"); goto done; no_bind: - pw_resource_error(resource, res, "can't bind dsp node"); + pw_resource_error(resource, new_id, res, "can't bind dsp node"); goto done; done: if (properties) diff --git a/src/modules/module-client-node.c b/src/modules/module-client-node.c index 24a60a7d4..84f1a0a21 100644 --- a/src/modules/module-client-node.c +++ b/src/modules/module-client-node.c @@ -83,11 +83,11 @@ static void *create_object(void *_data, no_resource: pw_log_error("client-node needs a resource"); - pw_resource_error(resource, -EINVAL, "no resource"); + pw_resource_error(resource, new_id, -EINVAL, "no resource"); goto done; no_mem: pw_log_error("can't create node"); - pw_resource_error(resource, -ENOMEM, "no memory"); + pw_resource_error(resource, new_id, -ENOMEM, "no memory"); goto done; done: if (properties) diff --git a/src/modules/module-flatpak.c b/src/modules/module-flatpak.c index 45cb767d5..eecc62e5e 100644 --- a/src/modules/module-flatpak.c +++ b/src/modules/module-flatpak.c @@ -308,6 +308,7 @@ static void do_portal_check(struct client_info *cinfo) const char *handle; const char *device; struct async_pending *p; + struct pw_resource *core_resource; pw_log_info("ask portal for client %p", client); pw_client_set_busy(client, true); @@ -382,7 +383,8 @@ static void do_portal_check(struct client_info *cinfo) dbus_error_free(&error); goto not_allowed; not_allowed: - pw_resource_error(pw_client_get_core_resource(client), -EPERM, "not allowed"); + core_resource = pw_client_get_core_resource(client); + pw_resource_error(core_resource, 0, -EPERM, "not allowed"); return; } diff --git a/src/modules/module-link-factory.c b/src/modules/module-link-factory.c index d97d4bfc9..6ba26ad92 100644 --- a/src/modules/module-link-factory.c +++ b/src/modules/module-link-factory.c @@ -114,7 +114,7 @@ static void *create_object(void *_data, uint32_t new_id) { struct factory_data *d = _data; - struct pw_client *client; + struct pw_client *client = NULL; struct pw_node *output_node, *input_node; struct pw_port *outport, *inport; struct pw_core *core; @@ -129,8 +129,8 @@ static void *create_object(void *_data, int res; bool linger; - if (resource == NULL) - goto no_resource; + client = pw_resource_get_client(resource); + core = pw_client_get_core(client); if (properties == NULL) goto no_properties; @@ -151,9 +151,6 @@ static void *create_object(void *_data, str = pw_properties_get(properties, PW_LINK_INPUT_PORT_ID); input_port_id = str ? pw_properties_parse_int(str) : -1; - client = pw_resource_get_client(resource); - core = pw_client_get_core(client); - global = pw_core_find_global(core, output_node_id); if (global == NULL || pw_global_get_type(global) != PW_TYPE_INTERFACE_Node) goto no_output; @@ -224,36 +221,32 @@ static void *create_object(void *_data, return link; - no_resource: - pw_log_error("link factory needs a resource"); - pw_resource_error(resource, -EINVAL, "no resource"); - goto done; no_properties: pw_log_error("link-factory needs properties"); - pw_resource_error(resource, -EINVAL, "no properties"); + pw_resource_error(resource, new_id, -EINVAL, "no properties"); goto done; no_output: pw_log_error("link-factory unknown output node %d", output_node_id); - pw_resource_error(resource, -EINVAL, "unknown output node"); + pw_resource_error(resource, new_id, -EINVAL, "unknown output node"); goto done; no_input: pw_log_error("link-factory unknown input node %d", input_node_id); - pw_resource_error(resource, -EINVAL, "unknown input node"); + pw_resource_error(resource, new_id, -EINVAL, "unknown input node"); goto done; no_output_port: pw_log_error("link-factory unknown output port %d", output_port_id); - pw_resource_error(resource, -EINVAL, "unknown output port"); + pw_resource_error(resource, new_id, -EINVAL, "unknown output port"); goto done; no_input_port: pw_log_error("link-factory unknown input port %d", input_port_id); - pw_resource_error(resource, -EINVAL, "unknown input port"); + pw_resource_error(resource, new_id, -EINVAL, "unknown input port"); goto done; no_mem: pw_log_error("can't create link"); - pw_resource_error(resource, -ENOMEM, "no memory"); + pw_resource_error(resource, new_id, -ENOMEM, "no memory"); goto done; no_bind: - pw_resource_error(resource, res, "can't bind link"); + pw_resource_error(resource, new_id, res, "can't bind link"); goto done; done: if (properties) diff --git a/src/modules/spa/module-node-factory.c b/src/modules/spa/module-node-factory.c index ca24745dc..89d2a9070 100644 --- a/src/modules/spa/module-node-factory.c +++ b/src/modules/spa/module-node-factory.c @@ -120,7 +120,7 @@ static void *create_object(void *_data, no_properties: pw_log_error("needed properties: spa.library.name= spa.factory.name="); if (resource) { - pw_resource_error(resource, -EINVAL, + pw_resource_error(resource, new_id, -EINVAL, "needed properties: " "spa.library.name= " "spa.factory.name="); @@ -129,7 +129,7 @@ static void *create_object(void *_data, no_mem: pw_log_error("can't create node"); if (resource) { - pw_resource_error(resource, -ENOMEM, "no memory"); + pw_resource_error(resource, new_id, -ENOMEM, "no memory"); } return NULL; } diff --git a/src/pipewire/client.c b/src/pipewire/client.c index a33824f50..a29c56926 100644 --- a/src/pipewire/client.c +++ b/src/pipewire/client.c @@ -117,7 +117,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, no_mem: pw_log_error("can't create client resource"); - pw_resource_error(client->core_resource, -ENOMEM, "no memory"); + pw_resource_error(client->core_resource, id, -ENOMEM, "no memory"); return; } diff --git a/src/pipewire/core.c b/src/pipewire/core.c index 7e6ab70ff..250463094 100644 --- a/src/pipewire/core.c +++ b/src/pipewire/core.c @@ -212,8 +212,9 @@ static void core_get_registry(void *object, uint32_t version, uint32_t new_id) no_mem: pw_log_error("can't create registry resource"); - pw_core_resource_error(client->core_resource, - resource->id, -ENOMEM, "no memory"); + pw_core_resource_error(client->core_resource, new_id, -ENOMEM, "no memory"); + pw_map_insert_at(&client->objects, new_id, NULL); + pw_core_resource_remove_id(client->core_resource, new_id); } static void @@ -253,29 +254,32 @@ core_create_object(void *object, /* error will be posted */ obj = pw_factory_create_object(factory, resource, type, version, properties, new_id); if (obj == NULL) - goto no_mem; + goto error; - done: return; no_factory: pw_log_error("can't find node factory %s", factory_name); pw_core_resource_error(client->core_resource, - resource->id, -EINVAL, "unknown factory name %s", factory_name); - goto done; + new_id, -EINVAL, "unknown factory name %s", factory_name); + goto error; wrong_version: wrong_type: pw_log_error("invalid resource type/version"); pw_core_resource_error(client->core_resource, - resource->id, -EINVAL, "wrong resource type/version"); - goto done; + new_id, -EINVAL, "wrong resource type/version"); + goto error; no_properties: pw_log_error("can't create properties"); goto no_mem; no_mem: pw_core_resource_error(client->core_resource, - resource->id, -ENOMEM, "no memory"); - goto done; + new_id, -ENOMEM, "no memory"); + goto error; + error: + pw_map_insert_at(&client->objects, new_id, NULL); + pw_core_resource_remove_id(client->core_resource, new_id); + return; } static void core_destroy(void *object, uint32_t id) @@ -296,8 +300,7 @@ static void core_destroy(void *object, uint32_t id) no_resource: pw_log_error("can't find resouce %d", id); - pw_core_resource_error(client->core_resource, - resource->id, -EINVAL, "unknown resouce %d", id); + pw_core_resource_error(client->core_resource, id, -EINVAL, "unknown resouce %d", id); goto done; } diff --git a/src/pipewire/factory.c b/src/pipewire/factory.c index e23093737..e2ddaf25e 100644 --- a/src/pipewire/factory.c +++ b/src/pipewire/factory.c @@ -116,8 +116,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, no_mem: pw_log_error("can't create factory resource"); - pw_core_resource_error(client->core_resource, - client->core_resource->id, -ENOMEM, "no memory"); + pw_core_resource_error(client->core_resource, id, -ENOMEM, "no memory"); return; } diff --git a/src/pipewire/global.c b/src/pipewire/global.c index 6fc441350..73d17e32e 100644 --- a/src/pipewire/global.c +++ b/src/pipewire/global.c @@ -242,8 +242,7 @@ pw_global_bind(struct pw_global *global, struct pw_client *client, uint32_t perm wrong_version: res = -EINVAL; - pw_core_resource_error(client->core_resource, - client->core_resource->id, + pw_core_resource_error(client->core_resource, id, res, "id %d: interface version %d < %d", id, global->version, version); return res; diff --git a/src/pipewire/link.c b/src/pipewire/link.c index 93d21d52d..33dacc86a 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -1168,8 +1168,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, no_mem: pw_log_error("can't create link resource"); - pw_core_resource_error(client->core_resource, - client->core_resource->id, -ENOMEM, "no memory"); + pw_core_resource_error(client->core_resource, id, -ENOMEM, "no memory"); return; } diff --git a/src/pipewire/module.c b/src/pipewire/module.c index ef7e846bc..d99c52b5c 100644 --- a/src/pipewire/module.c +++ b/src/pipewire/module.c @@ -133,8 +133,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, no_mem: pw_log_error("can't create module resource"); - pw_core_resource_error(client->core_resource, - client->core_resource->id, -ENOMEM, "no memory"); + pw_core_resource_error(client->core_resource, id, -ENOMEM, "no memory"); return; } diff --git a/src/pipewire/node.c b/src/pipewire/node.c index 674fad283..b0f81e3cb 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -401,8 +401,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, no_mem: pw_log_error("can't create node resource"); - pw_core_resource_error(client->core_resource, - client->core_resource->id, -ENOMEM, "no memory"); + pw_core_resource_error(client->core_resource, id, -ENOMEM, "no memory"); return; } diff --git a/src/pipewire/port.c b/src/pipewire/port.c index 9d6e9fd8e..2b7503d76 100644 --- a/src/pipewire/port.c +++ b/src/pipewire/port.c @@ -435,8 +435,7 @@ global_bind(void *_data, struct pw_client *client, uint32_t permissions, no_mem: pw_log_error("can't create port resource"); - pw_core_resource_error(client->core_resource, - client->core_resource->id, -ENOMEM, "no memory"); + pw_core_resource_error(client->core_resource, id, -ENOMEM, "no memory"); return; } diff --git a/src/pipewire/resource.c b/src/pipewire/resource.c index 2299b6e5e..fe8d0de65 100644 --- a/src/pipewire/resource.c +++ b/src/pipewire/resource.c @@ -146,10 +146,10 @@ const struct pw_protocol_marshal *pw_resource_get_marshal(struct pw_resource *re return resource->marshal; } -void pw_resource_error(struct pw_resource *resource, int result, const char *error) +void pw_resource_error(struct pw_resource *resource, uint32_t id, int result, const char *error) { if (resource->client->core_resource) - pw_core_resource_error(resource->client->core_resource, resource->id, result, error); + pw_core_resource_error(resource->client->core_resource, id, result, error); } void pw_resource_destroy(struct pw_resource *resource) diff --git a/src/pipewire/resource.h b/src/pipewire/resource.h index 8d2ed2a2d..33afe2619 100644 --- a/src/pipewire/resource.h +++ b/src/pipewire/resource.h @@ -115,7 +115,7 @@ void pw_resource_add_override(struct pw_resource *resource, void *data); /** Generate an error for a resource */ -void pw_resource_error(struct pw_resource *resource, int result, const char *error); +void pw_resource_error(struct pw_resource *resource, uint32_t id, int result, const char *error); /** Get the implementation list of a resource */ struct spa_hook_list *pw_resource_get_implementation(struct pw_resource *resource);