45) 2017.3.29
45.1) bugfix: 当一个协程处于 poll wait 状态时被另一个协程 kill 掉时，会造成内存
非法访问，修复方式是在 event.c 中对 poll list 的遍历访问采用 pop 方式，同时在
hook_net.c 中的 poll 函数中当被 kill 时自动清理自身，与本 BUG 相关的文件有
fiber.c, hook_net.c, event.c，其中 hook_net.c 及 event.c 中的修复是最关键的

44) 2017.3.28
44.1) feature: fiber.c 中 fiber_alloc 函数当复用缓存的协程内存对象时，应调用
free->malloc，而不是调用 realloc，这样一方面可以避免使用 tcmalloc 时的 valgrind
的内存警告，另一方面，可以有效地使用虚存

43) 2017.3.23
43.1) feature: fiber.c 中 acl_fiber_signal/acl_fiber_kill 中，需要设置 errno
为 ECANCELED

42) 2017.3.9
42.1) compile: ?当打开 valgrind 编译选项时，有一处编译警告
42.2) workaround: master_fiber 类中的方法 run_alone 去掉最后一个参数，其原来用
来控制处理次数，改由从配置文件中读取

41) 2017.2.9
41.1) bugfix: fiber.c 中，fiber_init 函数应该必须保证 __sys_errno 为 NULL 时
被调用，否则会引起一些静态初始化需要 __sys_errno 的使用

40) 2017.1.23
40.1) workaround: 协程号统一改成无符号 32 位整数

39) 2017.1.12
39.1) bugfix: 协程在双通模式下，如果写时堵塞会导致读也堵塞，是因为延迟关闭
及事件设置不合理

38) 2017.1.5
38.1) bugfix: fiber.c 中函数 acl_fiber_killed 中的判断有误

37) 2016.12.31
37.1) feature: 增加 acl_fiber_signal 函数，允许协程给其它协程发送唤醒信号

36) 2016.12.27
36.1) bugfix: fiber.cpp 中 kill 方法需将 f_ 成员置 NULL，防止嵌套访问非法地址
36.2) feature: fiber.cpp 允许将当前运行的协程与 fiber 类对象绑定(只需在构造
函数中将构造参数设为 true)，从而可以方便使用类 fiber 中的方法

35) 2016.12.19
35.1) feature: fiber.c 中有关协程局部变量的接口调整，更符合实际应用场景
35.2) bugfix: fiber.c 中当协程退出时，协程局部变量的对象未释放造成内存泄露
35.3) sample: samples/fiber_local，该示例用于测试协程局部变量

34) 2016.12.16
34.1) bugfix: hook_net.c, hook_io.c, event_epoll.c 其中因为 hook 了很多系统的
API，当个别应用在 main 函数执行前需要调用这些 API 时可能会因为 hook 操作还未
进行而造成函数指针为 NULL，从而导致程序崩溃

33) 2016.12.8
33.1) bugfix: hook_net.c 中，当非协程模式下，hook epoll 相关 API 应该加以区别

32) 2016.12.3
32.1) feature: acl_fiber_kill 可以支持因调用 acl_fiber_sleep, acl_fiber_sem,
acl_fiber_mutex_lock 而阻塞的协程

31) 2016.11.28
31.1) feature: fiber.cpp 中，fiber 类增加了 kill 和 killed 方法用来”杀死“协程
和判断指定协程是否已经退出

30) 2016.11.27
30.1) bugfix: fiber.c 中函数 acl_fiber_create 中存在运行时内存增长问题，即
__thread_fiber->fibers 对象在 realloc 过程中内存不断增长，因为 __thread_fier->size
计算方法有问题

29) 2016.11.24
29.1) feature: 增加 acl_fiber_kill 接口用来通知指定协程退出

28) 2016.10.31
28.1) feature: fiber.c 中实现了 __i386__ 下 SETJMP，LONGJMP 的汇编方式，从
libdill 借鉴而来

27) 2016.10.19
27.1) bugfix: fiber_io.c 中的 __thread_fiber->loop_fn 没有赋初值

26) 2016.9.25
26.1) feature: 增加 acl_fiber_post_event 函数，在每次事件循环过程中可以调用由
该函数设置的回调函数

25) 2016.9.22
25.1) 函数改名： acl_fiber_stop --> acl_fiber_schedule_stop,
acl::fiber::stop --> acl::fiber::schedule_stop

24) 2016.9.21
24.1) bugfix: hook_io.c 中的 writev() 函数应该调用 fiber_writev()

23) 2016.9.1
23.1) feature: 支持 C++11 功能，使用 lambda 表达式创建协程更加方便简洁

------------------------------------------------------------------------------

22) 2016.8.25
22.1) feature: hook_io.c 中提供了单独的 fiber_xxx IO 接口

21) 2016.8.17
21.1) performance: fiber.c 中函数 fiber_alloc 在创建协程栈时使用 malloc 代替了
原来的 calloc，避免内存提交，仅使用虚存，从而有效控制了协程的实际占用内存大小
21.2) bugfix: hook_io.c 中的 read 等读函数只有当读返回 < 0 时才需要设置 errno
21.3) bugfix: fiber_io.c, acl_fiber_delay 函数需要合理设置 ev->timeout 值
21.4) performance: hook_net.c 中 hook 的系统 accept API 优化了接收连接的顺序，
从而使 accept 速度更快

20) 2016.8.16
20.1) portable: fiber.c 中增强了 SETJMP 汇编代码移植性

19) 2016.8.10
19.1) performance&feature: 允许使用 setjmp/longjmp 进行栈的跳转，性能更好

18) 2016.8.7
18.1) feature: fiber.c 中在 acl_fiber_schedule 结束前自动将 acl_var_hook_sys_api
置 0，从而恢复系统 API 调用过程

17) 2016.8.5
17.1) feature: hook_io.c 中增加系统 API sleep 的 hook 函数

16) 2016.8.4
16.1) bugfix: hook_net.c 中的 gethostbyname_r 在解析域名时的地址所用字节序有误
--- found by 陈晓勇

15) 2016.7.28
15.1) bugfix: hook_net.c 中的 poll/epoll_wait 对于超时的计数有误，会导致超时
时间提前

14) 2016.7.26
14.1) feature: hook_net.c 中的 connect 函数增加了出错处理

13) 2016.7.22
13.1) bugfix: poll/epoll_wait API 的超时值设置的不对
13.1) performance: fiber.c 中 acl_fiber_yield 函数首先判断是否有待处理协程，
然后再决定是否需要切换协程上下文，从而减少上下文的切换次数

12) 2016.7.14
12.1) feature: hook_net.c 增加了 epoll 的 hook 支持

11) 2016.7.9
11.1) feature: fiber_sem.c 增加协程信号量

10) 2016.6.22
10.1) feature: fiber_server.c 服务模块支持空闲超时退出及处理连接数达上限退出

9) 2016.6.21
9.1) feature: 将非 socket 类型的 fd 采用同步模式
9.2) feature: master_fiber.c 支持 dispatch 方式获得客户端连接

8) 2016.6.19
8.1) feature: 增加了 FIBER 锁功能
8.2) feature: 增加 fiber_server.c 模块，可由 acl_master 服务器框架控制

7) 2016.6.18
7.1) feature: 增加了 FIBER_CHANNEL 用于协程间的交互通信

6) 2016.6.15
6.1) feature: 增加定时器功能 -- fiber_create_timer()

5) 2016.6.14
5.1) feature: hook 了 errno 所依赖的函数 __errno_location，从而使 errno 针对
每个协程是安全的

4) 2016.6.11
4.1) valgrind: 增加编译开关以防止 valgrind 工具对 swapcontext 跳转的误报

3) 2016.6.9
3.1) performance: fiber_schedule.c，由星形切换改为环形切换，从而提升了上下文件
切换的效率 --- by niukey@qq.com

2) 2016.6.5
2.1) feature: 将 fiber_schedule.c, fiber_io.c 中的全局静态变量调整为线程局部
变量，为实现多线程化协程做准备

1) 2016.6.4
1.1) 当前的协程支持 hook: read/redv/redv/recvfrom/recvmsg,
write/writev/send/sendto/sendmsg, poll/select/sleep/gethostbyname/gethostbyname_r
