mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05: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