天天看點

wayland資料結構之wl_map

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;