IT笔记 · 2013年12月14日

libuv使用笔记

使用libevent的代码有未查明的内存泄漏,转而使用libuv。libuv是提供给node.js使用的事件库,维护效率更快,社区氛围更为活跃。刚决定采用libuv,github上昨天(12月13日)又出了个修正bug的stable新版本,让人安心。

安装

  • ubuntu使用aptitude没找到libuv的包,只好直接在github上git clone ,转到稳定release分支。或者直接用wget下载最新release压缩包。
  • 按github上libuv的说明开始编译,默认编译出来是根据本机cpu类型的64位static lib,debug版。但我需要的是32位release。看了下gyp_uv.py的内容,在执行此文件时加上-Dtarget_arch=ia32。执行后查看out/Makefile, 在make时添上BUILDTYPE=Release,编译32位release成功。 即

  • 了解下gyp应该可以更方便修改编译选项

使用

错误处理

  • 教程与实际应用的区别就是,教程从来不做错误处理。实际使用libuv,还是需要自己编码上手,从debug与实际运行结果来学习使用,进一步可以看源码。
  • libuv的错误信息使用自建的uv_err_t类型,可用uv_last_error()获取,接着使用uv_strerror()查看错误码对应的字符串信息
  • libuv的大部分函数返回值为0时表示成功, -1则表示失败;回调函数的参数status也一样。

一些注意点

  • libuv的handle或req都带有一个void* data变量,用来存放使用用户数据。尽量避免类似云风所诟病的那种按结构偏移来存放使用用户数据
  • libuv是非线程安全的,要跨线程对loop所在线程进行操作,需要使用uv_async_send
  • libuv的timer没有类似libevent里active_event即时事件生效的函数, 不过如果timer不需要repeat, 可以在uv_time_start()的repeat参数设置一个小的非零值,然后使用uv_timer_again(),效果相当于即时生效了。
  • uv_tcp_t连接失败的话,重新连接需要再次调用uv_tcp_init()一次,原因不明
  • uv_read_cb回调错误是EOF的话,表示uv_tcp_t已经断开连接,此时设定重连。uv_tcp_t断开连接后不会再调用uv_connect_cb似乎

未完待续