lievent源码分析:evbuffer
struct evbuffer定义在evbuffer-internal.h文件中。
evbuffer结构内部保存一个以evbuffer-chain结构为节点的链表,evbuffer内部有两个分别指向首尾节点的指针。
- struct evbuffer {
- /** The first chain in this buffer's linked list of chains. */
- struct evbuffer_chain *first;
- /** The last chain in this buffer's linked list of chains. */
- struct evbuffer_chain *last;
- /** Pointer to the next pointer pointing at the 'last_with_data' chain.
- *
- * To unpack:
- *
- * The last_with_data chain is the last chain that has any data in it.
- * If all chains in the buffer are empty, it is the first chain.
- * If the buffer has no chains, it is NULL.
- *
- * The last_with_datap pointer points at _whatever 'next' pointer_
- * points at the last_with_datap chain. If the last_with_data chain
- * is the first chain, or it is NULL, then the last_with_datap pointer
- * is &buf->first.
- */
- struct evbuffer_chain **last_with_datap;
- /** Total amount of bytes stored in all chains.*/
- size_t total_len;
- /** Number of bytes we have added to the buffer since we last tried to
- * invoke callbacks. */
- size_t n_add_for_cb;
- /** Number of bytes we have removed from the buffer since we last
- * tried to invoke callbacks. */
- size_t n_del_for_cb;
- #ifndef EVENT__DISABLE_THREAD_SUPPORT
- /** A lock used to mediate access to this buffer. */
- void *lock;
- #endif
- /** True iff we should free the lock field when we free this
- * evbuffer. */
- unsigned own_lock : ;
- /** True iff we should not allow changes to the front of the buffer
- * (drains or prepends). */
- unsigned freeze_start : ;
- /** True iff we should not allow changes to the end of the buffer
- * (appends) */
- unsigned freeze_end : ;
- /** True iff this evbuffer's callbacks are not invoked immediately
- * upon a change in the buffer, but instead are deferred to be invoked
- * from the event_base's loop. Useful for preventing enormous stack
- * overflows when we have mutually recursive callbacks, and for
- * serializing callbacks in a single thread. */
- unsigned deferred_cbs : ;
- #ifdef _WIN32
- /** True iff this buffer is set up for overlapped IO. */
- unsigned is_overlapped : ;
- #endif
- /** Zero or more EVBUFFER_FLAG_* bits */
- ev_uint32_t flags;
- /** Used to implement deferred callbacks. */
- struct event_base *cb_queue;
- /** A reference count on this evbuffer. When the reference count
- * reaches 0, the buffer is destroyed. Manipulated with
- * evbuffer_incref and evbuffer_decref_and_unlock and
- * evbuffer_free. */
- int refcnt;
- /** A struct event_callback handle to make all of this buffer's callbacks
- * invoked from the event loop. */
- struct event_callback deferred;
- /** A doubly-linked-list of callback functions */
- LIST_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks;
- /** The parent bufferevent object this evbuffer belongs to.
- * NULL if the evbuffer stands alone. */
- struct bufferevent *parent;
- };
struct evbuffer_chain:
evbuffer-chain结构内部保存一个表示buffer内容长度的变量以及一个char*的指针指向buffer内容所在的位置。
- /** A single item in an evbuffer. */
- struct evbuffer_chain {
- /** points to next buffer in the chain */
- struct evbuffer_chain *next;
- /** total allocation available in the buffer field. */
- size_t buffer_len;
- /** unused space at the beginning of buffer or an offset into a
- * file for sendfile buffers. */
- ev_misalign_t misalign;
- /** Offset into buffer + misalign at which to start writing.
- * In other words, the total number of bytes actually stored
- * in buffer. */
- size_t off;
- /** Set if special handling is required for this chain */
- unsigned flags;
- #define EVBUFFER_FILESEGMENT 0x0001 /**< A chain used for a file segment */
- #define EVBUFFER_SENDFILE 0x0002 /**< a chain used with sendfile */
- #define EVBUFFER_REFERENCE 0x0004 /**< a chain with a mem reference */
- #define EVBUFFER_IMMUTABLE 0x0008 /**< read-only chain */
- /** a chain that mustn't be reallocated or freed, or have its contents
- * memmoved, until the chain is un-pinned. */
- #define EVBUFFER_MEM_PINNED_R 0x0010
- #define EVBUFFER_MEM_PINNED_W 0x0020
- #define EVBUFFER_MEM_PINNED_ANY (EVBUFFER_MEM_PINNED_R|EVBUFFER_MEM_PINNED_W)
- /** a chain that should be freed, but can't be freed until it is
- * un-pinned. */
- #define EVBUFFER_DANGLING 0x0040
- /** a chain that is a referenced copy of another chain */
- #define EVBUFFER_MULTICAST 0x0080
- /** number of references to this chain */
- int refcnt;
- /** Usually points to the read-write memory belonging to this
- * buffer allocated as part of the evbuffer_chain allocation.
- * For mmap, this can be a read-only buffer and
- * EVBUFFER_IMMUTABLE will be set in flags. For sendfile, it
- * may point to NULL.
- */
- unsigned char *buffer;
- };
- /** callback for a reference chain; lets us know what to do with it when
- * we're done with it. Lives at the end of an evbuffer_chain with the
- * EVBUFFER_REFERENCE flag set */
- struct evbuffer_chain_reference {
- evbuffer_ref_cleanup_cb cleanupfn;
- void *extra;
- };
lievent源码分析:evbuffer的更多相关文章
- 【转】libevent源码分析
libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...
- Envoy 源码分析--buffer
目录 Envoy 源码分析--buffer BufferFragment RawSlice Slice OwnedSlice SliceDeque UnownedSlice OwnedImpl Wat ...
- Envoy 源码分析--event
目录 Envoy 源码分析--event libevent Timer SignalEvent FileEvent RealTimeSystem 任务队列 延迟析构 dispacth_thread E ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
随机推荐
- js再学习笔记
#js再学习笔记 ##基本 1.js严格区分大小写 2.js末尾的分号可加,也可不加 3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...
- 链接后加"/"与不加"/"的区别
1.http://www.abc.com/abc2.http://www.abc.com/abc/ 当Web服务器接收到对某个末尾不含斜杠的url请求时,例如“http://www.abc.com/a ...
- oracle空间管理
表空间:组织数据文件的一种途径, 是一个逻辑概念 包含有 表,字段,索引 一个数据库可以对应多个表空间 一个物理文件对应一个表空间 任何一个数据库创建的第一一个表空间是 system Tables ...
- 树莓派文档翻译 - 使用 - GPIO: 树莓派A和B
https://www.raspberrypi.org/documentation/usage/gpio/README.md 2016/6/25 GPIO: 树莓派A和B ##介绍GPIO和在树莓派上 ...
- centos7 挂载数据盘
centos 挂载数据盘1.运行 fdisk -l 命令查看数据盘.注意:在没有分区和格式化数据盘之前,使用 df -h 命令是无法看到数据盘的. 如果执行了 fdisk -l 命令后,没有发现 /d ...
- IAR EW8051-8.10.4安装及破解方法
第一步:获取破解license 1: 点击桌面左下角“开始”按钮,找到cmd.exe,右键创建cmd.exe 快捷方式到桌面: ————如果是windows7 ,请右键点击cmd.exe 快捷图标,点 ...
- css3超过指定宽度文字,显示省略号
text-overflow:ellipsis; overflow:hidden; white-space:nowrap; width:200px;
- git http\https\git免密设置记住用户名和密码的方法
设置记住密码(默认15分钟): git config --global credential.helper cache如果想自己设置时间,可以这样做: git config credential.he ...
- NumberPicker设置宽度,设置文字颜色
修改宽度 wheel = (NumberPicker) findViewById(R.id.info_wheel_province); wheel.setLayoutParams(new Linear ...
- git pull all braches
控制台下执行如下: git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote ...