首页 > 代码库 > lievent源码分析:evbuffer

lievent源码分析:evbuffer

struct evbuffer定义在evbuffer-internal.h文件中。

evbuffer结构内部保存一个以evbuffer-chain结构为节点的链表,evbuffer内部有两个分别指向首尾节点的指针。

 1 struct evbuffer { 2     /** The first chain in this buffer‘s linked list of chains. */ 3     struct evbuffer_chain *first; 4     /** The last chain in this buffer‘s linked list of chains. */ 5     struct evbuffer_chain *last; 6  7     /** Pointer to the next pointer pointing at the ‘last_with_data‘ chain. 8      * 9      * To unpack:10      *11      * The last_with_data chain is the last chain that has any data in it.12      * If all chains in the buffer are empty, it is the first chain.13      * If the buffer has no chains, it is NULL.14      *15      * The last_with_datap pointer points at _whatever ‘next‘ pointer_16      * points at the last_with_datap chain.  If the last_with_data chain17      * is the first chain, or it is NULL, then the last_with_datap pointer18      * is &buf->first.19      */20     struct evbuffer_chain **last_with_datap;21 22     /** Total amount of bytes stored in all chains.*/23     size_t total_len;24 25     /** Number of bytes we have added to the buffer since we last tried to26      * invoke callbacks. */27     size_t n_add_for_cb;28     /** Number of bytes we have removed from the buffer since we last29      * tried to invoke callbacks. */30     size_t n_del_for_cb;31 32 #ifndef EVENT__DISABLE_THREAD_SUPPORT33     /** A lock used to mediate access to this buffer. */34     void *lock;35 #endif36     /** True iff we should free the lock field when we free this37      * evbuffer. */38     unsigned own_lock : 1;39     /** True iff we should not allow changes to the front of the buffer40      * (drains or prepends). */41     unsigned freeze_start : 1;42     /** True iff we should not allow changes to the end of the buffer43      * (appends) */44     unsigned freeze_end : 1;45     /** True iff this evbuffer‘s callbacks are not invoked immediately46      * upon a change in the buffer, but instead are deferred to be invoked47      * from the event_base‘s loop.    Useful for preventing enormous stack48      * overflows when we have mutually recursive callbacks, and for49      * serializing callbacks in a single thread. */50     unsigned deferred_cbs : 1;51 #ifdef _WIN3252     /** True iff this buffer is set up for overlapped IO. */53     unsigned is_overlapped : 1;54 #endif55     /** Zero or more EVBUFFER_FLAG_* bits */56     ev_uint32_t flags;57 58     /** Used to implement deferred callbacks. */59     struct event_base *cb_queue;60 61     /** A reference count on this evbuffer.     When the reference count62      * reaches 0, the buffer is destroyed.    Manipulated with63      * evbuffer_incref and evbuffer_decref_and_unlock and64      * evbuffer_free. */65     int refcnt;66 67     /** A struct event_callback handle to make all of this buffer‘s callbacks68      * invoked from the event loop. */69     struct event_callback deferred;70 71     /** A doubly-linked-list of callback functions */72     LIST_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks;73 74     /** The parent bufferevent object this evbuffer belongs to.75      * NULL if the evbuffer stands alone. */76     struct bufferevent *parent;77 };

struct evbuffer_chain:

evbuffer-chain结构内部保存一个表示buffer内容长度的变量以及一个char*的指针指向buffer内容所在的位置。

 1 /** A single item in an evbuffer. */ 2 struct evbuffer_chain { 3     /** points to next buffer in the chain */ 4     struct evbuffer_chain *next; 5  6     /** total allocation available in the buffer field. */ 7     size_t buffer_len; 8  9     /** unused space at the beginning of buffer or an offset into a10      * file for sendfile buffers. */11     ev_misalign_t misalign;12 13     /** Offset into buffer + misalign at which to start writing.14      * In other words, the total number of bytes actually stored15      * in buffer. */16     size_t off;17 18     /** Set if special handling is required for this chain */19     unsigned flags;20 #define EVBUFFER_FILESEGMENT    0x0001  /**< A chain used for a file segment */21 #define EVBUFFER_SENDFILE    0x0002    /**< a chain used with sendfile */22 #define EVBUFFER_REFERENCE    0x0004    /**< a chain with a mem reference */23 #define EVBUFFER_IMMUTABLE    0x0008    /**< read-only chain */24     /** a chain that mustn‘t be reallocated or freed, or have its contents25      * memmoved, until the chain is un-pinned. */26 #define EVBUFFER_MEM_PINNED_R    0x001027 #define EVBUFFER_MEM_PINNED_W    0x002028 #define EVBUFFER_MEM_PINNED_ANY (EVBUFFER_MEM_PINNED_R|EVBUFFER_MEM_PINNED_W)29     /** a chain that should be freed, but can‘t be freed until it is30      * un-pinned. */31 #define EVBUFFER_DANGLING    0x004032     /** a chain that is a referenced copy of another chain */33 #define EVBUFFER_MULTICAST    0x008034 35     /** number of references to this chain */36     int refcnt;37 38     /** Usually points to the read-write memory belonging to this39      * buffer allocated as part of the evbuffer_chain allocation.40      * For mmap, this can be a read-only buffer and41      * EVBUFFER_IMMUTABLE will be set in flags.  For sendfile, it42      * may point to NULL.43      */44     unsigned char *buffer;45 };46 47 /** callback for a reference chain; lets us know what to do with it when48  * we‘re done with it. Lives at the end of an evbuffer_chain with the49  * EVBUFFER_REFERENCE flag set */50 struct evbuffer_chain_reference {51     evbuffer_ref_cleanup_cb cleanupfn;52     void *extra;53 };

 

lievent源码分析:evbuffer