Fix for windows (#50)
This commit is contained in:
		
				
					committed by
					
						 Benjamin Sergeant
						Benjamin Sergeant
					
				
			
			
				
	
			
			
			
						parent
						
							4e6a57dc07
						
					
				
				
					commit
					c07ca74186
				
			| @@ -196,6 +196,25 @@ namespace ix | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     bool Socket::isWaitNeeded() | ||||
|     { | ||||
|         int err = getErrno(); | ||||
|  | ||||
|         if (err == EWOULDBLOCK || err == EAGAIN) | ||||
|         { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
| #ifdef _WIN32 | ||||
|         if (err == WSAEWOULDBLOCK || err == WSATRY_AGAIN) | ||||
|         { | ||||
|             return true; | ||||
|         } | ||||
| #endif | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     void Socket::closeSocket(int fd) | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
| @@ -228,8 +247,7 @@ namespace ix | ||||
|                 return ret == len; | ||||
|             } | ||||
|             // There is possibly something to be writen, try again | ||||
|             else if (ret < 0 && (getErrno() == EWOULDBLOCK || | ||||
|                                  getErrno() == EAGAIN)) | ||||
|             else if (ret < 0 && Socket::isWaitNeeded()) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
| @@ -257,8 +275,7 @@ namespace ix | ||||
|                 return true; | ||||
|             } | ||||
|             // There is possibly something to be read, try again | ||||
|             else if (ret < 0 && (getErrno() == EWOULDBLOCK || | ||||
|                                  getErrno() == EAGAIN)) | ||||
|             else if (ret < 0 && Socket::isWaitNeeded()) | ||||
|             { | ||||
|                 // Wait with a 1ms timeout until the socket is ready to read. | ||||
|                 // This way we are not busy looping | ||||
| @@ -317,13 +334,12 @@ namespace ix | ||||
|             size_t size = std::min(kChunkSize, length - output.size()); | ||||
|             ssize_t ret = recv((char*)&_readBuffer[0], size); | ||||
|  | ||||
|             if (ret <= 0 && (getErrno() != EWOULDBLOCK && | ||||
|                              getErrno() != EAGAIN)) | ||||
|             if (ret <= 0 && !Socket::isWaitNeeded()) | ||||
|             { | ||||
|                 // Error | ||||
|                 return std::make_pair(false, std::string()); | ||||
|             } | ||||
|             else if (ret > 0) | ||||
|             else | ||||
|             { | ||||
|                 output.insert(output.end(), | ||||
|                               _readBuffer.begin(), | ||||
|   | ||||
| @@ -41,8 +41,6 @@ namespace ix | ||||
|         virtual ~Socket(); | ||||
|         bool init(std::string& errorMsg); | ||||
|  | ||||
|         void configure(); | ||||
|  | ||||
|         // Functions to check whether there is activity on the socket | ||||
|         PollResultType poll(int timeoutSecs = kDefaultPollTimeout); | ||||
|         bool wakeUpFromPoll(uint8_t wakeUpCode); | ||||
| @@ -76,6 +74,7 @@ namespace ix | ||||
|             const CancellationRequest& isCancellationRequested); | ||||
|  | ||||
|         static int getErrno(); | ||||
|         static bool isWaitNeeded(); | ||||
|  | ||||
|         // Used as special codes for pipe communication | ||||
|         static const uint64_t kSendRequest; | ||||
|   | ||||
| @@ -247,7 +247,7 @@ namespace ix | ||||
|  | ||||
|             if ((clientFd = accept(_serverFd, (struct sockaddr *)&client, &addressLen)) < 0) | ||||
|             { | ||||
|                 if (Socket::getErrno() != EWOULDBLOCK) | ||||
|                 if (!Socket::isWaitNeeded()) | ||||
|                 { | ||||
|                     // FIXME: that error should be propagated | ||||
|                     std::stringstream ss; | ||||
|   | ||||
| @@ -296,8 +296,7 @@ namespace ix | ||||
|             { | ||||
|                 ssize_t ret = _socket->recv((char*)&_readbuf[0], _readbuf.size()); | ||||
|  | ||||
|                 if (ret < 0 && (_socket->getErrno() == EWOULDBLOCK || | ||||
|                                 _socket->getErrno() == EAGAIN)) | ||||
|                 if (ret < 0 && Socket::isWaitNeeded()) | ||||
|                 { | ||||
|                     break; | ||||
|                 } | ||||
| @@ -844,8 +843,7 @@ namespace ix | ||||
|         { | ||||
|             ssize_t ret = _socket->send((char*)&_txbuf[0], _txbuf.size()); | ||||
|  | ||||
|             if (ret < 0 && (_socket->getErrno() == EWOULDBLOCK || | ||||
|                             _socket->getErrno() == EAGAIN)) | ||||
|             if (ret < 0 && Socket::isWaitNeeded()) | ||||
|             { | ||||
|                 break; | ||||
|             } | ||||
|   | ||||
| @@ -8,12 +8,11 @@ project (ixwebsocket_unittest) | ||||
| set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../third_party/sanitizers-cmake/cmake" ${CMAKE_MODULE_PATH}) | ||||
| find_package(Sanitizers) | ||||
|  | ||||
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") | ||||
| set(CMAKE_LD_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") | ||||
|  | ||||
| set (CMAKE_CXX_STANDARD 14) | ||||
|  | ||||
| if (NOT WIN32) | ||||
|   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") | ||||
|   set(CMAKE_LD_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") | ||||
|   option(USE_TLS "Add TLS support" ON) | ||||
| endif() | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user