2014-04-12

Libevent HTTP 内存泄露

Views: 48941 | 3 Comments

支持百万并发连接的 comet 推送服务器 icomet 刚刚修复了一个内存泄露的 bug, 这个 bug 是因为不正确地使用 libevent 导致的, 无法用 valgrind 等工具检查出来.

这个 bug 的原因是这样的, 当客户端请求到来时, 服务器端调用了

evhttp_send_reply_start();

表示开始向客户端推送数据(使用 HTTP chunked), 最后当 long-polling 结束时, 应该调用

evhttp_send_reply_end();

来关闭连接, 释放 libevent 的内存. 不过, 如果客户端提前终止了请求, 会导致什么呢? 会导致连接关闭的回调函数 evhttp_connection_set_closecb() 被调用, 但是, 在这个回调函数里, 我没有调用 evhttp_send_reply_end(), 所以导致了内存泄露.

在使用 libevent 的过程中, 发现 libevent 的坑确实不少, 而且它的文档根本没有对类似的地方做特别说明, 没有说明哪些函数必须配对使用, 如何释放内存等.

Related posts:

  1. Libevent 2 HTTP 客户端示例
  2. 让libevent HTTP服务器立即知道客户端的断开
  3. iComet 0.2.2.1 稳定版发布和Android聊天App示例
  4. HTTP 长连接技术 Comet
  5. 构建C1000K的服务器(2) – 实现百万连接的comet服务器
Posted by ideawu at 2014-04-12 12:11:44 Tags: ,

3 Responses to "Libevent HTTP 内存泄露"

Leave a Comment