struct wl_map {
struct wl_array client_entries;
struct wl_array server_entries;
uint32_t side;
uint32_t free_list;
};
struct wl_array {
size_t size;
size_t alloc;
void *data;
};
union map_entry {
uintptr_t next;
void *data;
};
wl_map結構體存放wayland用戶端和伺服器端對應的對象。其中:
client_entries: 用wl_array數組儲存用戶端的對象。(這種情況server_entries不使用)
server_entries:用wl_array數組儲存伺服器端的對象。(這種情況client_entries不使用)
side:表明目前map儲存的是用戶端還是伺服器端對象(通過這個變量,确定client_entries/server_entries裡面儲存有對象)
free_list:這個變量用來記錄目前已經被删除了的對象的存放位置,但是對這個位置做了個處理。((i << 1) | 1 : i代表下标, 也就是指針的最後一位置為1),
然後,這個下标所指的位置的map_entry.next變量記錄着下一個被删除的位置(直到為0,free_list初始值為0),形成連結清單
提示: map的節點是map_entry結構。data儲存實際的對象的位址。但是這個位址做了處理
(原理上data是指針,編譯器為了4位元組對齊,最後兩位都是0,map利用了這兩位。把倒數第二位儲存flags的值(0/1),最後一位表示目前對象是否已經被删除了(1表示删除,0表示沒删除))
flags: entry->next |= (flags & 0x1) << 1;
deleted: map->free_list = (i << 1) | 1;