libevent 源码分析(多线程收发epoll_wait)
如果现在有个需求,线程池 同时用于收发网路消息,那么就会出现个问题,假如逻辑线程在向 线程池发送消息,但是此时线程池,正好处于epoll_wait那么我们此时就需要在发送晓得时候去通知,epoll_ctl (EPOLL_CTL_MOD)用于唤醒。 加粗位置实现的唤醒操作。
那么libevent 是如何实现的呢,在bufferevent 初始化的时候
structbufferevent*
bufferevent_socket_new(structevent_base*base, evutil_socket_t fd,
intoptions)
{
structbufferevent_private*bufev_p;
structbufferevent*bufev;
#ifdefWIN32
if(base && event_base_get_iocp(base))
returnbufferevent_async_new(base, fd, options);
#endif
if((bufev_p = mm_calloc(1,sizeof(structbufferevent_private)))== NULL)
returnNULL;
if(bufferevent_init_common(bufev_p, base, &bufferevent_ops_socket,
options) < 0) {
mm_free(bufev_p);
returnNULL;
}
bufev = &bufev_p->bev;
evbuffer_set_flags(bufev->output, EVBUFFER_FLAG_DRAINS_TO_FD);
event_assign(&bufev->ev_read, bufev->ev_base, fd,
EV_READ|EV_PERSIST, bufferevent_readcb, bufev);
event_assign(&bufev->ev_write, bufev->ev_base, fd,
EV_WRITE|EV_PERSIST, bufferevent_writecb, bufev);
evbuffer_add_cb(bufev->output, bufferevent_socket_outbuf_cb, bufev);
evbuffer_freeze(bufev->input, 0);
evbuffer_freeze(bufev->output, 1);
returnbufev;
}