diff --git a/changes.txt b/changes.txt index cb607554c..3e30b219b 100644 --- a/changes.txt +++ b/changes.txt @@ -1,5 +1,11 @@ 修改历史列表: ------------------------------------------------------------------------ +106) 2017.3.30 +106.1) compile: 重新整理头文件中宏定义,以区别不同的编译方式 + +105) 2017.3.26 +105.1) cmake 在 vs 开发环境中编译通过 + 104) 2017.3.25 104.1) 库名重命名: lib_acl.a --> libacl.a diff --git a/lib_acl/CMakeLists.txt b/lib_acl/CMakeLists.txt index 19ab43c98..cfef32f41 100644 --- a/lib_acl/CMakeLists.txt +++ b/lib_acl/CMakeLists.txt @@ -9,57 +9,30 @@ if (${CMAKE_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) message(FATAL_ERROR "Please into another dir to build!") endif() -add_definitions( - "-W" - "-fPIC" - "-Wall" - "-Werror" - "-Wshadow" - "-Wpointer-arith" - "-Waggregate-return" - "-Wmissing-prototypes" - "-D_REENTRANT" - "-D_USE_FAST_MACRO" - "-DACL_WRITEABLE_CHECK" - "-Wno-long-long" - "-Wuninitialized" - "-D_POSIX_PTHREAD_SEMANTICS" - "-DACL_PREPARE_COMPILE" - "-Wno-invalid-source-encoding" - "-Wstrict-prototypes" -) - -if (CMAKE_BUILD_TYPE STREQUAL "") - set(CMAKE_BUILD_TYPE "DEBUG") -else() - string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) -endif() - -if (CMAKE_BUILD_TYPE STREQUAL "RELEASE") - add_definitions("-O3") -else() - add_definitions("-g") -endif() - #string(TOUPPER ${CMAKE_SYSTEM_NAME} CMAKE_SYSTEM_NAME) if (CMAKE_SYSTEM_NAME MATCHES "Android") add_definitions("-DANDROID") + set(UNIX_OS true) elseif (CMAKE_SYSTEM_NAME MATCHES "Linux") + set(UNIX_OS true) elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(UNIX_OS true) +elseif (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(WIN_OS true) else() message(FATAL_ERROR "unknown CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}") endif() ############################################################################## -set(src ${CMAKE_CURRENT_SOURCE_DIR}/src) - include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include ) +set(src ${CMAKE_CURRENT_SOURCE_DIR}/src) set(sources + ${src} ${src}/stdlib ${src}/stdlib/debug ${src}/stdlib/memory @@ -100,6 +73,47 @@ foreach(iter ${sources}) aux_source_directory(${iter} lib_src) endforeach() +############################################################################## + +if (CMAKE_BUILD_TYPE STREQUAL "") + set(CMAKE_BUILD_TYPE "DEBUG") +else() + string(TOUPPER CMAKE_BUILD_TYPE CMAKE_BUILD_TYPE) +endif() + +if (${UNIX_OS}) + add_definitions( + "-W" + "-fPIC" + "-Wall" + "-Werror" + "-Wshadow" + "-Wpointer-arith" + "-Waggregate-return" + "-Wmissing-prototypes" + "-D_REENTRANT" + "-D_USE_FAST_MACRO" + "-DACL_WRITEABLE_CHECK" + "-Wno-long-long" + "-Wuninitialized" + "-D_POSIX_PTHREAD_SEMANTICS" + "-DACL_PREPARE_COMPILE" + "-Wno-invalid-source-encoding" + "-Wstrict-prototypes" + ) + + if (CMAKE_BUILD_TYPE STREQUAL "RELEASE") + add_definitions("-O3") + else() + add_definitions("-g") + endif() +elseif (${WIN_OS}) + add_definitions( + "-Yc" + "-DACL_WRITEABLE_CHECK" + "-DACL_PREPARE_COMPILE") +endif() + if (CMAKE_SYSTEM_NAME MATCHES "Android") set(CMAKE_SHARED_LINKER_FLAGS "-shared") else() @@ -109,6 +123,10 @@ else() add_library(acl_static STATIC ${lib_src}) SET_TARGET_PROPERTIES(acl_static PROPERTIES OUTPUT_NAME "acl") + if (${WIN_OS}) + set(CMAKE_SHARED_LINKER_FLAGS "/DYNAMICBASE ws2_32.lib IPHlpApi.lib") + endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${lib_output_path}) endif() diff --git a/lib_acl/acl.xcodeproj/project.pbxproj b/lib_acl/acl.xcodeproj/project.pbxproj index 4a899e161..6fd1eac57 100644 --- a/lib_acl/acl.xcodeproj/project.pbxproj +++ b/lib_acl/acl.xcodeproj/project.pbxproj @@ -1934,7 +1934,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; + ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; }; name = Debug; @@ -1972,6 +1972,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; + ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/lib_acl/changes.txt b/lib_acl/changes.txt index 372875468..fdfb1e47a 100644 --- a/lib_acl/changes.txt +++ b/lib_acl/changes.txt @@ -1,5 +1,9 @@ 修改历史列表: +577) 2017.3.30 +577.1) feature: json 类对象在创建 json 字符串时默认不自动添加空格,但允许调用者 +设置参数以便于自动添加空格从而使 json 字符串更可读 + 576) 2017.3.11 576.1) bugfix: acl_scan_dir.c 中函数 acl_scan_dir_push 在 windows 下存在问题, 会造成死循环 diff --git a/lib_acl/include/json/acl_json.h b/lib_acl/include/json/acl_json.h index dcfa9a2ea..fbabb01be 100644 --- a/lib_acl/include/json/acl_json.h +++ b/lib_acl/include/json/acl_json.h @@ -86,6 +86,7 @@ struct ACL_JSON { int finish; /**< 是否分析结束 */ unsigned flag; /**< 标志位 */ #define ACL_JSON_FLAG_PART_WORD (1 << 0) /**< 是否兼容半个汉字 */ +#define ACL_JSON_FLAG_ADD_SPACE (1 << 1) /**< 创建 json 时是否添空格 */ /* public: for acl_iterator, 通过 acl_foreach 可以列出所有子节点 */ diff --git a/lib_acl/include/stdlib/acl_define_win32.h b/lib_acl/include/stdlib/acl_define_win32.h index f711d9f07..81e1b88e3 100644 --- a/lib_acl/include/stdlib/acl_define_win32.h +++ b/lib_acl/include/stdlib/acl_define_win32.h @@ -40,15 +40,21 @@ abort(); \ } while(0) -# ifdef ACL_DLL -# ifdef ACL_EXPORTS +#ifdef ACL_LIB +# ifndef ACL_API +# define ACL_API +# endif +#elif defined(ACL_DLL) || defined(_WINDLL) +# if defined(ACL_EXPORTS) || defined(acl_EXPORTS) +# ifndef ACL_API # define ACL_API __declspec(dllexport) -# else -# define ACL_API __declspec(dllimport) # endif -# else -# define ACL_API +# elif !defined(ACL_API) +# define ACL_API __declspec(dllimport) # endif +#elif !defined(ACL_API) +# define ACL_API +#endif /** * see WINSOCK2.H, 用户需要预先定义此值,因其默认值为64,此外,该值不能设得太大, diff --git a/lib_acl/include/stdlib/acl_mymalloc.h b/lib_acl/include/stdlib/acl_mymalloc.h index 69db4d452..d73efacd8 100644 --- a/lib_acl/include/stdlib/acl_mymalloc.h +++ b/lib_acl/include/stdlib/acl_mymalloc.h @@ -70,8 +70,10 @@ extern "C" { * @param _ptr_ {void*} 动态内存地址 */ #define acl_myfree(_ptr_) do { \ - acl_free_glue(__FILE__, __LINE__, (_ptr_)); \ - (_ptr_) = NULL; \ + if (_ptr_) { \ + acl_free_glue(__FILE__, __LINE__, (_ptr_)); \ + (_ptr_) = NULL; \ + } \ } while (0) /** @@ -84,4 +86,3 @@ extern "C" { #endif #endif - diff --git a/lib_acl/src/json/acl_json_util.c b/lib_acl/src/json/acl_json_util.c index 1756324d0..3850ec4fc 100644 --- a/lib_acl/src/json/acl_json_util.c +++ b/lib_acl/src/json/acl_json_util.c @@ -303,15 +303,20 @@ void acl_json_building(ACL_JSON *json, size_t length, node = (ACL_JSON_NODE*) iter.data; prev = acl_json_node_prev(node); - if (prev != NULL) - acl_vstring_strcat(buf, ", "); + if (prev != NULL) { + if ((json->flag & ACL_JSON_FLAG_ADD_SPACE)) + acl_vstring_strcat(buf, ", "); + else + acl_vstring_strcat(buf, ","); + } /* 只有当标签的对应值为 JSON 对象或数组对象时 tag_node 非空 */ if (node->tag_node != NULL) { if (LEN(node->ltag) > 0) { json_escape_append(buf, STR(node->ltag)); ACL_VSTRING_ADDCH(buf, ':'); - ACL_VSTRING_ADDCH(buf, ' '); + if ((json->flag & ACL_JSON_FLAG_ADD_SPACE)) + ACL_VSTRING_ADDCH(buf, ' '); } /* '{' or '[' */ @@ -323,7 +328,8 @@ void acl_json_building(ACL_JSON *json, size_t length, else if (LEN(node->ltag) > 0) { json_escape_append(buf, STR(node->ltag)); ACL_VSTRING_ADDCH(buf, ':'); - ACL_VSTRING_ADDCH(buf, ' '); + if ((json->flag & ACL_JSON_FLAG_ADD_SPACE)) + ACL_VSTRING_ADDCH(buf, ' '); switch (node->type & ~ACL_JSON_T_LEAF) { case ACL_JSON_T_NULL: @@ -430,15 +436,20 @@ ACL_VSTRING *acl_json_build(ACL_JSON *json, ACL_VSTRING *buf) acl_foreach(iter, json) { node = (ACL_JSON_NODE*) iter.data; prev = acl_json_node_prev(node); - if (prev != NULL) - acl_vstring_strcat(buf, ", "); + if (prev != NULL) { + if ((json->flag & ACL_JSON_FLAG_ADD_SPACE)) + acl_vstring_strcat(buf, ", "); + else + acl_vstring_strcat(buf, ","); + } /* 只有当标签的对应值为 JSON 对象或数组对象时 tag_node 非空 */ if (node->tag_node != NULL) { if (LEN(node->ltag) > 0) { json_escape_append(buf, STR(node->ltag)); ACL_VSTRING_ADDCH(buf, ':'); - ACL_VSTRING_ADDCH(buf, ' '); + if ((json->flag & ACL_JSON_FLAG_ADD_SPACE)) + ACL_VSTRING_ADDCH(buf, ' '); } /* '{' or '[' */ @@ -450,7 +461,8 @@ ACL_VSTRING *acl_json_build(ACL_JSON *json, ACL_VSTRING *buf) else if (LEN(node->ltag) > 0) { json_escape_append(buf, STR(node->ltag)); ACL_VSTRING_ADDCH(buf, ':'); - ACL_VSTRING_ADDCH(buf, ' '); + if ((json->flag & ACL_JSON_FLAG_ADD_SPACE)) + ACL_VSTRING_ADDCH(buf, ' '); switch (node->type & ~ACL_JSON_T_LEAF) { case ACL_JSON_T_NULL: diff --git a/lib_acl/src/master/framework/master_warning.c b/lib_acl/src/master/framework/master_warning.c index 00d775dd8..1f765e2fc 100644 --- a/lib_acl/src/master/framework/master_warning.c +++ b/lib_acl/src/master/framework/master_warning.c @@ -1,3 +1,4 @@ +#include "StdAfx.h" #include "stdlib/acl_define.h" #ifdef ACL_UNIX diff --git a/lib_acl/src/stdlib/sys/gettimeofday.c b/lib_acl/src/stdlib/sys/gettimeofday.c index 9b137b695..09309a0d0 100644 --- a/lib_acl/src/stdlib/sys/gettimeofday.c +++ b/lib_acl/src/stdlib/sys/gettimeofday.c @@ -27,12 +27,12 @@ # else # define EPOCHFILETIME (116444736000000000LL) # endif - +/* #ifndef ACL_DLL int _daylight; long _timezone; #endif - +*/ static void dummy(void *ptr acl_unused) { diff --git a/lib_acl_cpp/CMakeLists.txt b/lib_acl_cpp/CMakeLists.txt index 8dc7f2814..0b8ddc0a6 100644 --- a/lib_acl_cpp/CMakeLists.txt +++ b/lib_acl_cpp/CMakeLists.txt @@ -6,45 +6,16 @@ if (${CMAKE_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) message(FATAL_ERROR "Please into another dir to build!") endif() -add_definitions( - "-W" - "-fPIC" - "-Wall" - "-Werror" - "-Wshadow" - "-Wformat" - "-Wpointer-arith" - "-D_REENTRANT" - "-D_USE_FAST_MACRO" - "-Wno-long-long" - "-Wuninitialized" - "-D_POSIX_PTHREAD_SEMANTICS" - "-DHAS_MYSQL_DLL" - "-DHAS_SQLITE_DLL" - "-Wno-invalid-source-encoding" - "-Wno-unused-private-field" - "-Wno-unused-parameter" - "-Wno-unused-const-variable" - "-fexceptions" -) - -if (CMAKE_BUILD_TYPE STREQUAL "") - set(CMAKE_BUILD_TYPE "DEBUG") -else() - string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) -endif() - -if (CMAKE_BUILD_TYPE STREQUAL "RELEASE") - add_definitions("-O3") -else() - add_definitions("-g") -endif() - #string(TOUPPER ${CMAKE_SYSTEM_NAME} CMAKE_SYSTEM_NAME) if(CMAKE_SYSTEM_NAME MATCHES "Android") add_definitions("-DANDROID") + set(UNIX_OS true) elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(UNIX_OS true) elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(UNIX_OS true) +elseif (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(WIN_OS true) else() message(FATAL_ERROR "unknown CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}") endif() @@ -55,10 +26,12 @@ set(acl_path ${CMAKE_CURRENT_SOURCE_DIR}/../lib_acl) set(acl_include ${acl_path}/include) set(proto_path ${CMAKE_CURRENT_SOURCE_DIR}/../lib_protocol) set(proto_include ${proto_path}/include) +set(zlib_include ${CMAKE_CURRENT_SOURCE_DIR}/../include/zlib) set(mysql_include ${CMAKE_CURRENT_SOURCE_DIR}/../include/mysql) set(sqlite_include ${CMAKE_CURRENT_SOURCE_DIR}/../include/sqlite) include_directories( + ${zlib_include} ${mysql_include} ${sqlite_include} ${acl_include} @@ -67,6 +40,11 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ) +#if (${WIN_OS}) +# set(iconv_include ${CMAKE_CURRENT_SOURCE_DIR}/src/stdlib/internal) +# include_directories(iconv_include) +#endif() + set(src ${CMAKE_CURRENT_SOURCE_DIR}/src) set(sources ${src} @@ -96,21 +74,69 @@ foreach(iter ${sources}) aux_source_directory(${iter} lib_src) endforeach() +############################################################################## + +if (${UNIX_OS}) + add_definitions( + "-W" + "-fPIC" + "-Wall" + "-Werror" + "-Wshadow" + "-Wformat" + "-Wpointer-arith" + "-D_REENTRANT" + "-D_USE_FAST_MACRO" + "-Wno-long-long" + "-Wuninitialized" + "-D_POSIX_PTHREAD_SEMANTICS" + "-DHAS_MYSQL_DLL" + "-DHAS_SQLITE_DLL" + "-Wno-invalid-source-encoding" + "-Wno-unused-private-field" + "-Wno-unused-parameter" + "-Wno-unused-const-variable" + "-fexceptions" + ) + + if (CMAKE_BUILD_TYPE STREQUAL "") + set(CMAKE_BUILD_TYPE "DEBUG") + else() + string(TOUPPER CMAKE_BUILD_TYPE CMAKE_BUILD_TYPE) + endif() + + if (CMAKE_BUILD_TYPE STREQUAL "RELEASE") + add_definitions("-O3") + else() + add_definitions("-g") + endif() +elseif (${WIN_OS}) + add_definitions( + "-Ycacl_stdafx.hpp" + "-DACL_WRITEABLE_CHECK" + "-DACL_PREPARE_COMPILE" + "-DHAS_ZLIB_DLL" + "-DUSE_WIN_ICONV") + aux_source_directory(${src}/stdlib/internal lib_src) +endif() + if (CMAKE_SYSTEM_NAME MATCHES "Android") - set(CMAKE_SHARED_LINKER_FLAGS "-shared") + set(CMAKE_SHARED_LINKER_FLAGS "-shared -lz") else() set(lib_output_path ${PROJECT_BINARY_DIR}/lib) set(LIBRARY_OUTPUT_PATH ${lib_output_path}) - add_library(_acl_cpp_static STATIC ${lib_src}) - SET_TARGET_PROPERTIES(_acl_cpp_static PROPERTIES OUTPUT_NAME "acl_cpp") + add_library(acl_cpp_static STATIC ${lib_src}) + SET_TARGET_PROPERTIES(acl_cpp_static PROPERTIES OUTPUT_NAME "acl_cpp") if (CMAKE_SYSTEM_NAME MATCHES "Darwin") set(CMAKE_SHARED_LINKER_FLAGS "-shared -Wl,-rpath,. -L${lib_output_path} -lprotocol -lacl -liconv -lz -lpthread") - else() + elseif (${UNIX_OS}) set(CMAKE_SHARED_LINKER_FLAGS "-shared -Wl,-rpath,. -L${lib_output_path} -lprotocol -lacl -lz -lpthread") + elseif (${WIN_OS}) + set(CMAKE_SHARED_LINKER_FLAGS "/DYNAMICBASE ws2_32.lib") endif() set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${lib_output_path}) diff --git a/lib_acl_cpp/acl_cpp.xcodeproj/project.pbxproj b/lib_acl_cpp/acl_cpp.xcodeproj/project.pbxproj index f6b15baf2..130c33a83 100644 --- a/lib_acl_cpp/acl_cpp.xcodeproj/project.pbxproj +++ b/lib_acl_cpp/acl_cpp.xcodeproj/project.pbxproj @@ -1681,9 +1681,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; + ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; }; name = Debug; @@ -1719,8 +1719,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; + ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/lib_acl_cpp/changes.txt b/lib_acl_cpp/changes.txt index aa49cabdc..44fca0b97 100644 --- a/lib_acl_cpp/changes.txt +++ b/lib_acl_cpp/changes.txt @@ -1,6 +1,14 @@ 修改历史列表: ----------------------------------------------------------------------- + +470) 2017.3.30 +470.1) feature: json 类对象在创建 json 字符串时默认不自动添加空格,但允许调用者 +设置参数以便于自动添加空格从而使 json 字符串更可读 + +469) 2017.3.29 +469.1) feature: db_handle 模块支持事务回滚 + 468) 2017.3.25 468.1) connect_pool 连接池模块取消自动将连接池置为不可用操作 diff --git a/lib_acl_cpp/include/acl_cpp/acl_cpp_define.hpp b/lib_acl_cpp/include/acl_cpp/acl_cpp_define.hpp index 3beb10182..b737a726a 100644 --- a/lib_acl_cpp/include/acl_cpp/acl_cpp_define.hpp +++ b/lib_acl_cpp/include/acl_cpp/acl_cpp_define.hpp @@ -1,17 +1,22 @@ #pragma once -#ifndef ACL_CPP_API -# ifdef ACL_CPP_DLL -# ifdef ACL_CPP_EXPORTS +#ifdef ACL_CPP_LIB +# ifndef ACL_CPP_API +# define ACL_CPP_API +# endif +#elif defined(ACL_CPP_DLL) || defined(_WINDLL) +# if defined(ACL_CPP_EXPORTS) || defined(acl_cpp_EXPORTS) +# ifndef ACL_CPP_API # define ACL_CPP_API __declspec(dllexport) -# else -# define ACL_CPP_API __declspec(dllimport) # endif -# else -# define ACL_CPP_API +# elif !defined(ACL_CPP_API) +# define ACL_CPP_API __declspec(dllimport) # endif +#elif !defined(ACL_CPP_API) +# define ACL_CPP_API #endif +/* #ifndef ACL_CPP_TPL # ifdef ACL_CPP_DLL # ifdef ACL_CPP_EXPORTS @@ -23,6 +28,7 @@ # define ACL_CPP_TPL # endif #endif +*/ #include #include diff --git a/lib_acl_cpp/include/acl_cpp/db/db_handle.hpp b/lib_acl_cpp/include/acl_cpp/db/db_handle.hpp index 671a9d104..8d5b5aaad 100644 --- a/lib_acl_cpp/include/acl_cpp/db/db_handle.hpp +++ b/lib_acl_cpp/include/acl_cpp/db/db_handle.hpp @@ -321,6 +321,12 @@ class ACL_CPP_API db_handle : public connect_client */ virtual bool commit() { return false; } + /** + * 事务回滚 + * @return {bool} + */ + virtual bool rollback() { return false; } + /** * 更安全易用的查询过程,调用此函数功能等同于 sql_select,只是查询 * 对象 query 构建的 sql 语句是安全的,可以防止 sql 注入,该方法 diff --git a/lib_acl_cpp/include/acl_cpp/db/db_mysql.hpp b/lib_acl_cpp/include/acl_cpp/db/db_mysql.hpp index 91e19aead..256249fe1 100644 --- a/lib_acl_cpp/include/acl_cpp/db/db_mysql.hpp +++ b/lib_acl_cpp/include/acl_cpp/db/db_mysql.hpp @@ -133,6 +133,7 @@ class ACL_CPP_API db_mysql : public db_handle int affect_count() const; /** + * @override * 基类 db_handle 的虚函数,用来表示事务的开始,注意若要使用事务方式, * 则需要在 db_mysql 的构造函数中传入的参数 auto_commit 为 false * @return {bool} @@ -140,11 +141,18 @@ class ACL_CPP_API db_mysql : public db_handle bool begin_transaction(); /** + * @override * 基类 db_handle 的虚函数,用来表示事务的结束 * @return {bool} */ bool commit(); + /** + * @override + * @return {bool} 事务回滚是否成功 + */ + bool rollback(); + private: char* dbaddr_; // 数据库监听地址 char* dbname_; // 数据库名 diff --git a/lib_acl_cpp/include/acl_cpp/serialize/gson_helper.ipp b/lib_acl_cpp/include/acl_cpp/serialize/gson_helper.ipp index dbe7a3a94..255fca3e4 100644 --- a/lib_acl_cpp/include/acl_cpp/serialize/gson_helper.ipp +++ b/lib_acl_cpp/include/acl_cpp/serialize/gson_helper.ipp @@ -738,7 +738,7 @@ static inline std::pair gson(acl::json_node &node, char **obj if (node.is_string() == false) return std::make_pair(false, "get char * string failed"); - int len = strlen(node.get_string()); + int len = (int) strlen(node.get_string()); *obj = new char[len + 1]; memcpy(*obj, node.get_string(), len); (*obj)[len] = 0; diff --git a/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp b/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp index 5c42804ca..a0b21ab9a 100644 --- a/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp +++ b/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp @@ -742,15 +742,17 @@ class ACL_CPP_API json : public pipe_stream, public dbuf_obj /** * 将 json 对象树转成字符串 * @param out {string&} 存储转换结果的缓冲区 + * @param add_space {bool} 创建 json 时是否自动在分隔符两边添加空格 */ - void build_json(string& out) const; + void build_json(string& out, bool add_space = false) const; /** * 将 json 对象树转换成 json 字符串 * @param out {string*} 非空时,则使用此缓冲区,否则使用内部缓冲区 + * @param add_space {bool} 创建 json 时是否自动在分隔符两边添加空格 * @return {const string&} */ - const string& to_string(string* out = NULL) const; + const string& to_string(string* out = NULL, bool add_space = false) const; // pipe_stream 虚函数重载 diff --git a/lib_acl_cpp/include/acl_cpp/stdlib/string.hpp b/lib_acl_cpp/include/acl_cpp/stdlib/string.hpp index da93d8036..e58165dc6 100644 --- a/lib_acl_cpp/include/acl_cpp/stdlib/string.hpp +++ b/lib_acl_cpp/include/acl_cpp/stdlib/string.hpp @@ -1060,7 +1060,7 @@ class ACL_CPP_API string * 数据长度大于实际要拷贝的长度,则仅拷贝实际存在的数据 * @return {size_t} 返回拷贝的实际数据长度,pos 越界时则该返回值为 0 */ - size_t substr(string& out, size_t pos = 0, size_t len = 0); + size_t substr(string& out, size_t pos = 0, size_t len = 0) const; /** * 将当前对象的数据缓冲区中的数据进行 base64 转码 diff --git a/lib_acl_cpp/samples/json/json1/json.cpp b/lib_acl_cpp/samples/json/json1/json.cpp index f166565e4..3e829cd36 100644 --- a/lib_acl_cpp/samples/json/json1/json.cpp +++ b/lib_acl_cpp/samples/json/json1/json.cpp @@ -145,7 +145,7 @@ static void test(void) printf("-------------------------------------------------\r\n"); acl::string buf; - json.build_json(buf); + json.build_json(buf, true); printf("-----------------json------------------------\r\n"); printf("%s\r\n", buf.c_str()); diff --git a/lib_acl_cpp/samples/master/master_threads/master_threads.cpp b/lib_acl_cpp/samples/master/master_threads/master_threads.cpp index 7812fb051..456c446ba 100644 --- a/lib_acl_cpp/samples/master/master_threads/master_threads.cpp +++ b/lib_acl_cpp/samples/master/master_threads/master_threads.cpp @@ -2,8 +2,10 @@ // #include "stdafx.h" +#include "lib_acl.h" #include "acl_cpp/stdlib/log.hpp" #include "acl_cpp/stdlib/util.hpp" +#include "acl_cpp/stream/server_socket.hpp" #include "acl_cpp/master/master_threads.hpp" #include "acl_cpp/event/event_timer.hpp" #include "acl_cpp/stream/socket_stream.hpp" diff --git a/lib_acl_cpp/src/db/db_mysql.cpp b/lib_acl_cpp/src/db/db_mysql.cpp index cefb56a35..269d4912a 100644 --- a/lib_acl_cpp/src/db/db_mysql.cpp +++ b/lib_acl_cpp/src/db/db_mysql.cpp @@ -814,6 +814,17 @@ bool db_mysql::commit() return true; } +bool db_mysql::rollback() +{ + const char* sql = "rollback"; + if (sql_update(sql) == false) + { + logger_error("%s error: %s", sql, get_error()); + return false; + } + return true; +} + } // namespace acl #else diff --git a/lib_acl_cpp/src/http/http_client.cpp b/lib_acl_cpp/src/http/http_client.cpp index 1b0bb10d2..fa1815a4b 100644 --- a/lib_acl_cpp/src/http/http_client.cpp +++ b/lib_acl_cpp/src/http/http_client.cpp @@ -1,6 +1,6 @@ #include "acl_stdafx.hpp" -#ifndef ACL_PREPARE_COMPILE #include +#ifndef ACL_PREPARE_COMPILE #include "acl_cpp/stdlib/log.hpp" #include "acl_cpp/stdlib/snprintf.hpp" #include "acl_cpp/stdlib/zlib_stream.hpp" diff --git a/lib_acl_cpp/src/http/websocket.cpp b/lib_acl_cpp/src/http/websocket.cpp index 50431e938..ca1ded364 100644 --- a/lib_acl_cpp/src/http/websocket.cpp +++ b/lib_acl_cpp/src/http/websocket.cpp @@ -127,7 +127,7 @@ void websocket::make_frame_header(void) { ptr[offset++] |= 126; ptr[offset++] = (unsigned char) (payload_len >> 8) & 0xff; - ptr[offset++] = payload_len & 0xff; + ptr[offset++] = (unsigned char) payload_len & 0xff; } else { diff --git a/lib_acl_cpp/src/stdlib/json.cpp b/lib_acl_cpp/src/stdlib/json.cpp index ac040dd16..9e68dfc91 100644 --- a/lib_acl_cpp/src/stdlib/json.cpp +++ b/lib_acl_cpp/src/stdlib/json.cpp @@ -738,7 +738,8 @@ json_node* json::next_node(void) return n; } -const string& json::to_string(string* out /* = NULL */) const +const string& json::to_string(string* out /* = NULL */, + bool add_space /* = false */) const { if (out == NULL) { @@ -749,13 +750,24 @@ const string& json::to_string(string* out /* = NULL */) const out = const_cast(this)->buf_; } + if (add_space) + const_cast(this)->json_->flag |= ACL_JSON_FLAG_ADD_SPACE; + else + const_cast(this)->json_->flag &= ~ACL_JSON_FLAG_ADD_SPACE; + ACL_VSTRING* vbuf = out->vstring(); (void) acl_json_build(json_, vbuf); return *out; } -void json::build_json(string& out) const +void json::build_json(string& out, bool add_space /* = false */) const { + if (add_space) + const_cast(this)->json_->flag |= ACL_JSON_FLAG_ADD_SPACE; + else + const_cast(this)->json_->flag &= ~ACL_JSON_FLAG_ADD_SPACE; + + ACL_VSTRING* buf = out.vstring(); (void) acl_json_build(json_, buf); } diff --git a/lib_acl_cpp/src/stdlib/string.cpp b/lib_acl_cpp/src/stdlib/string.cpp index 5741716cb..e13c8f9d4 100644 --- a/lib_acl_cpp/src/stdlib/string.cpp +++ b/lib_acl_cpp/src/stdlib/string.cpp @@ -1472,7 +1472,7 @@ string& string::upper() return *this; } -size_t string::substr(string& out, size_t pos /* = 0 */, size_t len /* = 0 */) +size_t string::substr(string& out, size_t pos /* = 0 */, size_t len /* = 0 */) const { size_t n = LEN(vbf_); if (pos >= n) diff --git a/lib_acl_cpp/src/stdlib/zlib_stream.cpp b/lib_acl_cpp/src/stdlib/zlib_stream.cpp index 8b8989e0d..b7ec5d1b4 100644 --- a/lib_acl_cpp/src/stdlib/zlib_stream.cpp +++ b/lib_acl_cpp/src/stdlib/zlib_stream.cpp @@ -1,6 +1,6 @@ #include "acl_stdafx.hpp" +#include #ifndef ACL_PREPARE_COMPILE -#include "zlib.h" #include "acl_cpp/stdlib/log.hpp" #include "acl_cpp/stdlib/string.hpp" #include "acl_cpp/stdlib/zlib_stream.hpp" diff --git a/lib_fiber/c/Makefile b/lib_fiber/c/Makefile index a0ceef609..44e2911ac 100644 --- a/lib_fiber/c/Makefile +++ b/lib_fiber/c/Makefile @@ -140,6 +140,8 @@ CFLAGS += -I $(LIB_ACL_PATH)/include -I$(LIB_ACL_PATH)/src/master STATIC_LIBNAME = libfiber.a SHARED_LIBNAME = libfiber.so +STATIC_OLD_LIBNAME = lib_fiber.a +SHARED_OLD_LIBNAME = lib_fiber.so ########################################################### @@ -155,9 +157,11 @@ static: $(OBJ) @echo 'creating $(LIB_PATH_DST)/$(STATIC_LIBNAME)' $(AR) $(ARFL) $(LIB_PATH_DST)/$(STATIC_LIBNAME) $(OBJ) $(RANLIB) $(LIB_PATH_DST)/$(STATIC_LIBNAME) + @(cd $(LIB_PATH_DST); rm -f ${STATIC_OLD_LIBNAME}; \ + ln -s $(STATIC_LIBNAME) ${STATIC_OLD_LIBNAME}) @echo 'build $(LIB_PATH_DST)/$(STATIC_LIBNAME) ok!' -shared_ldflags = -l_acl -lrt -lpthread +shared_ldflags = -lacl -lrt -lpthread shared: $(OBJ) @echo '' @echo 'creating $(SHARED_LIBNAME)' @@ -174,12 +178,12 @@ shared: $(OBJ) elif test -n "$(rpath)" && test "$(UNIXTYPE)" = "MACOSX"; then \ echo "building for Darwin"; \ $(CC) -shared -o $(rpath)/$(SHARED_LIBNAME) $(OBJ) \ - -R$(rpath) -L$(rpath) -l_acl -lpthread; \ + -R$(rpath) -L$(rpath) -lacl -lpthread; \ echo 'build $(rpath)/$(SHARED_LIBNAME) ok!'; \ elif test -n "$(rpath)" && test "$(UNIXTYPE)" = "FREEBSD"; then \ echo "building for FreeBSD"; \ $(CC) -shared -o $(rpath)/$(SHARED_LIBNAME) $(OBJ) \ - -R$(rpath) -L$(rpath) -l_acl -lpthread; \ + -R$(rpath) -L$(rpath) -lacl -lpthread; \ echo 'build $(rpath)/$(SHARED_LIBNAME) ok!'; \ else \ echo 'skip build $(SHARED_LIBNAME); usage: make shared rpath=xxx'; \ @@ -191,12 +195,14 @@ $(OBJ_PATH_DST)/%.o: $(SRC_PATH_SRC)/master/%.c $(COMPILE) $< -o $@ clean cl: - rm -f $(LIB_PATH_DST)/lib_fiber.a - rm -f $(LIB_PATH_DST)/lib_fiber.so + rm -f $(LIB_PATH_DST)/${STATIC_LIBNAME} + rm -f $(LIB_PATH_DST)/${SHARED_LIBNAME} + rm -f $(LIB_PATH_DST)/${STATIC_OLD_LIBNAME} + rm -f $(LIB_PATH_DST)/${SHARED_OLD_LIBNAME} rm -f $(OBJ) all_lib: $(OBJ) - @(cd debug; ar x ../../lib_acl/lib/lib_acl.a) - $(AR) $(ARFL) $(LIB_PATH_DST)/lib_fiber.a debug/*.o - $(RANLIB) $(LIB_PATH_DST)/lib_fiber.a - @(cd debug; rm -f `ar -t ../../lib_acl/lib/lib_acl.a`) + @(cd debug; ar x ../../lib_acl/lib/libacl.a) + $(AR) $(ARFL) $(LIB_PATH_DST)/libfiber.a debug/*.o + $(RANLIB) $(LIB_PATH_DST)/${STATIC_LIBNAME} + @(cd debug; rm -f `ar -t ../../lib_acl/lib/libacl.a`) diff --git a/lib_fiber/c/src/event.c b/lib_fiber/c/src/event.c index f1505ad65..51baaff1f 100644 --- a/lib_fiber/c/src/event.c +++ b/lib_fiber/c/src/event.c @@ -413,6 +413,7 @@ int event_process(EVENT *ev, int timeout) int processed = 0, numevents, j; int mask, fd, rfired; FILE_EVENT *fe; + ACL_RING *head; #ifdef DEL_DELAY int ndefer; #endif @@ -481,21 +482,18 @@ int event_process(EVENT *ev, int timeout) #define TO_APPL acl_ring_to_appl - acl_ring_foreach(ev->iter, &ev->poll_list) { - POLL_EVENT *pe = TO_APPL(ev->iter.ptr, POLL_EVENT, me); - + while ((head = acl_ring_pop_head(&ev->poll_list))) { + POLL_EVENT *pe = TO_APPL(head, POLL_EVENT, me); pe->proc(ev, pe); processed++; } - acl_ring_init(&ev->poll_list); - acl_ring_foreach(ev->iter, &ev->epoll_list) { - EPOLL_EVENT *ee = TO_APPL(ev->iter.ptr, EPOLL_EVENT, me); + while ((head = acl_ring_pop_head(&ev->epoll_list))) { + EPOLL_EVENT *ee = TO_APPL(head, EPOLL_EVENT, me); ee->proc(ev, ee); processed++; } - acl_ring_init(&ev->epoll_list); /* return the number of processed file/time events */ return processed; diff --git a/lib_fiber/c/src/fiber.c b/lib_fiber/c/src/fiber.c index e610963f5..1bbc3c2f4 100644 --- a/lib_fiber/c/src/fiber.c +++ b/lib_fiber/c/src/fiber.c @@ -431,8 +431,20 @@ void acl_fiber_signal(ACL_FIBER *fiber, int signum) acl_ring_detach(&curr->me); acl_ring_detach(&fiber->me); + + /* add the current fiber and signed fiber in the head of the ready */ +#if 0 acl_fiber_ready(fiber); acl_fiber_yield(); +#else + curr->status = FIBER_STATUS_READY; + acl_ring_append(&__thread_fiber->ready, &curr->me); + + fiber->status = FIBER_STATUS_READY; + acl_ring_append(&__thread_fiber->ready, &fiber->me); + + acl_fiber_switch(); +#endif } int acl_fiber_signum(ACL_FIBER *fiber) @@ -552,10 +564,17 @@ static ACL_FIBER *fiber_alloc(void (*fn)(ACL_FIBER *, void *), head = acl_ring_pop_head(&__thread_fiber->dead); if (head == NULL) { fiber = (ACL_FIBER *) acl_mycalloc(1, sizeof(ACL_FIBER)); + /* no using calloc just avoiding using real memory */ fiber->buff = (char *) acl_mymalloc(size); - } else if ((fiber = APPL(head, ACL_FIBER, me))->size < size) - fiber->buff = (char *) acl_myrealloc(fiber->buff, size); - else + } else if ((fiber = APPL(head, ACL_FIBER, me))->size < size) { + /* if using realloc, real memory will be used, when we first + * free and malloc again, then we'll just use virtual memory, + * because memcpy will be called in realloc. + */ + /* fiber->buff = (char *) acl_myrealloc(fiber->buff, size); */ + acl_myfree(fiber->buff); + fiber->buff = (char *) acl_mymalloc(size); + } else size = fiber->size; fiber->errnum = 0; diff --git a/lib_fiber/c/src/fiber_schedule.c.star b/lib_fiber/c/src/fiber_schedule.c.star deleted file mode 100644 index e902c6c59..000000000 --- a/lib_fiber/c/src/fiber_schedule.c.star +++ /dev/null @@ -1,262 +0,0 @@ -#include "stdafx.h" -#include "fiber/fiber_io.h" -#include "fiber/fiber_schedule.h" -#include "fiber.h" - -typedef struct { - ACL_RING queue; - FIBER **fibers; - size_t size; - int exitcode; - FIBER *running; - FIBER schedule; - size_t idgen; - int count; - int switched; -} FIBER_TLS; - -static FIBER_TLS *__main_fiber = NULL; -static __thread FIBER_TLS *__thread_fiber = NULL; - -static acl_pthread_key_t __fiber_key; - -static void thread_free(void *ctx) -{ - FIBER_TLS *tf = (FIBER_TLS *) ctx; - - if (__thread_fiber == NULL) - return; - - acl_myfree(tf->fibers); - acl_myfree(tf); - if (__main_fiber == __thread_fiber) - __main_fiber = NULL; - __thread_fiber = NULL; -} - -static void fiber_schedule_main_free(void) -{ - if (__main_fiber) { - thread_free(__main_fiber); - if (__thread_fiber == __main_fiber) - __thread_fiber = NULL; - __main_fiber = NULL; - } -} - -static void thread_init(void) -{ - acl_assert(acl_pthread_key_create(&__fiber_key, thread_free) == 0); -} - -static acl_pthread_once_t __once_control = ACL_PTHREAD_ONCE_INIT; - -static void fiber_check(void) -{ - if (__thread_fiber != NULL) - return; - - acl_assert(acl_pthread_once(&__once_control, thread_init) == 0); - - __thread_fiber = (FIBER_TLS *) acl_mycalloc(1, sizeof(FIBER_TLS)); - __thread_fiber->fibers = NULL; - __thread_fiber->size = 0; - __thread_fiber->idgen = 0; - __thread_fiber->count = 0; - acl_ring_init(&__thread_fiber->queue); - - if ((unsigned long) acl_pthread_self() == acl_main_thread_self()) { - __main_fiber = __thread_fiber; - atexit(fiber_schedule_main_free); - } else if (acl_pthread_setspecific(__fiber_key, __thread_fiber) != 0) - acl_msg_fatal("acl_pthread_setspecific error!"); -} - -static void fiber_swap(FIBER *from, FIBER *to) -{ - if (swapcontext(&from->uctx, &to->uctx) < 0) - acl_msg_fatal("%s(%d), %s: swapcontext error %s", - __FILE__, __LINE__, __FUNCTION__, acl_last_serror()); -} - -FIBER *fiber_running(void) -{ - fiber_check(); - return __thread_fiber->running; -} - -void fiber_exit(int exit_code) -{ - fiber_check(); - - __thread_fiber->exitcode = exit_code; - __thread_fiber->running->status = FIBER_STATUS_EXITING; - - fiber_switch(); -} - -static void fiber_start(unsigned int x, unsigned int y) -{ - FIBER *fiber; - unsigned long z; - - z = x << 16; - z <<= 16; - z |= y; - fiber = (FIBER *) z; - - fiber->fn(fiber, fiber->arg); - fiber_exit(0); -} - -static FIBER *fiber_alloc(void (*fn)(FIBER *, void *), void *arg, size_t size) -{ - FIBER *fiber; - sigset_t zero; - unsigned long z; - unsigned int x, y; - - fiber_check(); - - fiber = (FIBER *) acl_mycalloc(1, sizeof(FIBER) + size); - fiber->fn = fn; - fiber->arg = arg; - fiber->stack = fiber->buf; - fiber->size = size; - fiber->id = ++__thread_fiber->idgen; - - sigemptyset(&zero); - sigprocmask(SIG_BLOCK, &zero, &fiber->uctx.uc_sigmask); - - if (getcontext(&fiber->uctx) < 0) - acl_msg_fatal("%s(%d), %s: getcontext error: %s", - __FILE__, __LINE__, __FUNCTION__, acl_last_serror()); - - fiber->uctx.uc_stack.ss_sp = fiber->stack + 8; - fiber->uctx.uc_stack.ss_size = fiber->size - 64; - - z = (unsigned long) fiber; - y = z; - z >>= 16; - x = z >> 16; - - makecontext(&fiber->uctx, (void(*)(void)) fiber_start, 2, x, y); - - return fiber; -} - -FIBER *fiber_create(void (*fn)(FIBER *, void *), void *arg, size_t size) -{ - FIBER *fiber = fiber_alloc(fn, arg, size); - - __thread_fiber->count++; - if (__thread_fiber->size % 64 == 0) - __thread_fiber->fibers = (FIBER **) acl_myrealloc( - __thread_fiber->fibers, - (__thread_fiber->size + 64) * sizeof(FIBER *)); - - fiber->slot = __thread_fiber->size; - __thread_fiber->fibers[__thread_fiber->size++] = fiber; - fiber_ready(fiber); - - return fiber; -} - -void fiber_free(FIBER *fiber) -{ - acl_myfree(fiber); -} - -int fiber_id(const FIBER *fiber) -{ - return fiber->id; -} - -void fiber_init(void) __attribute__ ((constructor)); - -void fiber_init(void) -{ - static int __called = 0; - - if (__called != 0) - return; - - __called++; - fiber_io_hook(); - fiber_net_hook(); -} - -void fiber_schedule(void) -{ - FIBER *fiber; - ACL_RING *head; - - for (;;) { - head = acl_ring_pop_head(&__thread_fiber->queue); - if (head == NULL) { - printf("------- NO FIBER NOW --------\r\n"); - break; - } - - fiber = ACL_RING_TO_APPL(head, FIBER, me); - fiber->status = FIBER_STATUS_READY; - - __thread_fiber->running = fiber; - __thread_fiber->switched++; - - fiber_swap(&__thread_fiber->schedule, fiber); - __thread_fiber->running = NULL; - - if (fiber->status == FIBER_STATUS_EXITING) { - size_t slot = fiber->slot; - - if (!fiber->sys) - __thread_fiber->count--; - - __thread_fiber->fibers[slot] = - __thread_fiber->fibers[--__thread_fiber->size]; - __thread_fiber->fibers[slot]->slot = slot; - - fiber_free(fiber); - } - } -} - -void fiber_ready(FIBER *fiber) -{ - fiber->status = FIBER_STATUS_READY; - acl_ring_prepend(&__thread_fiber->queue, &fiber->me); -} - -int fiber_yield(void) -{ - int n = __thread_fiber->switched; - - fiber_ready(__thread_fiber->running); - fiber_switch(); - - return __thread_fiber->switched - n - 1; -} - -void fiber_system(void) -{ - if (!__thread_fiber->running->sys) { - __thread_fiber->running->sys = 1; - __thread_fiber->count--; - } -} - -void fiber_count_inc(void) -{ - __thread_fiber->count++; -} - -void fiber_count_dec(void) -{ - __thread_fiber->count--; -} - -void fiber_switch(void) -{ - fiber_swap(__thread_fiber->running, &__thread_fiber->schedule); -} diff --git a/lib_fiber/c/src/hook_net.c b/lib_fiber/c/src/hook_net.c index 72dbb0cea..638b0a15d 100644 --- a/lib_fiber/c/src/hook_net.c +++ b/lib_fiber/c/src/hook_net.c @@ -273,6 +273,14 @@ int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) return __sys_connect(sockfd, addr, addrlen); me = acl_fiber_running(); + + if (acl_fiber_killed(me)) { + acl_msg_info("%s(%d), %s: fiber-%u was killed, %s", + __FILE__, __LINE__, __FUNCTION__, + acl_fiber_id(me), acl_last_serror()); + return -1; + } + acl_non_blocking(sockfd, ACL_NON_BLOCKING); int ret = __sys_connect(sockfd, addr, addrlen); @@ -415,6 +423,20 @@ static void event_poll_set(EVENT *ev, POLL_EVENT *pe, int timeout) ev->timeout = timeout; } +static void event_poll_clear(EVENT *ev, POLL_EVENT *pe) +{ + int i; + + acl_ring_detach(&pe->me); + + for (i = 0; i < pe->nfds; i++) { + if (pe->fds[i].events & POLLIN) + event_del(ev, pe->fds[i].fd, EVENT_READABLE); + if (pe->fds[i].events & POLLOUT) + event_del(ev, pe->fds[i].fd, EVENT_WRITABLE); + } +} + static void poll_callback(EVENT *ev acl_unused, POLL_EVENT *pe) { fiber_io_dec(); @@ -450,7 +472,7 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout) acl_fiber_switch(); if (acl_fiber_killed(pe.fiber)) { - acl_ring_detach(&pe.me); + event_poll_clear(ev, &pe); acl_msg_info("%s(%d), %s: fiber-%u was killed, %s", __FILE__, __LINE__, __FUNCTION__, acl_fiber_id(pe.fiber), acl_last_serror()); diff --git a/lib_fiber/changes.txt b/lib_fiber/changes.txt index bcd8ff179..7509e50a8 100644 --- a/lib_fiber/changes.txt +++ b/lib_fiber/changes.txt @@ -1,165 +1,175 @@ +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 +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 鍘绘帀鏈鍚庝竴涓弬鏁帮紝鍏跺師鏉ョ敤 -鏉ユ帶鍒跺鐞嗘鏁帮紝鏀圭敱浠庨厤缃枃浠朵腑璇诲彇 +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 鐨勪娇鐢 +41.1) bugfix: fiber.c 中,fiber_init 函数应该必须保证 __sys_errno 为 NULL 时 +被调用,否则会引起一些静态初始化需要 __sys_errno 的使用 40) 2017.1.23 -40.1) workaround: 鍗忕▼鍙风粺涓鏀规垚鏃犵鍙 32 浣嶆暣鏁 +40.1) workaround: 协程号统一改成无符号 32 位整数 39) 2017.1.12 -39.1) bugfix: 鍗忕▼鍦ㄥ弻閫氭ā寮忎笅锛屽鏋滃啓鏃跺牭濉炰細瀵艰嚧璇讳篃鍫靛锛屾槸鍥犱负寤惰繜鍏抽棴 -鍙婁簨浠惰缃笉鍚堢悊 +39.1) bugfix: 协程在双通模式下,如果写时堵塞会导致读也堵塞,是因为延迟关闭 +及事件设置不合理 38) 2017.1.5 -38.1) bugfix: fiber.c 涓嚱鏁 acl_fiber_killed 涓殑鍒ゆ柇鏈夎 +38.1) bugfix: fiber.c 中函数 acl_fiber_killed 中的判断有误 37) 2016.12.31 -37.1) feature: 澧炲姞 acl_fiber_signal 鍑芥暟锛屽厑璁稿崗绋嬬粰鍏跺畠鍗忕▼鍙戦佸敜閱掍俊鍙 +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 涓殑鏂规硶 +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锛岃绀轰緥鐢ㄤ簬娴嬭瘯鍗忕▼灞閮ㄥ彉閲 +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锛屼粠鑰屽鑷寸▼搴忓穿婧 +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 搴旇鍔犱互鍖哄埆 +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 鑰岄樆濉炵殑鍗忕▼ +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 鏂规硶鐢ㄦ潵鈥濇潃姝烩滃崗绋 -鍜屽垽鏂寚瀹氬崗绋嬫槸鍚﹀凡缁忛鍑 +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 -璁$畻鏂规硶鏈夐棶棰 +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 鎺ュ彛鐢ㄦ潵閫氱煡鎸囧畾鍗忕▼閫鍑 +29.1) feature: 增加 acl_fiber_kill 接口用来通知指定协程退出 28) 2016.10.31 -28.1) feature: fiber.c 涓疄鐜颁簡 __i386__ 涓 SETJMP锛孡ONGJMP 鐨勬眹缂栨柟寮忥紝浠 -libdill 鍊熼壌鑰屾潵 +28.1) feature: fiber.c 中实现了 __i386__ 下 SETJMP,LONGJMP 的汇编方式,从 +libdill 借鉴而来 27) 2016.10.19 -27.1) bugfix: fiber_io.c 涓殑 __thread_fiber->loop_fn 娌℃湁璧嬪垵鍊 +27.1) bugfix: fiber_io.c 中的 __thread_fiber->loop_fn 没有赋初值 26) 2016.9.25 -26.1) feature: 澧炲姞 acl_fiber_post_event 鍑芥暟锛屽湪姣忔浜嬩欢寰幆杩囩▼涓彲浠ヨ皟鐢ㄧ敱 -璇ュ嚱鏁拌缃殑鍥炶皟鍑芥暟 +26.1) feature: 增加 acl_fiber_post_event 函数,在每次事件循环过程中可以调用由 +该函数设置的回调函数 25) 2016.9.22 -25.1) 鍑芥暟鏀瑰悕锛 acl_fiber_stop --> acl_fiber_schedule_stop, +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() +24.1) bugfix: hook_io.c 中的 writev() 函数应该调用 fiber_writev() 23) 2016.9.1 -23.1) feature: 鏀寔 C++11 鍔熻兘锛屼娇鐢 lambda 琛ㄨ揪寮忓垱寤哄崗绋嬫洿鍔犳柟渚跨畝娲 +23.1) feature: 支持 C++11 功能,使用 lambda 表达式创建协程更加方便简洁 ------------------------------------------------------------------------------ 22) 2016.8.25 -22.1) feature: hook_io.c 涓彁渚涗簡鍗曠嫭鐨 fiber_xxx IO 鎺ュ彛 +22.1) feature: hook_io.c 中提供了单独的 fiber_xxx IO 接口 21) 2016.8.17 -21.1) performance: fiber.c 涓嚱鏁 fiber_alloc 鍦ㄥ垱寤哄崗绋嬫爤鏃朵娇鐢 malloc 浠f浛浜 -鍘熸潵鐨 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 閫熷害鏇村揩 +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 姹囩紪浠g爜绉绘鎬 +20.1) portable: fiber.c 中增强了 SETJMP 汇编代码移植性 19) 2016.8.10 -19.1) performance&feature: 鍏佽浣跨敤 setjmp/longjmp 杩涜鏍堢殑璺宠浆锛屾ц兘鏇村ソ +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 璋冪敤杩囩▼ +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 鍑芥暟 +17.1) feature: hook_io.c 中增加系统 API sleep 的 hook 函数 16) 2016.8.4 -16.1) bugfix: hook_net.c 涓殑 gethostbyname_r 鍦ㄨВ鏋愬煙鍚嶆椂鐨勫湴鍧鎵鐢ㄥ瓧鑺傚簭鏈夎 ---- found by 闄堟檽鍕 +16.1) bugfix: hook_net.c 中的 gethostbyname_r 在解析域名时的地址所用字节序有误 +--- found by 陈晓勇 15) 2016.7.28 -15.1) bugfix: hook_net.c 涓殑 poll/epoll_wait 瀵逛簬瓒呮椂鐨勮鏁版湁璇紝浼氬鑷磋秴鏃 -鏃堕棿鎻愬墠 +15.1) bugfix: hook_net.c 中的 poll/epoll_wait 对于超时的计数有误,会导致超时 +时间提前 14) 2016.7.26 -14.1) feature: hook_net.c 涓殑 connect 鍑芥暟澧炲姞浜嗗嚭閿欏鐞 +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 鍑芥暟棣栧厛鍒ゆ柇鏄惁鏈夊緟澶勭悊鍗忕▼锛 -鐒跺悗鍐嶅喅瀹氭槸鍚﹂渶瑕佸垏鎹㈠崗绋嬩笂涓嬫枃锛屼粠鑰屽噺灏戜笂涓嬫枃鐨勫垏鎹㈡鏁 +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 鏀寔 +12.1) feature: hook_net.c 增加了 epoll 的 hook 支持 11) 2016.7.9 -11.1) feature: fiber_sem.c 澧炲姞鍗忕▼淇″彿閲 +11.1) feature: fiber_sem.c 增加协程信号量 10) 2016.6.22 -10.1) feature: fiber_server.c 鏈嶅姟妯″潡鏀寔绌洪棽瓒呮椂閫鍑哄強澶勭悊杩炴帴鏁拌揪涓婇檺閫鍑 +10.1) feature: fiber_server.c 服务模块支持空闲超时退出及处理连接数达上限退出 9) 2016.6.21 -9.1) feature: 灏嗛潪 socket 绫诲瀷鐨 fd 閲囩敤鍚屾妯″紡 -9.2) feature: master_fiber.c 鏀寔 dispatch 鏂瑰紡鑾峰緱瀹㈡埛绔繛鎺 +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 鏈嶅姟鍣ㄦ鏋舵帶鍒 +8.1) feature: 增加了 FIBER 锁功能 +8.2) feature: 增加 fiber_server.c 模块,可由 acl_master 服务器框架控制 7) 2016.6.18 -7.1) feature: 澧炲姞浜 FIBER_CHANNEL 鐢ㄤ簬鍗忕▼闂寸殑浜や簰閫氫俊 +7.1) feature: 增加了 FIBER_CHANNEL 用于协程间的交互通信 6) 2016.6.15 -6.1) feature: 澧炲姞瀹氭椂鍣ㄥ姛鑳 -- fiber_create_timer() +6.1) feature: 增加定时器功能 -- fiber_create_timer() 5) 2016.6.14 -5.1) feature: hook 浜 errno 鎵渚濊禆鐨勫嚱鏁 __errno_location锛屼粠鑰屼娇 errno 閽堝 -姣忎釜鍗忕▼鏄畨鍏ㄧ殑 +5.1) feature: hook 了 errno 所依赖的函数 __errno_location,从而使 errno 针对 +每个协程是安全的 4) 2016.6.11 -4.1) valgrind: 澧炲姞缂栬瘧寮鍏充互闃叉 valgrind 宸ュ叿瀵 swapcontext 璺宠浆鐨勮鎶 +4.1) valgrind: 增加编译开关以防止 valgrind 工具对 swapcontext 跳转的误报 3) 2016.6.9 -3.1) performance: fiber_schedule.c锛岀敱鏄熷舰鍒囨崲鏀逛负鐜舰鍒囨崲锛屼粠鑰屾彁鍗囦簡涓婁笅鏂囦欢 -鍒囨崲鐨勬晥鐜 --- by niukey@qq.com +3.1) performance: fiber_schedule.c,由星形切换改为环形切换,从而提升了上下文件 +切换的效率 --- by niukey@qq.com 2) 2016.6.5 -2.1) feature: 灏 fiber_schedule.c, fiber_io.c 涓殑鍏ㄥ眬闈欐佸彉閲忚皟鏁翠负绾跨▼灞閮 -鍙橀噺锛屼负瀹炵幇澶氱嚎绋嬪寲鍗忕▼鍋氬噯澶 +2.1) feature: 将 fiber_schedule.c, fiber_io.c 中的全局静态变量调整为线程局部 +变量,为实现多线程化协程做准备 1) 2016.6.4 -1.1) 褰撳墠鐨勫崗绋嬫敮鎸 hook: read/redv/redv/recvfrom/recvmsg, +1.1) 当前的协程支持 hook: read/redv/redv/recvfrom/recvmsg, write/writev/send/sendto/sendmsg, poll/select/sleep/gethostbyname/gethostbyname_r diff --git a/lib_fiber/cpp/Makefile b/lib_fiber/cpp/Makefile index bdcbd4976..e0b9e754c 100644 --- a/lib_fiber/cpp/Makefile +++ b/lib_fiber/cpp/Makefile @@ -28,7 +28,7 @@ CFLAGS = -c -g -W \ #just for freebsd's iconv.h CFLAGS += -I/usr/local/include -shared_ldflags = -l_acl_cpp -l_protocol -l_acl -lz -lpthread +shared_ldflags = -lacl_cpp -lprotocol -lacl -lz -lpthread ########################################################### #Check system: @@ -58,7 +58,7 @@ endif # For FreeBSD ifeq ($(findstring FreeBSD, $(UNIXNAME)), FreeBSD) UNIXTYPE = FREEBSD - shared_ldflags = -l_acl_cpp -l_protocol -l_acl -L/usr/local/lib -liconv -lz -lpthread + shared_ldflags = -lacl_cpp -l_protocol -lacl -L/usr/local/lib -liconv -lz -lpthread endif # For Darwin @@ -67,13 +67,13 @@ ifeq ($(findstring Darwin, $(UNIXNAME)), Darwin) -Wno-extended-offsetof \ -Wno-unused-private-field UNIXTYPE = MACOSX - shared_ldflags = -l_acl_cpp -l_protocol -l_acl -L/usr/lib -liconv -lz -lpthread + shared_ldflags = -lacl_cpp -l_protocol -lacl -L/usr/lib -liconv -lz -lpthread endif # For Linux ifeq ($(findstring Linux, $(UNIXNAME)), Linux) UNIXTYPE = LINUX - shared_ldflags = -l_acl_cpp -l_protocol -l_acl -lrt -lpthread -lz -ldl + shared_ldflags = -lacl_cpp -l_protocol -lacl -lrt -lpthread -lz -ldl endif # For MINGW @@ -124,6 +124,8 @@ DATE_NOW = 20`date +%y`.`date +%m`.`date +%d` STATIC_LIBNAME = libfiber_cpp.a SHARED_LIBNAME = libfiber_cpp.so +STATIC_OLD_LIBNAME = lib_fiber_cpp.a +SHARED_OLD_LIBNAME = lib_fiber_cpp.so PCH = ./acl_stdafx.hpp.gch lib: static @@ -150,6 +152,8 @@ static: depends $(OBJS_DST) @echo 'creating $(LIB_PATH_DST)/$(STATIC_LIBNAME)' @$(AR) $(ARFL) $(LIB_PATH_DST)/$(STATIC_LIBNAME) $(OBJS_DST) @$(RANLIB) $(LIB_PATH_DST)/$(STATIC_LIBNAME) + @(cd ${LIB_PATH_DST}; rm -f ${STATIC_OLD_LIBNAME}; \ + ln -s ${STATIC_LIBNAME} ${STATIC_OLD_LIBNAME}) @echo 'create $(LIB_PATH_DST)/$(STATIC_LIBNAME) ok!' shared: depends pch $(OBJS_DST) @@ -194,8 +198,10 @@ $(DEF_PATH_DST)/%.inc: ./src/%.cpp $(CREATE_DEF) clean: - rm -f $(LIB_PATH_DST)/libfiber_cpp.a - rm -f $(LIB_PATH_DST)/libfiber_cpp.so + rm -f $(LIB_PATH_DST)/${STATIC_LIBNAME} + rm -f $(LIB_PATH_DST)/${SHARED_LIBNAME} + rm -f $(LIB_PATH_DST)/${STATIC_OLD_LIBNAME} + rm -f $(LIB_PATH_DST)/${SHARED_OLD_LIBNAME} rm -f $(OBJS_DST) rm -f $(OBJS_DEF) rm -f $(PCH) diff --git a/lib_protocol/CMakeLists.txt b/lib_protocol/CMakeLists.txt index 2a907ce54..1dc1b7539 100644 --- a/lib_protocol/CMakeLists.txt +++ b/lib_protocol/CMakeLists.txt @@ -6,43 +6,16 @@ if (${CMAKE_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) message(FATAL_ERROR "Please into another dir to build!") endif() -add_definitions( - "-W" - "-fPIC" - "-Wall" - "-Werror" - "-Wshadow" - "-Wpointer-arith" - "-Waggregate-return" - "-Wmissing-prototypes" - "-D_REENTRANT" - "-D_USE_FAST_MACRO" - "-DACL_WRITEABLE_CHECK" - "-Wno-long-long" - "-Wuninitialized" - "-D_POSIX_PTHREAD_SEMANTICS" - "-DACL_PREPARE_COMPILE" - "-Wno-invalid-source-encoding" - "-Wstrict-prototypes" -) - -if (CMAKE_BUILD_TYPE STREQUAL "") - set(CMAKE_BUILD_TYPE "DEBUG") -else() - string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) -endif() - -if (CMAKE_BUILD_TYPE STREQUAL "RELEASE") - add_definitions("-O3") -else() - add_definitions("-g") -endif() - #string(TOUPPER ${CMAKE_SYSTEM_NAME} CMAKE_SYSTEM_NAME) if (CMAKE_SYSTEM_NAME MATCHES "Android") add_definitions("-DANDROID") + set(UNIX_OS true) elseif (CMAKE_SYSTEM_NAME MATCHES "Linux") + set(UNIX_OS true) elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(UNIX_OS true) +elseif (CMAKE_SYSTEM_NAME MATCHES "Windows") + set(WIN_OS true) else() message(FATAL_ERROR "unknown CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}") endif() @@ -70,6 +43,48 @@ foreach (iter ${sources}) aux_source_directory(${iter} lib_src) endforeach() +############################################################################## + +if (${UNIX_OS}) + add_definitions( + "-W" + "-fPIC" + "-Wall" + "-Werror" + "-Wshadow" + "-Wpointer-arith" + "-Waggregate-return" + "-Wmissing-prototypes" + "-D_REENTRANT" + "-D_USE_FAST_MACRO" + "-DACL_WRITEABLE_CHECK" + "-Wno-long-long" + "-Wuninitialized" + "-D_POSIX_PTHREAD_SEMANTICS" + "-DACL_PREPARE_COMPILE" + "-Wno-invalid-source-encoding" + "-Wstrict-prototypes" + ) + + if (CMAKE_BUILD_TYPE STREQUAL "") + set(CMAKE_BUILD_TYPE "DEBUG") + else() + string(TOUPPER CMAKE_BUILD_TYPE CMAKE_BUILD_TYPE) + endif() + + if (CMAKE_BUILD_TYPE STREQUAL "RELEASE") + add_definitions("-O3") + else() + add_definitions("-g") + endif() + +elseif (${WIN_OS}) + add_definitions( + "-Yc" + "-DACL_WRITEABLE_CHECK" + "-DACL_PREPARE_COMPILE") +endif() + if (CMAKE_SYSTEM_NAME MATCHES "Android") set(CMAKE_SHARED_LINKER_FLAGS "-shared") else() @@ -79,7 +94,12 @@ else() add_library(protocol_static STATIC ${lib_src}) SET_TARGET_PROPERTIES(protocol_static PROPERTIES OUTPUT_NAME "protocol") - set(CMAKE_SHARED_LINKER_FLAGS "-shared -Wl,-rpath,. -L${lib_output_path} -lacl") + if (${UNIX_OS}) + set(CMAKE_SHARED_LINKER_FLAGS "-shared -Wl,-rpath,. -L${lib_output_path} -lacl") + elseif (${WIN_OS}) + set(CMAKE_SHARED_LINKER_FLAGS "/DYNAMICBASE ws2_32.lib") + endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${lib_output_path}) link_directories(${lib_output_path}) endif() diff --git a/lib_protocol/include/http/lib_http_struct.h b/lib_protocol/include/http/lib_http_struct.h index 1dad3f7bf..54a43174f 100644 --- a/lib_protocol/include/http/lib_http_struct.h +++ b/lib_protocol/include/http/lib_http_struct.h @@ -8,14 +8,20 @@ extern "C" { #endif -#ifdef HTTP_DLL -# ifdef HTTP_EXPORTS -# define HTTP_API __declspec(dllexport) -# else +#ifdef HTTP_LIB +# ifndef HTTP_API +# define HTTP_API +# endif +#elif defined(HTTP_DLL) || defined(_WINDLL) +# if defined(HTTP_EXPORTS) || defined(protocol_EXPORTS) +# ifndef HTTP_API +# define HTTP_API __declspec(dllexport) +# endif +# elif !defined(HTTP_API) # define HTTP_API __declspec(dllimport) # endif -#else -# define HTTP_API +#elif !defined(HTTP_API) +# define HTTP_API #endif typedef acl_int64 http_off_t; diff --git a/lib_protocol/include/icmp/lib_icmp.h b/lib_protocol/include/icmp/lib_icmp.h index d2c503ad7..605d4f0b0 100644 --- a/lib_protocol/include/icmp/lib_icmp.h +++ b/lib_protocol/include/icmp/lib_icmp.h @@ -8,14 +8,20 @@ extern "C" { #endif -#ifdef ICMP_DLL -# ifdef ICMP_EXPORTS -# define ICMP_API __declspec(dllexport) -# else +#ifdef ICMP_LIB +# ifndef ICMP_API +# define ICMP_API +# endif +#elif defined(ICMP_DLL) || defined(_WINDLL) +# if defined(ICMP_EXPORTS) || defined(protocol_EXPORTS) +# ifndef ICMP_API +# define ICMP_API __declspec(dllexport) +# endif +# elif !defined(ICMP_API) # define ICMP_API __declspec(dllimport) # endif -#else -# define ICMP_API +#elif !defined(ICMP_API) +# define ICMP_API #endif /* in icmp_chat.c */ diff --git a/lib_protocol/include/smtp/smtp_client.h b/lib_protocol/include/smtp/smtp_client.h index 419d527b9..96c638cce 100644 --- a/lib_protocol/include/smtp/smtp_client.h +++ b/lib_protocol/include/smtp/smtp_client.h @@ -7,14 +7,20 @@ extern "C" { #endif -#ifdef SMTP_DLL -# ifdef SMTP_EXPORTS -# define SMTP_API __declspec(dllexport) -# else +#ifdef SMTP_LIB +# ifndef SMTP_API +# define SMTP_API +# endif +#elif defined(SMTP_DLL) || defined(_WINDLL) +# if defined(SMTP_EXPORTS) || defined(protocol_EXPORTS) +# ifndef SMTP_API +# define SMTP_API __declspec(dllexport) +# endif +# elif !defined(SMTP_API) # define SMTP_API __declspec(dllimport) # endif -#else -# define SMTP_API +#elif !defined(SMTP_API) +# define SMTP_API #endif typedef struct SMTP_CLIENT { diff --git a/lib_protocol/protocol.xcodeproj/project.pbxproj b/lib_protocol/protocol.xcodeproj/project.pbxproj index 8229fc115..986789b08 100644 --- a/lib_protocol/protocol.xcodeproj/project.pbxproj +++ b/lib_protocol/protocol.xcodeproj/project.pbxproj @@ -348,9 +348,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; + ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; }; name = Debug; @@ -386,8 +386,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; + ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/test/Makefile.in b/test/Makefile.in index 030407f59..0c8a9fed0 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -41,7 +41,7 @@ endif ifeq ($(findstring FreeBSD, $(OSNAME)), FreeBSD) CFLAGS += -DFREEBSD SYSLIB = -lcrypt -lpthread -rdynamic - LDFLAGS = -R$(BASE_PATH) -L$(BASE_PATH) -lacl \ + LDFLAGS = -R$(BASE_PATH) -L$(BASE_PATH) -l_acl \ $(EXTLIBS) $(SYSLIB) endif @@ -51,7 +51,7 @@ ifeq ($(findstring Darwin, $(UNIXNAME)), Darwin) -Wno-extended-offsetof SYSLIB += -rdynamic UNIXTYPE = MACOSX - LDFLAGS = -Wl,-rpath,$(BASE_PATH) -R$(BASE_PATH) -L$(BASE_PATH) -lacl \ + LDFLAGS = -Wl,-rpath,$(BASE_PATH) -R$(BASE_PATH) -L$(BASE_PATH) -l_acl \ $(EXTLIBS) $(SYSLIB) endif