Browse Source

Merge branch 'release/2.4'

ruanshudong 3 years ago
parent
commit
465332a9c9

+ 13 - 4
cmake/Thirdparty.cmake

@@ -88,9 +88,9 @@ if (TARS_GPERF)
 
 endif (TARS_GPERF)
 
-set(LIB_GTEST "libgtest")
 
 if(WIN32)
+
     ExternalProject_Add(ADD_CURL
         URL http://cdn.tarsyun.com/src/curl-7.69.1.tar.gz 
         DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/download
@@ -110,20 +110,29 @@ if(WIN32)
 endif(WIN32)
 
 if (WIN32)
+    set(LIB_GTEST "gtest")
+
+	if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+   		set(LIB_GTEST "${LIB_GTEST}d")
+	endif()
+
+    message("CMAKE_BUILD_TYPE:${CMAKE_BUILD_TYPE}")
 
     ExternalProject_Add(ADD_${LIB_GTEST}
             URL http://cdn.tarsyun.com/src/release-1.10.0.zip
             DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/download
             PREFIX ${CMAKE_BINARY_DIR}
             INSTALL_DIR ${CMAKE_SOURCE_DIR}
-            CONFIGURE_COMMAND ${CMAKE_COMMAND} . -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/src/gtest -Dgtest_force_shared_crt=ON
+            CONFIGURE_COMMAND ${CMAKE_COMMAND} . -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/src/gtest -A x64 -Dgtest_force_shared_crt=on
             SOURCE_DIR ${CMAKE_BINARY_DIR}/src/gtest-lib
             BUILD_IN_SOURCE 1
-            BUILD_COMMAND ${CMAKE_COMMAND} --build . --config release
-            INSTALL_COMMAND ${CMAKE_COMMAND} --build . --config release --target install
+            BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE} 
+            INSTALL_COMMAND ${CMAKE_COMMAND} --build . --config  ${CMAKE_BUILD_TYPE}  --target install
             URL_MD5 82358affdd7ab94854c8ee73a180fc53
             )
 else()
+    set(LIB_GTEST "libgtest")
+
     ExternalProject_Add(ADD_${LIB_GTEST}
             URL http://cdn.tarsyun.com/src/release-1.10.0.tar.gz
             DOWNLOAD_DIR ${CMAKE_SOURCE_DIR}/download

+ 3 - 3
examples/UtilDemo/demo-util/CMakeLists.txt

@@ -7,12 +7,12 @@ FILE(GLOB_RECURSE SRC_LIST "*.cpp")
 
 if (TARS_SSL)
     if (WIN32)
-        link_libraries(tarsutil gtest ${LIB_SSL} ${LIB_CRYPTO} Crypt32)
+        link_libraries(tarsutil ${LIB_GTEST} ${LIB_SSL} ${LIB_CRYPTO} Crypt32)
     else ()
-        link_libraries(tarsutil gtest ${LIB_SSL} ${LIB_CRYPTO})
+        link_libraries(tarsutil ${LIB_GTEST} ${LIB_SSL} ${LIB_CRYPTO})
     endif ()
 else ()
-    link_libraries(tarsutil gtest)
+    link_libraries(tarsutil ${LIB_GTEST})
 endif ()
 
 add_executable(demo-util ${SRC_LIST})

+ 2 - 2
servant/tup/Tars.h

@@ -999,7 +999,7 @@ public:
 			{
 				UInt32 size = 0;
 				read(size, 0);
-				for (Int32 i = 0; i < size * 2; ++i)
+				for (UInt32 i = 0; i < size * 2; ++i)
 					skipField();
 			}
 				break;
@@ -1007,7 +1007,7 @@ public:
 			{
 				UInt32 size = 0;
 				read(size, 0);
-				for (Int32 i = 0; i < size; ++i)
+				for (UInt32 i = 0; i < size; ++i)
 					skipField();
 			}
 				break;

+ 18 - 2
util/src/epoll_windows/src/epoll.cpp

@@ -69,7 +69,11 @@ public:
         
         for(auto entry : _attn_list)
         {
-            entry->submit();
+            if(entry->_op_count == 0) {
+            // printf("before epoll_wait submit: %d\n", entry->_op_count);
+                //no focus any event, then submit keep attn, otherwise cause op leak
+                entry->submit();
+            }
         }
 
         _attn_list.clear();
@@ -135,10 +139,15 @@ epoll_op_t::epoll_op_t(epoll_sock_data_t *sock_data, uint32_t afd_events)
 
     _sock_data = sock_data;
     _sock_data->_op_count++;
+
+    // printf("submit new: %p, %d\n", this, _sock_data->_op_count);
+ 
 }
 
 epoll_op_t::~epoll_op_t()
 {
+    // printf("~epoll_op_t: %p, %d\n", this, _sock_data->_op_count  );
+
     _sock_data->_op_count--; 
     assert(_sock_data->_op_count >= 0);
 }
@@ -302,6 +311,7 @@ int epoll_port_data_t::epoll_add(SOCKET sock, struct epoll_event *ev)
         SetLastError(ERROR_OUTOFMEMORY);
         return -1;
     }
+    // printf("add new, %d\n", sock_data->_op_count);
 
     add(sock_data);
 
@@ -321,6 +331,7 @@ int epoll_port_data_t::epoll_mod(SOCKET sock, struct epoll_event *ev)
         SetLastError(ERROR_NOT_FOUND);
         return -1;
     }
+    // printf("mod new, %d\n", sock_data->_op_count);
 
     sock_data->_registered_events = ev->events | EPOLLERR | EPOLLHUP;
     sock_data->_user_data         = ev->data.u64;
@@ -331,6 +342,8 @@ int epoll_port_data_t::epoll_del(SOCKET sock, struct epoll_event *ev)
 {
     std::lock_guard<std::mutex> lck (_mutex);
 
+    // printf("del new\n");
+
     epoll_sock_data_t *sock_data = get(sock);
     if(sock_data == NULL)
     {
@@ -473,6 +486,8 @@ int epoll_port_data_t::epoll_wait(OVERLAPPED_ENTRY *entries, ULONG count, struct
             continue;
         }
 
+        delete op;
+
  //       int registered_events = sock_data->_registered_events;
         int reported_events = 0;
         /* Convert afd events to epoll events. */
@@ -588,6 +603,7 @@ int epoll_wait(epoll_t port_handle, struct epoll_event *events, int maxevents, i
     }
 
     epoll_port_data_t *port_data = (epoll_port_data_t *)port_handle;
+
     port_data->submit();
 
     OVERLAPPED_ENTRY entries[64];
@@ -603,7 +619,7 @@ int epoll_wait(epoll_t port_handle, struct epoll_event *events, int maxevents, i
         DWORD error = GetLastError();
         if (error == WAIT_TIMEOUT)
         {
- //           printf("%d, GetQueuedCompletionStatusEx:%d\n", std::this_thread::get_id() , count);
+        //    printf("%d, GetQueuedCompletionStatusEx:%d\n", std::this_thread::get_id() , count);
 
             return 0;
         }