总结
- 添加对于Windows的兼容
- 核心添加部分是bufferevent,模拟一个RW的两个缓存池用于管理,同时添加两个RW事件进行将socket的输入输出数据读到缓存池,再由用户读取
- 将activequeue使用多优先级队列形式实现
evbuffer结构体

evbuffer(event.h)结构体用于保存和管理缓存数据
- evbuffer的buffer使用队列的方式进行管理,实现数据流的先进先出
- evbuffer的结构体:libevent的缓冲是一个连续的内存区域,其处理数据的方式是一个队列操作方式:从后写入,从前读出。
- evbuffer分别设置相关指针(一个指标)用于指示读出位置和写入位置。
- orig_buffer指向由realloc分配的连续内存区域,buffer指向有效数据的内存区域,
- totallen表示orig_buffer指向的内存区域的大小,misalign表示buffer相对于orig_buffer的偏移
- off表示有效数据的长度。123456789101112131415struct evbuffer{u_char *buffer; // 当前有效缓冲区的内存起始地址u_char *orig_buffer; // 整个分配(realloc)用来缓冲的内存起始地址size_t misalign; // origin_buffer和buffer之间的字节数size_t totallen; // 整个分配用来缓冲的内存字节数size_t off; // 当前有效缓冲区的长度(字节数)void (*cb)(struct evbuffer *, size_t, size_t, void *); //回调函数,当缓冲区有变化的时候会被调用void *cbarg; //回调函数的参数};
evbuffer相关函数
- evbuffer_new: 使用calloc创建一个evbuffer块
- evbuffer_write:
(struct evbuffer *buffer, int fd)把缓冲区中的数据,调用send/write函数写入文件描述符fd上,如果sendwrite函数写入的字节数大于0,则调用evbuffer_drain删除已写的数据 - evbuffer_drain:
(struct evbuffer *buf, size_t len)将buf中有效空间减少len - evbuffer_read:
(struct evbuffer *buf, int fd, int howmuch)调用read/recv函数,从文件描述符fd上读取数据到evbuffer中。如果缓冲区不够,调用evbuffer_expand扩充缓冲区。 evbuffer_free: 先释放buffer->orig_buffer中空间在释放buffer自身空间
evbuffer_align: 处理先进先出的读写时,有效数值之前的已经被读写的废弃部分
- evbuffer_add:
(struct evbuffer *buf, void *data, size_t datlen)将data中datlen长的数据读入buf中,该函数用于添加一段用户数据到evbuffer中。很简单,就是先判断是否有足够的空闲内存,如果没有则调用evbuffer_expand扩充之,然后直接memcpy,更新off指标。 - evbuffer_add_buffer:
(struct evbuffer *outbuf, struct evbuffer *inbuf)移动数据从一个evbuffer到另一个evbuffer。实际上还是调用了evbuffer_add添加数据到outbuf中。但会清除inbuf中的数据。返回值:成功返回0, 失败返回-1。 int evbuffer_expand
(struct evbuffer *buf, size_t datlen)将buf中的有效空间大小扩张到buf->misalign + buf->off + datlen;evbuffer_add_printf
(struct evbuffer *buf, char *fmt, ...)将数据以fmt格式输出到buf中(类似printf)- evbuffer_remove
(struct evbuffer *buf, void *data, size_t datlen)该函数用于将evbuffer中的数据复制给用户空间(读数据) - evbuffer_find
(struct evbuffer *buffer, u_char *what, size_t len)在buffer中查找what - void evbuffer_setcb
(struct evbuffer *buffer,void (*cb)(struct evbuffer *, size_t, size_t, void *),void *cbarg)为buffer设置回调函数
evbuffer_align和evbuffer_expand调整原来buffer的空间
- evbuffer_add:
(struct evbuffer *buf, void *data, size_t datlen)将data中datlen长的数据读入buf中 - evbuffer_free: 先释放buffer->orig_buffer中空间在释放buffer自身空间
- evbuffer_align: 处理先进先出的读写时,有效数值之前的已经被读写的废弃部分
- int evbuffer_expand
(struct evbuffer *buf, size_t datlen)将buf中的有效空间大小扩张到buf->misalign + buf->off + datlen;123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990// buffer.cint evbuffer_add(struct evbuffer *buf, void *data, size_t datlen){size_t need = buf->misalign + buf->off + datlen;size_t oldoff = buf->off;// 调整空间使得buf有足够的空间if (buf->totallen < need) {if (evbuffer_expand(buf, datlen) == -1)return (-1);}memcpy(buf->buffer + buf->off, data, datlen);buf->off += datlen;// 回调buf中的cb函数if (datlen && buf->cb != NULL)(*buf->cb)(buf, oldoff, buf->off, buf->cbarg);return (0);}static inline void evbuffer_align(struct evbuffer *buf){memmove(buf->orig_buffer, buf->buffer, buf->off);buf->buffer = buf->orig_buffer;buf->misalign = 0;}int evbuffer_expand(struct evbuffer *buf, size_t datlen){size_t need = buf->misalign + buf->off + datlen;if (buf->totallen >= need)return (0);if (buf->misalign >= datlen) {evbuffer_align(buf);} else {void *newbuf;size_t length = buf->totallen;if (length < 256)length = 256;while (length < need)length <<= 1;if (buf->orig_buffer != buf->buffer)evbuffer_align(buf);if ((newbuf = realloc(buf->buffer, length)) == NULL)return (-1);buf->orig_buffer = buf->buffer = newbuf;buf->totallen = length;}return (0);}// 将buf中的有效空间大小扩张到buf->misalign + buf->off + datlen;int evbuffer_expand(struct evbuffer *buf, size_t datlen){size_t need = buf->misalign + buf->off + datlen;/* If we can fit all the data, then we don't have to do anything */if (buf->totallen >= need)return (0);if (buf->misalign >= datlen) {evbuffer_align(buf);} else {void *newbuf;size_t length = buf->totallen;if (length < 256)length = 256;while (length < need)length <<= 1;if (buf->orig_buffer != buf->buffer)evbuffer_align(buf);if ((newbuf = realloc(buf->buffer, length)) == NULL)return (-1);buf->orig_buffer = buf->buffer = newbuf;buf->totallen = length;}return (0);}
evbuffer_write和evbuffer_read
|
|
bufferevent
bufferevent结构体用于管理input和output缓存,模拟socket通信中的两个端口,同时使用ev_read和ev_write事件作为控制
bufferevent使用ev_read和ev_write作为读写事件,用于将跟event的整个loop做关联,完成fd的读写控制. bufferevent中用于存放数据的缓存(input和output), bufferevent_readcb数据从fd读入到input(这是在ev_read事件的回调函数触发的),即bufferevent_readcb是ev_read事件的回调函数,并在合适时候调用readcb. bufferevent_readcb数据从output读入到fd(这是在ev_write事件的回调函数触发的),即bufferevent_writecb是ev_write事件的回调函数,并在合适时候调用writecb.
|
|
bufferevent处理函数
- bufferevent_new:
(int fd, evbuffercb readcb, evbuffercb writecb,everrorcb errorcb, void *cbarg)创建input和output,并添加RW两个event,将其处理函数设为bufferevent_readcb和bufferevent_writecb(调用readcb和writecb) - bufferevent_add:
(struct event *ev, int timeout)调用event_add将ev(一般来源于bufferevent的ev_write和ev_read事件)加入消息控制当中 - bufferevent_writecb:处理buffer中的写消息函数
bufferevent_readcb:处理buffer中的读消息函数
bufferevent_write(struct bufferevent bufev, void data, size_t size)将data写进bufev的缓存区,并添加写event
- bufferevent_write_buffer(struct bufferevent bufev, struct evbuffer buf)将buf缓存中的数据加入bufev的缓存区,并添加写event
size_t bufferevent_read
(struct bufferevent *bufev, void *data, size_t size)从bufev中读取数据到data中bufferevent_disable
(struct bufferevent *bufev, short event)根据event移除bufev中的R或W事件,并从队列中删除- bufferevent_enable
(struct bufferevent *bufev, short event)根据event添加bufev中的R或W事件,并加入队列中 - bufferevent_free
(struct bufferevent *bufev)销毁RW的struct event和RW的struct evbuffer - bufferevent_priority_set
(struct bufferevent *bufev, int priority)调用event的event_priority_set函数将bufev中RW都设置为priority优先级 - bufferevent_settimeout
(struct bufferevent *bufev, int timeout_read, int timeout_write)设置bufev中RW时间的timeout_write和timeout_read - bufferevent_setwatermark
(struct bufferevent *bufev, short events, size_t lowmark, size_t highmark)设置bufev中events事件的lowmark和highmark12345678910111213141516171819202122232425262728293031struct bufferevent *bufferevent_new(int fd, evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg){struct bufferevent *bufev;if ((bufev = calloc(1, sizeof(struct bufferevent))) == NULL)return (NULL);if ((bufev->input = evbuffer_new()) == NULL) {free(bufev);return (NULL);}if ((bufev->output = evbuffer_new()) == NULL) {evbuffer_free(bufev->input);free(bufev);return (NULL);}event_set(&bufev->ev_read, fd, EV_READ, bufferevent_readcb, bufev);event_set(&bufev->ev_write, fd, EV_WRITE, bufferevent_writecb, bufev);bufev->readcb = readcb;bufev->writecb = writecb;bufev->errorcb = errorcb;bufev->cbarg = cbarg;bufev->enabled = EV_READ | EV_WRITE;return (bufev);}
处理buffer中的读写消息函数
- bufferevent_writecb:处理buffer中的写消息函数
- bufferevent_readcb:处理buffer中的读消息函数

|
|
event_base结构体
event_base结构体用于作为整个event库的管理中心类,定义了event控制类(evsel和evbase),各种消息队列(除了全局队列,eventqueue、activequeues和timetree)。其中activequeues表示多个队列,用于保存不同优先级的事件
|
|
event_priority_init和event_base_priority_init
|
|
loop相关函数
|
|
event_once函数
|
|
其他函数
|
|