mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	Revert "impl-client: improve permission storage"
This reverts commit 888716a871.
			
			
This commit is contained in:
		
							parent
							
								
									77ee3aecd2
								
							
						
					
					
						commit
						1f58b147d6
					
				
					 1 changed files with 34 additions and 23 deletions
				
			
		| 
						 | 
					@ -58,36 +58,46 @@ static struct pw_permission *
 | 
				
			||||||
find_permission(struct pw_impl_client *client, uint32_t id)
 | 
					find_permission(struct pw_impl_client *client, uint32_t id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this);
 | 
						struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this);
 | 
				
			||||||
	struct pw_permission *p, *def = NULL;
 | 
						struct pw_permission *p;
 | 
				
			||||||
 | 
						uint32_t idx = id + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (id == PW_ID_ANY)
 | 
				
			||||||
 | 
							goto do_default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!pw_array_check_index(&impl->permissions, idx, struct pw_permission))
 | 
				
			||||||
 | 
							goto do_default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p = pw_array_get_unchecked(&impl->permissions, idx, struct pw_permission);
 | 
				
			||||||
 | 
						if (p->permissions == PW_PERM_INVALID)
 | 
				
			||||||
 | 
							goto do_default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_array_for_each(p, &impl->permissions) {
 | 
					 | 
				
			||||||
		if (p->id == id && p->permissions != PW_PERM_INVALID)
 | 
					 | 
				
			||||||
	return p;
 | 
						return p;
 | 
				
			||||||
		else if (def == NULL && p->id == PW_ID_ANY)
 | 
					
 | 
				
			||||||
			def = p;
 | 
					do_default:
 | 
				
			||||||
	}
 | 
						return pw_array_get_unchecked(&impl->permissions, 0, struct pw_permission);
 | 
				
			||||||
	return def;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct pw_permission *ensure_permissions(struct pw_impl_client *client, uint32_t id)
 | 
					static struct pw_permission *ensure_permissions(struct pw_impl_client *client, uint32_t id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this);
 | 
						struct impl *impl = SPA_CONTAINER_OF(client, struct impl, this);
 | 
				
			||||||
	struct pw_permission *p, *free = NULL;
 | 
						struct pw_permission *p;
 | 
				
			||||||
 | 
						uint32_t idx = id + 1;
 | 
				
			||||||
 | 
						size_t len, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_array_for_each(p, &impl->permissions) {
 | 
						len = pw_array_get_len(&impl->permissions, struct pw_permission);
 | 
				
			||||||
		if (p->id == id)
 | 
						if (len <= idx) {
 | 
				
			||||||
			return p;
 | 
							size_t diff = idx - len + 1;
 | 
				
			||||||
		else if (free == NULL && p->permissions == PW_PERM_INVALID)
 | 
					
 | 
				
			||||||
			free = p;
 | 
							p = pw_array_add(&impl->permissions, diff * sizeof(struct pw_permission));
 | 
				
			||||||
	}
 | 
							if (p == NULL)
 | 
				
			||||||
	if (free == NULL) {
 | 
					 | 
				
			||||||
		if ((free = pw_array_add(&impl->permissions,
 | 
					 | 
				
			||||||
						sizeof(struct pw_permission))) == NULL)
 | 
					 | 
				
			||||||
			return NULL;
 | 
								return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (i = 0; i < diff; i++) {
 | 
				
			||||||
 | 
								p[i] = PW_PERMISSION_INIT(len + i - 1, PW_PERM_INVALID);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	free->id = id;
 | 
						}
 | 
				
			||||||
	free->permissions = PW_PERM_INVALID;
 | 
						p = pw_array_get_unchecked(&impl->permissions, idx, struct pw_permission);
 | 
				
			||||||
	return free;
 | 
						return p;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** \endcond */
 | 
					/** \endcond */
 | 
				
			||||||
| 
						 | 
					@ -404,7 +414,7 @@ struct pw_impl_client *pw_context_create_client(struct pw_impl_core *core,
 | 
				
			||||||
		goto error_free;
 | 
							goto error_free;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_array_init(&impl->permissions, 64);
 | 
						pw_array_init(&impl->permissions, 1024);
 | 
				
			||||||
	p = pw_array_add(&impl->permissions, sizeof(struct pw_permission));
 | 
						p = pw_array_add(&impl->permissions, sizeof(struct pw_permission));
 | 
				
			||||||
	if (p == NULL) {
 | 
						if (p == NULL) {
 | 
				
			||||||
		res = -errno;
 | 
							res = -errno;
 | 
				
			||||||
| 
						 | 
					@ -679,7 +689,8 @@ int pw_impl_client_update_permissions(struct pw_impl_client *client,
 | 
				
			||||||
				pw_log_warn("%p: invalid global %d", client, permissions[i].id);
 | 
									pw_log_warn("%p: invalid global %d", client, permissions[i].id);
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if ((p = ensure_permissions(client, permissions[i].id)) == NULL) {
 | 
								p = ensure_permissions(client, permissions[i].id);
 | 
				
			||||||
 | 
								if (p == NULL) {
 | 
				
			||||||
				pw_log_warn("%p: can't ensure permission: %m", client);
 | 
									pw_log_warn("%p: can't ensure permission: %m", client);
 | 
				
			||||||
				return -errno;
 | 
									return -errno;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue