Browse Source

fix(SocketReactorTest): deadlock test intermittently hangs #4400 (#4401)

Aleksandar Fabijanic 2 years ago
parent
commit
b0dc9c5a82
3 changed files with 10 additions and 9 deletions
  1. 2 2
      Net/src/SocketReactor.cpp
  2. 7 5
      Net/testsuite/src/SocketReactorTest.cpp
  3. 1 2
      cppignore.win

+ 2 - 2
Net/src/SocketReactor.cpp

@@ -27,7 +27,7 @@ namespace Poco {
 namespace Net {
 
 
-SocketReactor::SocketReactor():
+SocketReactor::SocketReactor(): _threadAffinity(-1),
 	_stop(false),
 	_pReadableNotification(new ReadableNotification(this)),
 	_pWritableNotification(new WritableNotification(this)),
@@ -86,6 +86,7 @@ void SocketReactor::run()
 			if (hasSocketHandlers())
 			{
 				sm = _pollSet.poll(_params.pollTimeout);
+				if (_stop) break;
 				for (const auto& s : sm)
 				{
 					try
@@ -167,7 +168,6 @@ void SocketReactor::stop()
 
 void SocketReactor::wakeUp()
 {
-	if (_stop) return;
 	_pollSet.wakeUp();
 	_event.set();
 }

+ 7 - 5
Net/testsuite/src/SocketReactorTest.cpp

@@ -416,12 +416,14 @@ namespace
 		void onReadable(ReadableNotification* pNf)
 		{
 			pNf->release();
-			char buffer[64];
-			do
+			std::vector<char> buffer;
+			int n = 0;
+			while ((n = _socket.available()))
 			{
-				if (0 == _socket.receiveBytes(&buffer[0], sizeof(buffer)))
-					break;
-			} while (true);
+				if (n > buffer.size()) buffer.resize(n);
+				n = _socket.receiveBytes(&buffer[0], buffer.size());
+				if (0 == n) break;
+			}
 		}
 
 		void onShutdown(ShutdownNotification* pNf)

+ 1 - 2
cppignore.win

@@ -6,7 +6,7 @@ class CppUnit::TestCaller<class RawSocketTest>.testEchoIPv4Move
 class CppUnit::TestCaller<class ICMPClientTest>.testPing
 class CppUnit::TestCaller<class ICMPClientTest>.testBigPing
 class CppUnit::TestCaller<class HTTPSClientSessionTest>.testProxy
-class CppUnit::TestCaller<class HTTPSStreamFactoryTest>.testProxy  
+class CppUnit::TestCaller<class HTTPSStreamFactoryTest>.testProxy
 class CppUnit::TestCaller<class TCPServerTest>.testReuseSocket
 class CppUnit::TestCaller<class HTTPSClientSessionTest>.testInterop
 class CppUnit::TestCaller<class PathTest>.testFind
@@ -21,4 +21,3 @@ class CppUnit::TestCaller<class WinServiceTest>.testServiceReturnsTrueIfStopped
 class CppUnit::TestCaller<class ICMPSocketTest>.testSendToReceiveFrom
 class CppUnit::TestCaller<class ICMPSocketTest>.testMTU
 class CppUnit::TestCaller<class HTTPSClientSessionTest>.testCachedSession
-class CppUnit::TestCaller<class PollSetTest>.testPollClosedServer