Releases: acl-dev/acl
acl.3.2.1 released!
fixed import bugs existing for many years of read line functions.
acl.3.2.0 released!
acl 3.2.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个函数库:lib_acl(纯C开发的基础库,主要包含网络通信及服务器编程框架以及其它丰富的功能)、lib_protocol(包含 HTTP/PING/SMTP 通信协议的C语言实现)、lib_fiber(网络协程库)、lib_acl_cpp(基于 lib_acl 及 lib_protocol 两个C库,提供了更为强大的编程接口及丰富的功能类)。
本次 acl 升级的最主要内容为:增加了类似于 golang 中的网络协程库,该库使 C/C++ 程序员可以以顺序编程的思维方式快速地编写出高并发、高性能的网络服务器程序; 此外,lib_acl/lib_acl_cpp 也进行了功能改进和问题修复。
acl 包括以下丰富的常用函数库:
1、服务器框架:包括进程池模式、线程池模式、非阻塞模式、UDP通信模式、触发器模式以及协程模式
2、网络通信库:阻塞/非阻塞网络 IO 库(其中 lib_acl_cpp 库通过嵌入 polarssl 而具备了 SSL 通信能力)
3、HTTP 网络库:HTTP 客户端/服务端库,HTTP 服务端支持 HttpServlet 接口访问方式;支持 HTTP cookies/session;HTTP 客户端支持连接池及连接池集群
4、redis 客户端库:实现了 redis 客户端命令中 12 个大类中的总共 150 多个命令,支持连接池及集群连接池方式
5、常见网络应用库: SMTP 客户端库/PING 库/DNS 解析库/memcache 客户端库/handler socket 客户端库/beanstalk 客户端库/disque 客户端库
6、邮件解析库:mime解析库/RFC2047/RFC2048/mime base64/mime qp/mime uucode 等
7、事件引擎:支持 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32 窗口消息(for win32)事件引擎
8、通用连接池库:高效的连接池基础类库,支持丰富的功能
9、数据库客户端库:对原生的数据库客户端库进行了二次封装,使编程更为简易,功能更为丰富,支持连接池及连接池集群管理功能
10、xml/json 流式解析库:区别于网上其它已有的 xml/json 解析库,acl 中的 xml/json 解析库采用有限状态机方式解析数据,处理方式更为灵活
11、网络协程库:该库将阻塞 IO 模式在底层通过上下文切换和事件触发方式转变为非阻塞模式,从而方便程序员快速编写高并发、高性能的网络服务
示例:
1、lib_acl/samples: 该目录下有大量的基于 lib_acl C 库的示例
2、lib_protocol/samples: 该目录下有大量的基于 lib_protocol C 库的示例
3、lib_acl_cpp/samples: 该目录下有大量的基于 lib_acl_cpp C++ 库的示例
4、lib_fiber/samples:该目录下有大量的基于协程的网络客户端/服务端示例
应用:
1、app/redis_tools: 该目录下为 redis 集群管理、监控及智能创建工具
2、app/wizard:用来自动生成 acl 服务器框架的向导程序
3、app/master_dispatch:用于管理和分发客户端连接的服务程序
4、app/gid:用来产生全局唯一整型 ID 的服务程序及客户端库
5、app/wizard_demo:为一些服务器测试程序
一、基础 C 库:lib_acl
.新特性:acl_threads_server.c 在 alone 模式下运行时,释放全局分配的动态对象,以便于用户使用 valgrind 查找内存问题
.新特性:acl_read_wait.c 中的读超时重新使用 epoll 来判断,为防止 epoll 句柄被异外关闭,内部增加了重新打开 epoll 句柄的功能
.新特性:acl_xml_parse.c/acl_xml2_parse.c 当输入为 NULL 时返回 ""
.新特性:在 acl_vstream.c 的 acl_vstream_fdopen 时针对带有读写超时的 socket 的设置为非阻塞模式,这样代码逻辑更为清晰
.新特性:acl_sys_socket.c 中的 SOCKET IO 过程允许被 HOOK,这样 acl_vstream.c 中的 acl_vstream_fdopen 在创建 SOCKET 流对象时允许使用被 HOOK 的函数
.新特性:增加原子操作 acl_atomic.c, 无锁队列 acl_yqueue.c, acl_ypipe.c
.新特性:增加 acl_mbox.c 用于线程之间的单向通信,内部使用了无锁队列方式效率更高
.新特性:json 解析器支持 double 数据元素
.问题修复:acl_sys_socket.c 中函数 acl_socket_write 修改了写超时的问题
.问题修复:acl_sys_file.c 中的函数 acl_file_open 当以 O_APPEND 方式打开文件时, 文件指针没有指向文件尾部
.问题修复:events_kernel.c 中的 stream_on_close 当 fdp == NULL 时直接返回
.问题修复:events_epoll_thr.c 中的 event_enable_read 函数里,解锁调用过程 THREAD_UNLOCK 需要 epoll_ctl 调用之后,以免主线程和子线程同时操作同一对象
.问题修复:acl_vstream.c 中的 acl_vstream_writevn 函数数据指针偏移有问题,导致写入的数据量计数错误
.问题修复:events.c 中的函数 event_thr_prepare/event_prepare 中,如果当 ACL_VSTREAM_BFRD_CNT 及 read_ready 两个条件同时满足时,ACL_VSTREAM_BFRD_CNT 满足条件如果放置在 read_ready 前面,会造成 read_ready 被提醒清除,因此,需要把 read_ready 条件放置在前面
.问题修复:acl_json_parse.c 中,在解析 JSON 过程中需要设置叶节点标志
.性能:events_epoll_thr.c 的 event_enable_read 函数中,通过设置/清除标志位 EVENT_FDTABLE_FLAG_FIRE 来达到减少 epoll_ctl 的调用次数,从而提高事件处理性能
二、lib_protocol 库
.特性:http_hdr_res.c 中的函数 http_hdr_res_parse 取消了对 http_status 的检查,以便于应用使用自定义状态码
三、lib_acl_cpp 库
.新特性:xml/xml1/xml2 在进行对象构造时允许初始化 dbuf 的参数
.新特性:http_header 类中的方法 set_url 增加参数 encoding,该参数决定是否对出现于 url 中的参数进行 url 编码
.新特性:dbuf_guard 类将容纳 dbuf_obj 的数组封装在链表中,以免该数组过大
.新特性:xml/xml1/xml2 类中的方法 update 允许返回剩余的 xml 数据
.新特性:json 增加对 double 类型的支持
.新特性:mime 类增加两个方法 get_plain_body/get_html_body 便于提取不同类型的
.新特性:Makefile 添加条件编译选项:允许在编译时以 make polarssl=on 方式将 POLARSSL 编译进去
.问题修复:thread 类中,在创建线程后对 thread_id_ 赋值时,可能会因为线程创建足够快且用户提前释放了线程对象而造成内存非法访问
.问题修复:http 模块设置的读超时与 stream 的读超时冲突
.问题修复:http_request 类的get_body方法中,对象 ps 为局部变量,出作用域后依然被使用而导致崩溃
.问题修复:string 类应该只检查空指针,而不应检查空串
.问题修复:mime::body_node 取正文有误
.问题修复:json_node::set_text 判断节点是否为叶节点的方法有误
四、参考链接:
oschina-git:https://git.oschina.net/zsxxsz/acl
github: https://github.com/zhengshuxin/acl.git
sourceforge:http://sourceforge.net/projects/acl/
blog: http://zsxxsz.iteye.com/
acl3.2.0.rc4 release
fixed some compiling warning on MACOS.
acl3.2.0.rc3 release
In this version, memory will be decreased when creating fiber object by using virtual memory. (using malloc than calloc when creating buffer for fiber stack.
- zsx
acl3.2.0.rc2 release
This a performance improvment of event_epool_thr.c in acl by decreasing calling epoll_ctl.
acl3.2.0.rc1 release
In this version, except there're some bugs been fixed, the main change is that the network fiber (that's also named coroutine) library in lib_fiber was added into the acl project. The network fiber is a greate changing for the network application. The c/c++ programmers can easily write a high cocurrent and excellent performance services by using lib_fiber in acl.
- zsx
acl3.1.5 released!
acl 3.1.5 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/FreeBsd/MacOS 平台;整个 acl 项目主要包含三个函数库:lib_acl(纯C开发的基础库,主要包含网络通信及服务器编程框架以及其它丰富的功能)、lib_protocol(包含 HTTP/PING/SMTP 通信协议的C语言实现)、lib_acl_cpp(基于 lib_acl 及 lib_protocol 两个C库,提供了更为强大的编程接口及丰富的功能类)。
本次 acl 升级的主要内容有:线程池服务器模板在独立运行模式及框架运行模式保持一致,redis_builder 集群管理工具功能更为强大,邮件解析库性能提升;修改一些 BUG 问题,同时增加了一些功能点。
acl 包括以下丰富的常用函数库:
1、服务器框架:包括进程池模式、线程池模式、非阻塞模式、UDP通信模式及触发器模式
2、网络通信库:阻塞/非阻塞网络 IO 库(其中 lib_acl_cpp 库通过嵌入 polarssl 而具备了 SSL 通信能力)
3、HTTP 网络库:HTTP 客户端/服务端库,HTTP 服务端支持 HttpServlet 接口访问方式;支持 HTTP cookies/session;HTTP 客户端支持连接池及连接池集群
4、redis 客户端库:实现了 redis 客户端命令中 12 个大类中的总共 150 多个命令,支持连接池及集群连接池方式
5、常见网络应用库: SMTP 客户端库/PING 库/DNS 解析库/memcache 客户端库/handler socket 客户端库/beanstalk 客户端库/disque 客户端库
6、邮件解析库:mime解析库/RFC2047/RFC2048/mime base64/mime qp/mime uucode 等
7、事件引擎:支持 select、poll(for unix)、epoll(for linux)、kqueue(for bsd)、devpoll(for solaris)、iocp(for win32)、win32 窗口消息(for win32)事件引擎
8、通用连接池库:高效的连接池基础类库,支持丰富的功能
9、数据库客户端库:对原生的数据库客户端库进行了二次封装,使编程更为简易,功能更为丰富,支持连接池及连接池集群管理功能
10、xml/json 流式解析库:区别于网上其它已有的 xml/json 解析库,acl 中的 xml/json 解析库采用有限状态机方式解析数据,处理方式更为灵活
示例:
1、lib_acl/samples: 该目录下有大量的基于 lib_acl C 库的示例
2、lib_protocol/samples: 该目录下有大量的基于 lib_protocol C 库的示例
3、lib_acl_cpp/samples: 该目录下有大量的基于 lib_acl_cpp C++ 库的示例
应用:
1、app/redis_tools: 该目录下为 redis 集群管理、监控及智能创建工具
2、app/wizard:用来自动生成 acl 服务器框架的向导程序
3、app/master_dispatch:用于管理和分发客户端连接的服务程序
4、app/gid:用来产生全局唯一整型 ID 的服务程序及客户端库
5、app/wizard_demo:为一些服务器测试程
一、基础 C 库:lib_acl
.新特性:增加函数 acl_check_socket 用来检查所给套接字是否为监听套接字
.新特性:events_select.c/events_poll.c/events_kernel.c,内部自动判断是否为监听描述符,从而降低了事件模块与流模块之间以及其它模块之间的耦合度
.新特性:acl_vstream.c,函数 acl_vstream_fdopen 会自动判断所给描述符是否为监听描述符,避免了用户输入的参数 fdtype 的非法性
.新特性:acl_default_malloc.c,函数 acl_default_realloc 当输入的地址为 NULL,则自动切换至 acl_default_malloc 过程
.新特性:acl_vstring.c 真正支持限定最大使用空间功能
.新特性:acl_vstring.c 增加了 acl_vstring_mmap_alloc,用于支持以内存文件映射方式管理内存
.新特性:acl_vstring.c 以内存映射文件方式管理内存同时支持 UNIX/WINDOWS
.新特性:acl_xml/acl_xml2 增加函数接口,允许以文件流为创建 xml 节点的文本
.新特性:acl_inet_listen.c 在创建监听描述符时支持使用 SO_REUSEPORT, TCP_FASTOPEN 以提升 TCP 的处理性能(此两个特性均需要内核支持,同时 TCP_FASTOPEN 还需要在编译 lib_acl.a 时定义预编译条件:USE_FASTOPEN)
.新特性:acl_threads_server.c 服务器模板增加了几个接口
.新特性:acl_threads_server.c 支持 WINDOWS 平台,同时支持 daemon 模式及独立运行模式
.问题修复:acl_xml_parse.c/acl_xml2_parse.c/acl_xml_util.c/acl_xml2_util.c, 修复了当数据节点为 META, COMMENT, CDATA 时解析与创建 xml 对象时的 BUG
.问题修复:acl_multi_server.c/acl_single_server.c/acl_trigger_server.c,在将监控监听套接口的读事件时,应该调用 acl_event_enable_listen,而不是调用
.问题修复:acl_vstream.c 加强了 fp->read_cnt < 0 时的安全处理
.问题修复:acl_threads_server.c 在 daemon 模式下当只监听一个端口时,控制服务器 acl_master 不会传递 -s 参数,应该 socket_count 值初始化为 1
.问题修复:acl_vstream_net.c 中的函数 udp_read 应该设置 read_ready = 0, 否则当该 UDP 对象置入 event 事件循环时,会造成无用的事件触发
.问题修复:acl_threads_server.c 中的函数 dispatch_receive 是通过调用 acl_read_fd 直接从套接字中读取数据的,此时应该将 conn->read_ready 标志位清0, 否则会再次引发读操作,同时将该套接字设为非阻塞模式,以免阻塞主线程
.问题修复:acl_vstring.c 中没有针对 fd 进行初始化,这样当释放 ACL_VSTRING 对象时,会误判该对象创建在 mmap 上,从而会导致内存泄露
.问题修复:acl_vstream.c 中针对 stdin, stdout, stderr 需要做特殊处理
.性能:优化 acl_vstream.c 中 acl_vstream_read 函数的读性能, 同时兼顾大数据读取与小数据读取的性能问题
二、lib_protocol 库
.问题修复: http_hdr_req.c 中分析 url_part 有误
三、lib_acl_cpp 库
.新特性:mime.cpp, mime_head.cpp 支持更多的 Content-Type 类型
.新特性:db_handle/db_mysql 类在进行查询前优先释放上次的查询结果,以免使用者忘记释放而造成内存泄露
.新特性:增加类 db_guard 用于自动释放从数据库连接池中获取的连接对象
.新特性:fstream 类中增加了方法 remove 用于删除文件
.新特性:redis 库增加了出错日志输出,便于运行时进行信息调试
.新特性:HttpServlet 类增加了请求/响应成员函数(req_/res_),以便于将读取 HTTP 请求数据体分离
.新特性:xml/xml1/xml2 支持使用 dbuf_guard 会话内存池来创建临时对象, 从而提升了内存使用效率
.新特性:string 类支持内存映射文件方式管理内存,从而可以支持更多的内存空间
.新特性:session/redis_session/HttpSession 会话类增加功能接口
.新特性:xml/xml1/xml2 增加方法,允许将输入流中的内容作为 xml 节点的文本内容, 这对于当文本内容非常大时比较有用
.新特性:db/query 类增加了创建 sql 的接口 create
.新特性:HttpServletRequest::getParameter 在查找参数时允许不区分大小写
.新特性:queue_file::create 在产生唯一 ID 时,可以明显区分出进程号以便于调试检查当前队列文件所属的进程
.新特性:redis_command 类支持直接组装 redis 协议方式
.新特性:redis_server 类增加接口 info 方便提取服务器配置信息
.新特性:redis_command::run 中当发现 used_ > 0 时会强制调用 clear 来释放上次操作时临时创建的内存,以免用户反复使用该命令时忘记调用 clear
.问题修复:db_mysql.cpp 中调用 _mysql_open 时如果出错记日志时应判断每个参数是否为 NULL
.问题修复:connect_manager 类少两个设置函数 set_check_inter/set_idle_ttl
.问题修复:charset_conv 类中的方法 update,当 m_addInvalid 为 false,应该过滤掉无效的字符
.问题修复:zlib_stream 类判断剩余空间的方法应与 string 类匹配
.问题修复:json_node::is_array 判断方式有问题
.问题修复:redis_client_cluster 类中的 set_password 方法在设置集群中节点密码时,该方法的调用与添加集群节点的方法(set)与顺序相关,容易造成误操作导致密码设计无效
.问题修复:json 类中的 reset 方法在重置 json 对象时,因为 json 的 C 库内部会重建 root 节点,所以需要以 json 类中重新指定 root 节点
.问题修复:session::set_ttl 针对 redis 缓存时有问题,去掉了针对 sid_saved 的判断
.性能:mime_state_parse.cpp 中的 mime_bound_body 函数优化了处理大邮件的性能
.编译:使用预编译,优化 g++ 编译速度
四、参考链接:
oschina-git:https://git.oschina.net/zsxxsz/acl
github: https://github.com/zhengshuxin/acl.git
sourceforge:http://sourceforge.net/projects/acl/
website: http://zsxxsz.iteye.com/
acl3.1.5 rc2 release
acl3.1.5 rc2 release
add acl_argv_quote_split
acl3.1.5 rc1 release
acl3.1.5 rc1 release
acl3.1.4.4 released!
acl 3.1.4.4 release, fixed some urgent bugs