SPICE协议marshaller的处理

来源:互联网 发布:三星软件市场 编辑:程序博客网 时间:2024/05/29 17:40

m:

struct SpiceMarshaller {
    size_t total_size;
    SpiceMarshallerData *data;
    SpiceMarshaller *next;

    MarshallerRef pointer_ref;

    int n_items;
    int items_size; /* number of items availible in items */
    MarshallerItem *items;

    MarshallerItem static_items[N_STATIC_ITEMS];
};

d:

struct SpiceMarshallerData {
    size_t total_size;
    size_t base;
    SpiceMarshaller *marshallers;
    SpiceMarshaller *last_marshaller;

    size_t current_buffer_position;
    MarshallerBuffer *current_buffer;
    MarshallerItem *current_buffer_item;
    MarshallerBuffer *buffers;

    SpiceMarshaller static_marshaller;
    MarshallerBuffer static_buffer;
};

item:

typedef struct {
    uint8_t *data;
    size_t len;
    spice_marshaller_item_free_func free_data;
    void *opaque;
} MarshallerItem;

buffers:


 

struct MarshallerBuffer {
    MarshallerBuffer *next;
    uint8_t data[MARSHALLER_BUFFER_SIZE];
};

m结构里包括4个item,n_items为当前使用的item数,初始化m时为0,每当增加一个item,n_items++;items_size为item的可用个数,当add的item数超过4个时就spice_new重新申请items_size*2的大小,并copy原来的static items,如果以后再次超过items_size时,就spice_renew扩大原理的一倍。

 

 

原创粉丝点击