64) 2017.9.27 64.1) workaround: 为方便使用 valgrind 检查内存问题,将内部一些静态或全局动态 对象手动释放,以免干扰应用查看真正的内存问题 63) 2017.9.23 63.1) feature: hook_io.c 支持 hook mkdir 62) 2017.9.22 62.1) feature: hook_io.c 支持 hook stat/fstat/lstat 61) 2017.9.20 61.1) feature: hook_net.c 支持 epoll_create1 API 60) 2017.9.18 60.1) feature: 增加 fiber_trigger 类用于按时间触发操作 59) 2017.9.10 59.1) feature: 协程服务器模板在执行完 reload 后可以将执行状态反馈给 master 58) 2017.8.25 58.1) feature: 添加 C++ 版本的协程定时器类 fiber_timer 58.2) feature: acl_fiber_create_timer 中增加协程栈大小参数 57) 2017.8.21 57.1) feature: fiber_server.c 当在独立运行时也可以通过配置文件指定 master_reuseport 选项 56) 2017.7.27 56.1) compile: master_fiber.hpp 中去掉了对 master_base.hpp 的包含,要求应用 需要首先包含该头文件 56.2) compile: lib_fiber.h 中去年了对 lib_acl.h 的包含 55) 2017.7.22 55.1) feature: master_fiber 增加 get_conf_path, acl_fiber_server.cpp 中增加 acl_fiber_server_conf,此二方法用于获得当前的服务配置文件路径 54) 2017.7.7 54.1) feature: master/fiber_server.c 中将 fiber_sleep 协程的栈大小允许受配置项 控制;同时将内部的 STACK_SIZE 缺省值由 64 K 改为 128 K,该值也是用户级所创建 协程的栈缺省大小 53) 2017.7.4 53.1) feature: fiber_server.c/master_fiber.cpp 支持 SIGHUP 信号回调过程 53.2) 重构 fiber_server.c/master_fiber.cpp 代码 52) 2017.7.2 52.1) feature: fiber_server.c 支持多线程运行模式 51) 2017.6.6 51.1) feature: fiber_server.c 在启动协程调度前的过程放在主线程中进行,从而使 该段代码的运行栈大小不受协程栈大小的限制 50) 2017.5.16 50.1) feature: fiber_server.c 协程服务器模板增加了平滑退出机制 49) 2017.5.1 49.1) samples/pgsql: 添加测试 postgresql 的客户端例子 48) 2017.4.24 48.1) bugfix: fiber.s 中 acl_fiber_set_specific 在调用 realloc 重新分配内存槽 时应该将空闲的槽置 NULL ------------------------------------------------------------------------------ 47) 2017.4.13 47.1) feature: hook_net.c 中新增对 getaddrinfo 的支持 46) 2017.4.10 46.1) feature: 协程信号量当被跨线程使用时,禁止出现同一信号量被不同线程使用 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