wayland客户端对象创建流程

wl_display_dispatch                  wl_display_roundtrip


||                                                             ||
||                                                             \/
||
||                                            wl_display_roundtrip_queue
||                                                              ||
\/                                                              \/


          wl_display_dispatch_queue


||
\/


wl_display_read_events


||
\/


read_events


||
\/


queue_event


||
\/


create_proxies


||
\/


wl_proxy_create_for_id


||

\/


wl_map_insert_at   

                 // 这里传入了一个flags,感觉像是代表着这个对象到底是当前进程发起创建的(0x01),还是对端(C-S,S-C,也就是如果是客户端,对端就是服务器端,反则反之)发起创建的(0x00)

                   // 最新的理解: 调用这个函数基本是保证插入到最末尾的,会产生appen的效果,增加内存分配(如果意外插入到中间位置,可能导致map->free_list记录错误,理论上必须保证插入到最后,
  否则,后果不可预计。)而调用wl_map_insert_new保证获取到的位置可以利用已经删除的位置。

  
  
创建对象都有两条线路,一条是上面的调用轨迹,对象来源于服务器端传过来的对象id及其他信息产生代理对象。(并且这个id有个特点,服务器端的id都会大于  WL_SERVER_ID_START 0xff000000


客户端调用服务器请求(需要获取一个对象) (wl_display_get_registry/wl_registry_bind等)


wl_proxy_marshal_constructor
||

\/



wl_proxy_marshal_array_constructor
||

\/



wl_proxy_marshal_array_constructor_versioned
||

\/



create_outgoing_proxy
||

\/



proxy_create
||

\/



wl_map_insert_new   // 安全的插入对象,并可以利用删除过的对象存储空间

你可能感兴趣的:(Wayland)