From bae0d16e09ef0540c78170496eb18d01ee43f645 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 12 Jan 2022 20:36:25 +0100 Subject: [PATCH] global: don't reuse ids --- .../client-endpoint/endpoint-stream.c | 2 -- .../client-endpoint/endpoint.c | 3 -- .../client-session/endpoint-link.c | 2 -- .../client-session/session.c | 3 -- src/pipewire/context.c | 16 ++++++--- src/pipewire/global.c | 34 ++++--------------- src/pipewire/global.h | 3 -- src/pipewire/impl-client.c | 3 -- src/pipewire/impl-core.c | 3 -- src/pipewire/impl-device.c | 3 -- src/pipewire/impl-factory.c | 3 -- src/pipewire/impl-link.c | 3 -- src/pipewire/impl-metadata.c | 3 -- src/pipewire/impl-module.c | 2 -- src/pipewire/impl-node.c | 3 -- src/pipewire/impl-port.c | 3 -- src/pipewire/keys.h | 4 --- src/pipewire/private.h | 3 -- 18 files changed, 19 insertions(+), 77 deletions(-) diff --git a/src/modules/module-session-manager/client-endpoint/endpoint-stream.c b/src/modules/module-session-manager/client-endpoint/endpoint-stream.c index e31bcbaa5..b10b76eb3 100644 --- a/src/modules/module-session-manager/client-endpoint/endpoint-stream.c +++ b/src/modules/module-session-manager/client-endpoint/endpoint-stream.c @@ -304,8 +304,6 @@ int endpoint_stream_init(struct endpoint_stream *this, pw_properties_setf(this->props, PW_KEY_OBJECT_ID, "%u", pw_global_get_id(this->global)); - pw_properties_setf(this->props, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(this->global)); this->info.version = PW_VERSION_ENDPOINT_STREAM_INFO; this->info.id = pw_global_get_id(this->global); diff --git a/src/modules/module-session-manager/client-endpoint/endpoint.c b/src/modules/module-session-manager/client-endpoint/endpoint.c index 16e07f019..c53c1045f 100644 --- a/src/modules/module-session-manager/client-endpoint/endpoint.c +++ b/src/modules/module-session-manager/client-endpoint/endpoint.c @@ -305,7 +305,6 @@ int endpoint_init(struct endpoint *this, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_FACTORY_ID, PW_KEY_CLIENT_ID, PW_KEY_DEVICE_ID, @@ -334,8 +333,6 @@ int endpoint_init(struct endpoint *this, pw_properties_setf(this->props, PW_KEY_OBJECT_ID, "%u", pw_global_get_id(this->global)); - pw_properties_setf(this->props, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(this->global)); this->info.version = PW_VERSION_ENDPOINT_INFO; this->info.id = pw_global_get_id(this->global); diff --git a/src/modules/module-session-manager/client-session/endpoint-link.c b/src/modules/module-session-manager/client-session/endpoint-link.c index 215cbfdb9..562b95145 100644 --- a/src/modules/module-session-manager/client-session/endpoint-link.c +++ b/src/modules/module-session-manager/client-session/endpoint-link.c @@ -322,8 +322,6 @@ int endpoint_link_init(struct endpoint_link *this, pw_properties_setf(this->props, PW_KEY_OBJECT_ID, "%u", pw_global_get_id(this->global)); - pw_properties_setf(this->props, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(this->global)); this->info.version = PW_VERSION_ENDPOINT_LINK_INFO; this->info.id = pw_global_get_id(this->global); diff --git a/src/modules/module-session-manager/client-session/session.c b/src/modules/module-session-manager/client-session/session.c index 498b9323d..21d42977f 100644 --- a/src/modules/module-session-manager/client-session/session.c +++ b/src/modules/module-session-manager/client-session/session.c @@ -276,7 +276,6 @@ int session_init(struct session *this, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_FACTORY_ID, PW_KEY_CLIENT_ID, NULL @@ -296,8 +295,6 @@ int session_init(struct session *this, pw_properties_setf(this->props, PW_KEY_OBJECT_ID, "%u", pw_global_get_id(this->global)); - pw_properties_setf(this->props, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(this->global)); this->info.version = PW_VERSION_SESSION_INFO; this->info.id = pw_global_get_id(this->global); diff --git a/src/pipewire/context.c b/src/pipewire/context.c index 33c6b9216..d1664ce6b 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -214,7 +214,6 @@ struct pw_context *pw_context_new(struct pw_loop *main_loop, pw_array_init(&this->factory_lib, 32); pw_array_init(&this->objects, 32); - pw_map_init(&this->globals, 128, 32); spa_list_init(&this->core_impl_list); spa_list_init(&this->protocol_list); @@ -482,8 +481,6 @@ void pw_context_destroy(struct pw_context *context) pw_array_clear(&context->objects); - pw_map_clear(&context->globals); - spa_hook_list_clean(&context->listener_list); spa_hook_list_clean(&context->driver_listener_list); @@ -581,12 +578,23 @@ int pw_context_for_each_global(struct pw_context *context, return 0; } +static struct pw_global *find_global(struct pw_context *context, uint32_t id) +{ + struct pw_global *g; + spa_list_for_each(g, &context->global_list, link) { + if (g->id == id) + return g; + } + return NULL; +} + SPA_EXPORT struct pw_global *pw_context_find_global(struct pw_context *context, uint32_t id) { struct pw_global *global; - global = pw_map_lookup(&context->globals, id); + + global = find_global(context, id); if (global == NULL || !global->registered) { errno = ENOENT; return NULL; diff --git a/src/pipewire/global.c b/src/pipewire/global.c index 6b2459279..70e296c51 100644 --- a/src/pipewire/global.c +++ b/src/pipewire/global.c @@ -96,13 +96,9 @@ pw_global_new(struct pw_context *context, this->func = func; this->object = object; this->properties = properties; - this->id = pw_map_insert_new(&context->globals, this); - if (this->id == SPA_ID_INVALID) { - res = -errno; - pw_log_error("%p: can't allocate new id: %m", this); - goto error_free; - } - this->serial = SPA_ID_INVALID; + this->id = serial++; + if ((uint32_t)this->id == SPA_ID_INVALID) + this->id = serial++; spa_list_init(&this->resource_list); spa_hook_list_init(&this->listener_list); @@ -111,24 +107,12 @@ pw_global_new(struct pw_context *context, return this; -error_free: - free(impl); error_cleanup: pw_properties_free(properties); errno = -res; return NULL; } -SPA_EXPORT -uint64_t pw_global_get_serial(struct pw_global *global) -{ - if (global->serial == SPA_ID_INVALID) - global->serial = serial++; - if ((uint32_t)serial == SPA_ID_INVALID) - serial++; - return global->serial; -} - /** register a global to the context registry * * \param global a global to add @@ -149,8 +133,8 @@ int pw_global_register(struct pw_global *global) spa_list_for_each(registry, &context->registry_resource_list, link) { uint32_t permissions = pw_global_get_permissions(global, registry->client); - pw_log_debug("registry %p: global %d %08x serial:%"PRIu64, - registry, global->id, permissions, global->serial); + pw_log_debug("registry %p: global %d %08x", + registry, global->id, permissions); if (PW_PERM_IS_R(permissions)) pw_registry_resource_global(registry, global->id, @@ -183,7 +167,6 @@ static int global_unregister(struct pw_global *global) spa_list_remove(&global->link); global->registered = false; - global->serial = SPA_ID_INVALID; pw_log_debug("%p: unregistered %u", global, global->id); pw_context_emit_global_removed(context, global); @@ -352,9 +335,8 @@ int pw_global_update_permissions(struct pw_global *global, struct pw_impl_client pw_registry_resource_global_remove(resource, global->id); } else if (do_show) { - pw_log_debug("client %p: resource %p show global %d serial:%"PRIu64, - client, resource, global->id, - global->serial); + pw_log_debug("client %p: resource %p show global %d", + client, resource, global->id); pw_registry_resource_global(resource, global->id, new_permissions, @@ -386,7 +368,6 @@ SPA_EXPORT void pw_global_destroy(struct pw_global *global) { struct pw_resource *resource; - struct pw_context *context = global->context; global->destroyed = true; @@ -401,7 +382,6 @@ void pw_global_destroy(struct pw_global *global) pw_log_debug("%p: free", global); pw_global_emit_free(global); - pw_map_remove(&context->globals, global->id); spa_hook_list_clean(&global->listener_list); pw_properties_free(global->properties); diff --git a/src/pipewire/global.h b/src/pipewire/global.h index 0cf2a7c5d..1d49422d0 100644 --- a/src/pipewire/global.h +++ b/src/pipewire/global.h @@ -127,9 +127,6 @@ void *pw_global_get_object(struct pw_global *global); /** Get the unique id of the global */ uint32_t pw_global_get_id(struct pw_global *global); -/** Get the serial number of the global */ -uint64_t pw_global_get_serial(struct pw_global *global); - /** Add a resource to a global */ int pw_global_add_resource(struct pw_global *global, struct pw_resource *resource); diff --git a/src/pipewire/impl-client.c b/src/pipewire/impl-client.c index 7ccff283f..282a96249 100644 --- a/src/pipewire/impl-client.c +++ b/src/pipewire/impl-client.c @@ -475,7 +475,6 @@ int pw_impl_client_register(struct pw_impl_client *client, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_MODULE_ID, PW_KEY_PROTOCOL, PW_KEY_SEC_PID, @@ -506,8 +505,6 @@ int pw_impl_client_register(struct pw_impl_client *client, client->info.id = client->global->id; pw_properties_setf(client->properties, PW_KEY_OBJECT_ID, "%d", client->info.id); - pw_properties_setf(client->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(client->global)); client->info.props = &client->properties->dict; pw_global_add_listener(client->global, &client->global_listener, &global_events, client); diff --git a/src/pipewire/impl-core.c b/src/pipewire/impl-core.c index 85d41e7bb..40b263396 100644 --- a/src/pipewire/impl-core.c +++ b/src/pipewire/impl-core.c @@ -583,7 +583,6 @@ int pw_impl_core_register(struct pw_impl_core *core, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_USER_NAME, PW_KEY_HOST_NAME, PW_KEY_CORE_NAME, @@ -611,8 +610,6 @@ int pw_impl_core_register(struct pw_impl_core *core, core->info.id = core->global->id; pw_properties_setf(core->properties, PW_KEY_OBJECT_ID, "%d", core->info.id); - pw_properties_setf(core->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(core->global)); core->info.props = &core->properties->dict; pw_global_update_keys(core->global, core->info.props, keys); diff --git a/src/pipewire/impl-device.c b/src/pipewire/impl-device.c index 3a5c81cb8..0e4b226aa 100644 --- a/src/pipewire/impl-device.c +++ b/src/pipewire/impl-device.c @@ -556,7 +556,6 @@ int pw_impl_device_register(struct pw_impl_device *device, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_OBJECT_PATH, PW_KEY_MODULE_ID, PW_KEY_FACTORY_ID, @@ -589,8 +588,6 @@ int pw_impl_device_register(struct pw_impl_device *device, device->info.id = device->global->id; pw_properties_setf(device->properties, PW_KEY_OBJECT_ID, "%d", device->info.id); - pw_properties_setf(device->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(device->global)); device->info.props = &device->properties->dict; pw_global_update_keys(device->global, device->info.props, keys); diff --git a/src/pipewire/impl-factory.c b/src/pipewire/impl-factory.c index d216ba5b8..223a20f52 100644 --- a/src/pipewire/impl-factory.c +++ b/src/pipewire/impl-factory.c @@ -178,7 +178,6 @@ int pw_impl_factory_register(struct pw_impl_factory *factory, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_MODULE_ID, PW_KEY_FACTORY_NAME, PW_KEY_FACTORY_TYPE_NAME, @@ -205,8 +204,6 @@ int pw_impl_factory_register(struct pw_impl_factory *factory, factory->info.id = factory->global->id; pw_properties_setf(factory->properties, PW_KEY_OBJECT_ID, "%d", factory->info.id); - pw_properties_setf(factory->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(factory->global)); pw_properties_set(factory->properties, PW_KEY_FACTORY_NAME, factory->info.name); pw_properties_setf(factory->properties, PW_KEY_FACTORY_TYPE_NAME, "%s", factory->info.type); pw_properties_setf(factory->properties, PW_KEY_FACTORY_TYPE_VERSION, "%d", factory->info.version); diff --git a/src/pipewire/impl-link.c b/src/pipewire/impl-link.c index bc9c20f9b..c9b89db1a 100644 --- a/src/pipewire/impl-link.c +++ b/src/pipewire/impl-link.c @@ -1346,7 +1346,6 @@ int pw_impl_link_register(struct pw_impl_link *link, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_OBJECT_PATH, PW_KEY_MODULE_ID, PW_KEY_FACTORY_ID, @@ -1386,8 +1385,6 @@ int pw_impl_link_register(struct pw_impl_link *link, link->info.id = link->global->id; pw_properties_setf(link->properties, PW_KEY_OBJECT_ID, "%d", link->info.id); - pw_properties_setf(link->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(link->global)); pw_properties_setf(link->properties, PW_KEY_LINK_OUTPUT_NODE, "%u", link->info.output_node_id); pw_properties_setf(link->properties, PW_KEY_LINK_OUTPUT_PORT, "%u", link->info.output_port_id); pw_properties_setf(link->properties, PW_KEY_LINK_INPUT_NODE, "%u", link->info.input_node_id); diff --git a/src/pipewire/impl-metadata.c b/src/pipewire/impl-metadata.c index c0c391fcf..8c47381a4 100644 --- a/src/pipewire/impl-metadata.c +++ b/src/pipewire/impl-metadata.c @@ -546,9 +546,6 @@ int pw_impl_metadata_register(struct pw_impl_metadata *metadata, spa_list_append(&context->metadata_list, &metadata->link); metadata->registered = true; - pw_properties_setf(metadata->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(metadata->global)); - pw_global_update_keys(metadata->global, &metadata->properties->dict, keys); pw_global_add_listener(metadata->global, &metadata->global_listener, &global_events, metadata); diff --git a/src/pipewire/impl-module.c b/src/pipewire/impl-module.c index 4e5f1894f..0b7d35467 100644 --- a/src/pipewire/impl-module.c +++ b/src/pipewire/impl-module.c @@ -247,8 +247,6 @@ pw_context_load_module(struct pw_context *context, this->info.id = this->global->id; pw_properties_setf(this->properties, PW_KEY_OBJECT_ID, "%d", this->info.id); - pw_properties_setf(this->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(this->global)); this->info.props = &this->properties->dict; pw_impl_module_emit_initialized(this); diff --git a/src/pipewire/impl-node.c b/src/pipewire/impl-node.c index 0951031c9..7f352eadb 100644 --- a/src/pipewire/impl-node.c +++ b/src/pipewire/impl-node.c @@ -678,7 +678,6 @@ int pw_impl_node_register(struct pw_impl_node *this, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_OBJECT_PATH, PW_KEY_MODULE_ID, PW_KEY_FACTORY_ID, @@ -724,8 +723,6 @@ int pw_impl_node_register(struct pw_impl_node *this, this->info.id = this->global->id; pw_properties_setf(this->properties, PW_KEY_OBJECT_ID, "%d", this->info.id); - pw_properties_setf(this->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(this->global)); this->info.props = &this->properties->dict; pw_global_update_keys(this->global, &this->properties->dict, keys); diff --git a/src/pipewire/impl-port.c b/src/pipewire/impl-port.c index 1b1d0d7c1..61e54dbac 100644 --- a/src/pipewire/impl-port.c +++ b/src/pipewire/impl-port.c @@ -889,7 +889,6 @@ int pw_impl_port_register(struct pw_impl_port *port, struct pw_properties *properties) { static const char * const keys[] = { - PW_KEY_OBJECT_SERIAL, PW_KEY_OBJECT_PATH, PW_KEY_FORMAT_DSP, PW_KEY_NODE_ID, @@ -925,8 +924,6 @@ int pw_impl_port_register(struct pw_impl_port *port, port->info.id = port->global->id; pw_properties_setf(port->properties, PW_KEY_NODE_ID, "%d", node->global->id); pw_properties_setf(port->properties, PW_KEY_OBJECT_ID, "%d", port->info.id); - pw_properties_setf(port->properties, PW_KEY_OBJECT_SERIAL, "%"PRIu64, - pw_global_get_serial(port->global)); port->info.props = &port->properties->dict; pw_global_update_keys(port->global, &port->properties->dict, keys); diff --git a/src/pipewire/keys.h b/src/pipewire/keys.h index 231b73801..cf07ebc99 100644 --- a/src/pipewire/keys.h +++ b/src/pipewire/keys.h @@ -64,10 +64,6 @@ extern "C" { /** object properties */ #define PW_KEY_OBJECT_PATH "object.path" /**< unique path to construct the object */ #define PW_KEY_OBJECT_ID "object.id" /**< a global object id */ -#define PW_KEY_OBJECT_SERIAL "object.serial" /**< a 64 bit object serial number. This is a number - * incremented for each object that is created. - * The lower 32 bits are guaranteed to never be - * SPA_ID_INVALID. */ #define PW_KEY_OBJECT_LINGER "object.linger" /**< the object lives on even after the client * that created it has been destroyed */ #define PW_KEY_OBJECT_REGISTER "object.register" /**< If the object should be registered. */ diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 8a5623e7b..c56edf9cb 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -331,7 +331,6 @@ struct pw_global { pw_global_bind_func_t func; /**< bind function */ void *object; /**< object associated with the interface */ - uint64_t serial; /**< increasing serial number */ struct spa_list resource_list; /**< The list of resources of this global */ @@ -422,8 +421,6 @@ struct pw_context { struct pw_mempool *pool; /**< global memory pool */ - struct pw_map globals; /**< map of globals */ - struct spa_list core_impl_list; /**< list of core_imp */ struct spa_list protocol_list; /**< list of protocols */ struct spa_list core_list; /**< list of core connections */