mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2026-04-08 08:21:16 -04:00
wayland-util: add method for reserving new object id
wl_map_reserve_new() ensures that new id is valid and will point to an empty array entry.
This commit is contained in:
parent
900e4b63ef
commit
bfcd681930
2 changed files with 34 additions and 0 deletions
|
|
@ -46,6 +46,7 @@ void wl_map_init(struct wl_map *map);
|
||||||
void wl_map_release(struct wl_map *map);
|
void wl_map_release(struct wl_map *map);
|
||||||
uint32_t wl_map_insert_new(struct wl_map *map, uint32_t side, void *data);
|
uint32_t wl_map_insert_new(struct wl_map *map, uint32_t side, void *data);
|
||||||
int wl_map_insert_at(struct wl_map *map, uint32_t i, void *data);
|
int wl_map_insert_at(struct wl_map *map, uint32_t i, void *data);
|
||||||
|
int wl_map_reserve_new(struct wl_map *map, uint32_t i);
|
||||||
void wl_map_remove(struct wl_map *map, uint32_t i);
|
void wl_map_remove(struct wl_map *map, uint32_t i);
|
||||||
void *wl_map_lookup(struct wl_map *map, uint32_t i);
|
void *wl_map_lookup(struct wl_map *map, uint32_t i);
|
||||||
void wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data);
|
void wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data);
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,39 @@ wl_map_insert_at(struct wl_map *map, uint32_t i, void *data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WL_EXPORT int
|
||||||
|
wl_map_reserve_new(struct wl_map *map, uint32_t i)
|
||||||
|
{
|
||||||
|
union map_entry *start;
|
||||||
|
uint32_t count;
|
||||||
|
struct wl_array *entries;
|
||||||
|
|
||||||
|
if (i < WL_SERVER_ID_START) {
|
||||||
|
entries = &map->client_entries;
|
||||||
|
} else {
|
||||||
|
entries = &map->server_entries;
|
||||||
|
i -= WL_SERVER_ID_START;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = entries->size / sizeof *start;
|
||||||
|
|
||||||
|
if (count < i)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (count == i) {
|
||||||
|
wl_array_add(entries, sizeof *start);
|
||||||
|
start = entries->data;
|
||||||
|
start[i].data = NULL;
|
||||||
|
} else {
|
||||||
|
start = entries->data;
|
||||||
|
if (start[i].data != NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
wl_map_remove(struct wl_map *map, uint32_t i)
|
wl_map_remove(struct wl_map *map, uint32_t i)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue