diff --git a/wayland-util.c b/wayland-util.c index 6bdbf310..1a154ac9 100644 --- a/wayland-util.c +++ b/wayland-util.c @@ -21,8 +21,34 @@ */ #include +#include #include "wayland.h" +struct wl_hash { + struct wl_object **objects; + uint32_t count, alloc; +}; + +struct wl_hash * +wl_hash_create(void) +{ + struct wl_hash *hash; + + hash = malloc(sizeof *hash); + if (hash == NULL) + return hash; + + memset(hash, 0, sizeof *hash); + + return hash; +} + +void +wl_hash_destroy(struct wl_hash *hash) +{ + free(hash); +} + int wl_hash_insert(struct wl_hash *hash, struct wl_object *object) { struct wl_object **objects; diff --git a/wayland-util.h b/wayland-util.h index ba4ef35f..5fc64516 100644 --- a/wayland-util.h +++ b/wayland-util.h @@ -36,11 +36,10 @@ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) -struct wl_hash { - struct wl_object **objects; - uint32_t count, alloc, id; -}; - +struct wl_object; +struct wl_hash; +struct wl_hash *wl_hash_create(void); +void wl_hash_destroy(struct wl_hash *hash); int wl_hash_insert(struct wl_hash *hash, struct wl_object *object); struct wl_object *wl_hash_lookup(struct wl_hash *hash, uint32_t id); void wl_hash_delete(struct wl_hash *hash, struct wl_object *object); diff --git a/wayland.c b/wayland.c index 85301ab7..e21d246f 100644 --- a/wayland.c +++ b/wayland.c @@ -49,7 +49,7 @@ struct wl_client { struct wl_display { struct wl_object base; struct wl_event_loop *loop; - struct wl_hash objects; + struct wl_hash *objects; struct wl_object *pointer; @@ -317,7 +317,7 @@ wl_client_demarshal(struct wl_client *client, struct wl_object *target, break; case 'o': types[i] = &ffi_type_pointer; - object = wl_hash_lookup(&client->display->objects, *p); + object = wl_hash_lookup(client->display->objects, *p); if (object == NULL) printf("unknown object (%d)\n", *p); if (object->interface != method->types[j]) @@ -329,7 +329,7 @@ wl_client_demarshal(struct wl_client *client, struct wl_object *target, case 'n': types[i] = &ffi_type_uint32; values[i].new_id = *p; - object = wl_hash_lookup(&client->display->objects, *p); + object = wl_hash_lookup(client->display->objects, *p); if (object != NULL) printf("object already exists (%d)\n", *p); p++; @@ -380,7 +380,7 @@ wl_client_connection_data(int fd, uint32_t mask, void *data) if (len < size) break; - object = wl_hash_lookup(&client->display->objects, p[0]); + object = wl_hash_lookup(client->display->objects, p[0]); if (object == NULL) { wl_client_marshal(client, &client->display->base, WL_DISPLAY_INVALID_OBJECT, p[0]); @@ -518,7 +518,7 @@ wl_display_create_surface(struct wl_client *client, } ref->object = &surface->base; - wl_hash_insert(&display->objects, &surface->base); + wl_hash_insert(display->objects, &surface->base); wl_list_insert(client->object_list.prev, &ref->link); return 0; @@ -575,6 +575,12 @@ wl_display_create(void) return NULL; } + display->objects = wl_hash_create(); + if (display->objects == NULL) { + free(display); + return NULL; + } + wl_list_init(&display->surface_list); wl_list_init(&display->client_list); wl_list_init(&display->global_list); @@ -597,7 +603,7 @@ WL_EXPORT void wl_display_add_object(struct wl_display *display, struct wl_object *object) { object->id = display->id++; - wl_hash_insert(&display->objects, object); + wl_hash_insert(display->objects, object); } WL_EXPORT int