diff --git a/src/wayland-private.h b/src/wayland-private.h index ea702584..2113d837 100644 --- a/src/wayland-private.h +++ b/src/wayland-private.h @@ -46,6 +46,7 @@ void wl_map_init(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); 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_lookup(struct wl_map *map, uint32_t i); void wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data); diff --git a/src/wayland-util.c b/src/wayland-util.c index 107b6dbb..eacf9026 100644 --- a/src/wayland-util.c +++ b/src/wayland-util.c @@ -214,6 +214,39 @@ wl_map_insert_at(struct wl_map *map, uint32_t i, void *data) 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_map_remove(struct wl_map *map, uint32_t i) {