envoy实现_Envoy 源码分析--buffer

Envoy 源码分析--buffer

申明:本文的 Envoy 源码分析基于 Envoy1.10.0。

Envoy 的 buffer 在 1.10.0 前是基于 libevent 的 evbuffer 进行封装。在 1.10.0 开始为了提高性能,要使用 libev 或 libuv 来替代 libevent 重写了个 buffer 来消除 evbuffer 的依赖。想要具体了解可看 issue#4952 和 issue#5441。下面我们先来看下 buffer 相关的类图:

4bc18f2068493362ffb9c880194b324f.png

上面四个 slice 相关的类是重写后的 buffer。slice 封装了 buffer 相关操作,OwnedSlice 是创建 slice 的类,SliceDeque 管理 OwnedSlice 操作队列,UnownedSlice 则是兼容 BufferFragment 的类。

LibEventInstance 继承自 Instance 对 Instance 的接口进行扩充新增了两个接口。OwnedImpl 对 LibEventInstance 接口的实现。WatermarkBuffer 则在 OwnedImpl 的基础上增加水位的高低告警回调。WatermarkBufferFactory 继承 WatermarkFactory 只是生成 WatermarkBuffer 的适配器。

BufferFragment

针对外部数据和大小创建一个适配器,这个类不拷贝内存,只是一个指针,外部需要自己确定数据是有效的。调用 done() 会释放数据。

代码详情如下:

class BufferFragmentImpl : NonCopyable, public BufferFragment {

public:

BufferFragmentImpl(

const void* data, size_t size,

const std::function& releasor)

: data_(data), size_(size), releasor_(releasor) {}

// Buffer::BufferFragment

const void* data() const override { return data_; }

size_t size() const override { return size_; }

void done() override {

if (releasor_) {

releasor_(data_, size_, this);

}

}

private:

const void* const data_;

const size_t size_;

const std::function releasor_;

};

RawSlice

只是一个内存切片的数据结构体。

struct RawSlice {

void* mem_ = nullptr;

size_t len_ = 0;

bool operator==(const RawSlice& rhs) const { return mem_ == rhs.mem_ && len_ == rhs.len_; }

};

Slice

Slice 是一个连续的内存块的管理。其块的管理方式如下:

* |||

* +-----------------+------------------+-----------------------+

* | Drained | Data | Reservable |

* | Unused space | Usable content | New content can be |

* | that formerly | | added here with |

* | was in the Data | | reserve()/commit() |

* | section | | |

* +-----------------+------------------+-----------------------+

* ^

* |

* data()

前面是个无用内存块,中间这块就是数据自身,后面是还可用的内存块长度。增加数据支持 prepend 和 append 即可追加数据也可以前置增加。

Slice 的数据存储方式如下:

/** 切片指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值