mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2026-04-27 06:46:40 -04:00
client: Add WL_MAP_ENTRY_ZOMBIE flag
Add a new map entry flag to indicate that the object received is valid,
but a zombie. Previously this relied on a fixed object pointer, but
future patches in this series will have map entries returning either
NULL, or a different structure type entirely, for zombie objects.
wl_object_is_zombie() now solely uses the new flag to determine whether
or not the object is a zombie.
[daniels: Extracted from Derek's bespoke-zombie patch as an intermediate
step.]
Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
69fab4fffc
commit
07d7a9968d
3 changed files with 21 additions and 9 deletions
|
|
@ -834,9 +834,18 @@ wl_connection_demarshal(struct wl_connection *connection,
|
||||||
bool
|
bool
|
||||||
wl_object_is_zombie(struct wl_map *map, uint32_t id)
|
wl_object_is_zombie(struct wl_map *map, uint32_t id)
|
||||||
{
|
{
|
||||||
struct wl_object *object = wl_map_lookup(map, id);
|
uint32_t flags;
|
||||||
|
|
||||||
return (object == WL_ZOMBIE_OBJECT);
|
/* Zombie objects only exist on the client side. */
|
||||||
|
if (map->side == WL_MAP_SERVER_SIDE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* Zombie objects can only have been created by the client. */
|
||||||
|
if (id >= WL_SERVER_ID_START)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
flags = wl_map_lookup_flags(map, id);
|
||||||
|
return !!(flags & WL_MAP_ENTRY_ZOMBIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
||||||
|
|
@ -405,15 +405,17 @@ wl_proxy_create_for_id(struct wl_proxy *factory,
|
||||||
static void
|
static void
|
||||||
proxy_destroy(struct wl_proxy *proxy)
|
proxy_destroy(struct wl_proxy *proxy)
|
||||||
{
|
{
|
||||||
if (proxy->flags & WL_PROXY_FLAG_ID_DELETED)
|
if (proxy->flags & WL_PROXY_FLAG_ID_DELETED) {
|
||||||
wl_map_remove(&proxy->display->objects, proxy->object.id);
|
wl_map_remove(&proxy->display->objects, proxy->object.id);
|
||||||
else if (proxy->object.id < WL_SERVER_ID_START)
|
} else if (proxy->object.id < WL_SERVER_ID_START) {
|
||||||
wl_map_insert_at(&proxy->display->objects, 0,
|
wl_map_insert_at(&proxy->display->objects,
|
||||||
proxy->object.id, WL_ZOMBIE_OBJECT);
|
WL_MAP_ENTRY_ZOMBIE,
|
||||||
else
|
proxy->object.id,
|
||||||
|
WL_ZOMBIE_OBJECT);
|
||||||
|
} else {
|
||||||
wl_map_insert_at(&proxy->display->objects, 0,
|
wl_map_insert_at(&proxy->display->objects, 0,
|
||||||
proxy->object.id, NULL);
|
proxy->object.id, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
proxy->flags |= WL_PROXY_FLAG_DESTROYED;
|
proxy->flags |= WL_PROXY_FLAG_DESTROYED;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,8 @@ wl_interface_equal(const struct wl_interface *iface1,
|
||||||
* flags. If more flags are ever added, the implementation of wl_map will have
|
* flags. If more flags are ever added, the implementation of wl_map will have
|
||||||
* to change to allow for new flags */
|
* to change to allow for new flags */
|
||||||
enum wl_map_entry_flags {
|
enum wl_map_entry_flags {
|
||||||
WL_MAP_ENTRY_LEGACY = (1 << 0)
|
WL_MAP_ENTRY_LEGACY = (1 << 0), /* Server side only */
|
||||||
|
WL_MAP_ENTRY_ZOMBIE = (1 << 0) /* Client side only */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wl_map {
|
struct wl_map {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue