Telegram Chain Buffer

当我们从网络中一段段的读取数据来组成完整的数据包,如果简单的使用类似 std::string 一直往上叠加数据时,将导致频繁的重复 alloc -> copy -> free 过程,Telegram 设计了一个链式的缓冲区来处理完整数据包的片段。

ChainBuffer

BufferRaw

BufferRaw 是操作内存的原始对象,它会通过 unique_ptr 被持有,但不是只有一个对象持有,它能有一个可写的对象,可以有多个可读的对象来引用它。

data_size_ 与我们平常使用标准库容器 capacity 的语意是一样的,指示当前对象申请的存储空间大小,而 begin_end_ 指示当前写入数据的范围。

ChainBufferWriter

当我们要写入数据时,可以使用 ChainBufferWriter 来操纵它,一般的操作是准备一块内存 prepare_append,然后将数据复制到这块内存上,然后再确认写入的数据量 confirm_append

ChainBufferReader

当我们要从其它线程中读取 ChainBufferWriter 写入的数据时,可以通过 ChainBufferWriter::extract_reader 来获取 ChainBufferReader 对象。

一般情况下,我们先通过 sync_with_writer 来与 ChainBufferWriter 同步,然后使用 prepare_read 来获取数据,再使用 confirm_read 来移除读过的数据。

BufferBuilder

ChainBufferWriter 是一个前向的列表,以字符流的方式写入数据,而 BufferBuilder 提供了一种方式可在列表前插入数据的方式。