diff --git a/pinos/client/context.c b/pinos/client/context.c index 47714484e..9d3dfa463 100644 --- a/pinos/client/context.c +++ b/pinos/client/context.c @@ -597,7 +597,7 @@ pinos_context_connect_fd (PinosContext *context, impl); context->core_proxy = pinos_proxy_new (context, - SPA_ID_INVALID, + 0, context->uri.core); if (context->core_proxy == NULL) goto no_proxy; diff --git a/pinos/client/proxy.c b/pinos/client/proxy.c index 828d84ea6..4e4cc60a1 100644 --- a/pinos/client/proxy.c +++ b/pinos/client/proxy.c @@ -43,14 +43,25 @@ pinos_proxy_new (PinosContext *context, pinos_signal_init (&this->destroy_signal); + if (id == SPA_ID_INVALID) { + id = pinos_map_insert_new (&context->objects, this); + } else if (!pinos_map_insert_at (&context->objects, id, this)) + goto in_use; + + this->id = id; + pinos_protocol_native_client_setup (this); - this->id = pinos_map_insert_new (&context->objects, this); spa_list_insert (&this->context->proxy_list, &this->link); pinos_log_debug ("proxy %p: new %u", this, this->id); return this; + +in_use: + pinos_log_debug ("proxy %p: id %u in use for context %p", this, id, context); + free (impl); + return NULL; } void diff --git a/pinos/server/resource.c b/pinos/server/resource.c index 6ebae731d..6e307ed40 100644 --- a/pinos/server/resource.c +++ b/pinos/server/resource.c @@ -46,20 +46,25 @@ pinos_resource_new (PinosClient *client, this->type = type; this->object = object; this->destroy = destroy; - this->id = id; pinos_signal_init (&this->destroy_signal); - if (!pinos_map_insert_at (&client->objects, this->id, this)) { - pinos_log_debug ("resource %p: id %u in use for client %p", this, id, client); - free (impl); - return NULL; - } + if (id == SPA_ID_INVALID) { + this->id = pinos_map_insert_new (&client->objects, this); + } else if (!pinos_map_insert_at (&client->objects, id, this)) + goto in_use; + + this->id = id; pinos_log_debug ("resource %p: new for client %p id %u", this, client, this->id); pinos_signal_emit (&client->resource_added, client, this); return this; + +in_use: + pinos_log_debug ("resource %p: id %u in use for client %p", this, id, client); + free (impl); + return NULL; } void