event_base : 跟踪事件
event_new() : 监听描述符 fd
event_add() :添加事件监听
event_base_dispatch() : 循环 分发事件
event_enable_debug_mode () : 开启debug
event_assign : 自定义结构 控制描述符
- 编译:Setting up the Libevent library
event_set_log_callback : 重写 log
event_set_mem_functions : 内存申请
多线程是不安全的 , 在libevent 上锁, 需要告诉libevent 哪些 locking 函数要使用。 使用evthread_set_lock_callbacks 和 evthread_set_id_callback
调试lock evthread_enable_lock_debuging
调试事件, (使用 event_assign 可能会耗尽内存) 调试事件 需要额外的内存和cpu ,需要调用 event_enable_debug_mode ; 更多调试细节需要 -DUSE_DEBUG 编译
LIBEVENT_VERSION_NUMBER : libevent的版本
libevent_global_shutdown : free 全局变量 , 只能确认内部全局变量释放,不能释放通过函数返回的变量
2. create event_base
-
- 每个event_base 有一系列events ,每个base 都有个backend 方法,比如epoll, 多线程则需要多个base
- event_config_avoid_method 在程序中控制使用底层方法 epoll,event_config_avoid_method(cfg, "select");
- event_config_require_feature ET
- EVENT_BASE_FLAG_NO_CACHE_TIME 超时回调后 检查当前时间
- event_config_set_num_cpus_hint : Windows iocp
- event_base_get_features : 支持的特性 , 还有其他支持的函数
3. event loop :
-
- event_base_loop :
EVLOOP_ONCE 等待直到事件活跃,执行完毕后return
EVLOOP_NONBLOCK ,不会等待event trigger ,只会检查目前是否有event ,一次性
EVLOOP_NO_EXIT_ON_EMPTY 没有pending或active事件不会退出
-
- event_base_dispatch: 一直keep running
- event_base_loopbreak: 停止当前循环 ,立即停止
- event_base_loopexit : 非立即停止
- event_base_dump_events : debug 添加的event
4. event
-
- make event pending , call event_add() ,本身初始化时non-pending 的
- callback () fd, 触发事件 ,参数
- evutil_make_socket_nonblocking 非阻塞
- event_new 绑定的fd , fd需要先处理, 比如设置为非阻塞, 创建socket ,listen fd
- 默认情况, 事件触发过一次,想要再次触发,可以在callback中调用event_add 。 fd 准备好读或者写时, pending 变成 active , 在回调调用前, event 是变成non -pending 的
- 如果事件是 EV_PERSIST , event 仍然保持 pending 即使此时回调可以被调用
- event_self_cbarg : 自己变成参数
- evtimer_new : 一些timer回调宏定义
- 不要调用event_assign 在一个已经pending 的event , 如果event已经初始化并且pending,在assign之前 event_del
- 若想保持和libevent 二进制兼容性, event_assign 时, event_get_struct_event_size 得到大小
- event_del 对non pending 和 active 无效
- event_remove_timer 移除event 上的 timer 超时
- 设置事件处理优先级, 先event_base_priority_init, 再 event_priority_set
- event_pending : 如果event 是pending或者active 返回 what argument 的设置,EV_READ这些
- event_get_assignment : 复制 event what
- event_base_once : 只处理一次 event ,不能手动删除
- event_active : 手动触发event
- event_base_init_common_timeout : 相同的timeout 的event 放在 queue中 O(1)时间复杂度 , 根据返回值 使用
- event_initialized 判断event 是否初始化
5. utility and portable function
-
- evutil_socket_t : linux 下是 typedef int ; windows 是 intptr_t
- evutil_timeradd :操作timeval add
- evutil_gettimeofday :当前时间
- evutil_closesocket : 关闭socket
- EVUTIL_SOCKET_ERROR : socket 错误码
- evutil_make_socket_nonblocking : 非阻塞 , O_NONBLOCK on Unix
- evutil_make_listen_socket_reuseable : listener socket关闭后,可以立即被其他socket使用 , 处理服务器重启 TIME_WAIT 情况
- evutil_make_socket_closeonexec : fork exec 后关闭 fd
- evutil_inet_ntop , evutil_inet_pton : 转换ip 点分十进制和二进制
6. bufferevent
-
- 四种类型 socket-based , asynchronous-IO, filtering bufferevents, paired bufferevents
- 4 种 watermarks: Read low-water mark , 高于等于会调用 读callback ,Read High 则不读 ,默认无限;Write Low 高于开始写; Write High 不会被直接调用。
- 在比如连接关闭,或者其他错误, 会有错误 BEV_EVENT_READING 等 。
- BEV_OPT_DEFER_CALLBACKS 延迟callback , BEV_OPT_CLOSE_ON_FREE 结束时释放fd
- bufferevent_socket_new 创建bufferevent
- bufferevent_socket_connect : 如果bufferevent的socket没有connect,可以使用这个,起到connect作用
- Bufferevents 是内部引用计数,等到挂起的回调执行完毕才会被删除, bufferevent_free
- BEV_OPT_CLOSE_ON_FREE , free时 关闭socket
- bufferevent_enable : 开启某个事件 。 新创建的默认的开启WRITE
- bufferevent_get_input : 返回 buffer , 可读,数据被应用remove
- bufferevent_get_output : 返回写buffer , 可写, 数据被应用add到buffer
- bufferevent_write : 添加数据到output buffer
- bufferevent_set_timeouts : 设置超时 , 当尝试读 超过 timeout ,event变成disable
- bufferevent_flush : 强制bufferevent 读或者写
7. bufferevent -advance
-
- bufferevent_pair_new : paird bufferevent
- bufferevent_filter_new : 封装一层 bufferevent
- bufferevent & rate-limiting : token bucket 限制速率 , ev_token_bucket_cfg_new
- bufferevent_rate_limit_group_new : 限制组速率 , 一组bufferevent
- bufferevent_rate_limit_group_set_min_share: 设置组共享数, 速率/share
8. ev_buffer
-
- evbuffer 是用字节队列实现的, 在末端添加数据,头部移除数据
- evbuffer_new :创建buffer
- evbuffer_enable_locking : 可以使用锁 evbuffer_lock:加锁
- evbuffer_get_length : evbuffer 的字节数
- evbuffer_copyout : 复制,而不remove
- evbuffer_drain : 移除 n 字节数据
- evbuffer_remove : 移除并且拷贝到 data, n字节
- evbuffer_readln 按行读 , 有参数控制\r\n
- evbuffer_ptr_set :控制buffer 指针移动
- evbuffer_reserve_space : 扩大空间,返回的指针存在参数vec里, 需要提交evbuffer_commit_space
- evbuffer_read : 从socket 写入buffer末端
- evbuffer_cb_func : evbuffer 回调
- evbuffer_add_cb : 添加回调
- evbuffer_remove_cb_entry :删除回调
- evbuffer_add_reference : 不拷贝, evbuffer存储数据的指针
- evbuffer_add_file : 文件写入网络
- evconnlistener_new : 返回listener