mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-02 09:01:39 -05:00
Make sure we initialize object hash.
This patch also move the hash implementation details to wayland-util.c.
This commit is contained in:
parent
997e71eb1e
commit
864c468b42
3 changed files with 42 additions and 11 deletions
|
|
@ -21,8 +21,34 @@
|
|||
*/
|
||||
|
||||
#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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
18
wayland.c
18
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue