libcouchbase是couchbase的客户端库,有很多的语言版本,现在看的是c语言2.0.6版本。
libcouchbase支持时间循环使用libevent或者libev,并且在默认情况下,优先选择libevent,如果不存在libevent,再使用libev,这样的逻辑选择在函数栈
#0 create_v1 (io=0x7fffffffd5d8, options=0x7fffffffd500) at src/iofactory.c:218
#1 0x00002aaaaaacd34c in create_v0 (options=0x7fffffffd520, io=0x7fffffffd5d8) at src/iofactory.c:202
#2 lcb_create_io_ops (io=0x7fffffffd5d8, io_opts=<optimized out>) at src/iofactory.c:172
#3 0x00002aaaaaac7a9e in lcb_create (instance=0x2aaaace8b220, options=<optimized out>) at src/instance.c:311
中能够提现出来。
作为一个异步的网络程序,需要下面三个关键部件:
1 读写事件循环,更新接口
2 读写缓冲
3 读写事件回掉回掉
对应libcouchbase,为:
1 lcb_io_run_event_loop,这是个事件循环接口,因为选择的libev或者libevent不同而具体实现不同。lcb_io_update_event,这是事件更新接口,用于开始或者结束事件监测。
2 ringbuffer,作为读写的缓冲层,在可读事件发生后,会从socket上读数据到buffer中,当可写事件发生后,会从socket上写数据到buffer中
3 lcb_server_event_handler,在读写事件发生后,调用具体的读写函数:do_send_data和do_read_data
真正进行写操作的栈如下:
#0 0x0000003267c0ed20 in sendmsg () from /lib64/libpthread.so.0
#1 0x00002aee4385128c in lcb_io_sendv (iops=0x2aee435dc540, sock=<optimized out>, iov=<optimized out>, niov=<optimized out>) at plugins/io/libev/plugin-libev.c:113
#2 0x00002aee411f0f6a in do_send_data (c=<optimized out>) at src/event.c:318
#3 lcb_server_event_handler (sock=<opt