欢迎光临散文网 会员登陆 & 注册

Event in Action(3.1) Buffer event

2023-06-10 23:35 作者:米诺斯人  | 我要投稿

buffer event 专门用于处理io事件,如socket的io。

对普通event进行封装,当epoll返回可写可读event的时候,触发框架自带的回调函数进行读写。自动处理类似EWOULDBLOCK的非阻塞读写时,可恢复的errno,以及不可回复的errno。


回调函数中的事件参数 short events:

  • BEV_EVENT_READING

    An event occured during a read operation on the bufferevent. See the other flags for which event it was.

  • BEV_EVENT_WRITING

    An event occured during a write operation on the bufferevent. See the other flags for which event it was.

  • BEV_EVENT_ERROR

    读写操作的时候发生错误。

  • BEV_EVENT_TIMEOUT

    超时。

  • BEV_EVENT_EOF

    对方关闭连接。

  • BEV_EVENT_CONNECTED

    本地主动关闭连接。

水位:见下一篇。


这里只说一下参数三:

  • BEV_OPT_CLOSE_ON_FREE

    free buffer内存的时候自动关闭socket

  • BEV_OPT_THREADSAFE

    多线程安全。

  • BEV_OPT_DEFER_CALLBACKS

    延迟调用callback,防止爆栈(比如callback1写入buffer导致buffer满了,callback2这时候触发(full条件),之间drain空buffer,empty条件又触发callback1,如此循环往复)

  • BEV_OPT_UNLOCK_CALLBACKS

    buffer触发事件,调用callback的时候,先release mutex

如果要自动产生connect的socket:

address为对端地址。

一些http的东西就不谈了,还没学

设定三种callback。

值得一提的是eventcb,在链接发生读写之外的事件,或者读写触发水位线的时候会触发。

可以通过null来禁用callback。

设置event以及timeout。

对普通struct event的封装

一般不需要禁用读事件,在input buffer满了的时候,框架自动停止read,直到buffer又有了新的空间。

水位设定。

buffer读写相关。不重要的,简单看看就会。复杂度也很明显没什么可讨论的。

强迫buffer event预留足够的空间。

socket buffer没有这个配置。

优先级以及上锁。如果初始化的时候没有设定BEV_OPT_THREADSAFE,则上锁没有任何效果。


Event in Action(3.1) Buffer event的评论 (共 条)

分享到微博请遵守国家法律