Make sure we initialize object hash.
authorKristian Høgsberg <krh@redhat.com>
Fri, 12 Dec 2008 16:05:17 +0000 (11:05 -0500)
committerKristian Høgsberg <krh@hinata.localdomain>
Fri, 12 Dec 2008 17:17:47 +0000 (12:17 -0500)
This patch also move the hash implementation details to wayland-util.c.

wayland-util.c
wayland-util.h
wayland.c

index 6bdbf31..1a154ac 100644 (file)
  */
 
 #include <stdlib.h>
+#include <string.h>
 #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;
index ba4ef35..5fc6451 100644 (file)
        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);
index 85301ab..e21d246 100644 (file)
--- 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