blob: 0339d0ca87042e15fd2f1f5cf1812c48fcbf11ed [file] [edit]
diff --git a/Source/core/SocketPort.cpp b/Source/core/SocketPort.cpp
index 3ef900db..768cc1a8 100644
--- a/Source/core/SocketPort.cpp
+++ b/Source/core/SocketPort.cpp
@@ -274,6 +274,8 @@ namespace WPEFramework {
::closesocket(socket);
#endif
+ TRACE_L3("Socket %u destroyed", static_cast<uint32_t>(socket));
+
socket = INVALID_SOCKET;
}
@@ -282,7 +284,7 @@ namespace WPEFramework {
#ifdef __WINDOWS__
unsigned long l_Value = 1;
if (ioctlsocket(socket, FIONBIO, &l_Value) != 0) {
- TRACE_L1("Error on port socket NON_BLOCKING call. Error %d", __ERRORRESULT__);
+ TRACE_L5("Error on port socket NON_BLOCKING call. Error %d", __ERRORRESULT__);
}
else {
return (true);
@@ -398,6 +400,8 @@ namespace WPEFramework {
BufferAlignment(m_Socket);
m_State.store(SocketPort::LINK | SocketPort::OPEN | SocketPort::READ, Core::memory_order::memory_order_relaxed);
+
+ TRACE_L3("Socket %u constructed", m_Socket);
}
}
@@ -409,6 +413,8 @@ namespace WPEFramework {
// the virtuals might be called, which are destructed at this point !!!!
ASSERT((m_Socket == INVALID_SOCKET) || (IsClosed()));
+ TRACE_L3("Socket %u constructed", static_cast<uint32_t>(m_Socket));
+
if (m_Socket != INVALID_SOCKET) {
DestroySocket(m_Socket);
}
@@ -504,7 +510,7 @@ namespace WPEFramework {
}
else if (m_SocketType == LISTEN) {
if (::listen(m_Socket, MAX_LISTEN_QUEUE) == SOCKET_ERROR) {
- TRACE_L5("Error on port socket LISTEN. Error %d", __ERRORRESULT__);
+ TRACE_L1("Error on port socket LISTEN. Error %d", __ERRORRESULT__);
}
else {
// Trigger state to Open
@@ -525,14 +531,17 @@ namespace WPEFramework {
m_State.store(SocketPort::UPDATE | SocketPort::LINK | SocketPort::WRITE, Core::memory_order::memory_order_relaxed);
nStatus = Core::ERROR_INPROGRESS;
}
- else if (l_Result == __ERROR_ISCONN__) {
- nStatus = Core::ERROR_ALREADY_CONNECTED;
- }
- else if (l_Result == __ERROR_NETWORK_UNREACHABLE__) {
- nStatus = Core::ERROR_UNREACHABLE_NETWORK;
- }
else {
- nStatus = Core::ERROR_ASYNC_FAILED;
+ if (l_Result == __ERROR_ISCONN__) {
+ nStatus = Core::ERROR_ALREADY_CONNECTED;
+ }
+ else if (l_Result == __ERROR_NETWORK_UNREACHABLE__) {
+ nStatus = Core::ERROR_UNREACHABLE_NETWORK;
+ }
+ else {
+ nStatus = Core::ERROR_ASYNC_FAILED;
+ }
+
TRACE_L1("Error on socket connect. Error %d", __ERRORRESULT__);
}
}
@@ -580,6 +589,8 @@ namespace WPEFramework {
if ((m_State != 0) && ((m_State & SHUTDOWN) == 0)) {
+ TRACE_L3("Closing socket %u...", static_cast<uint32_t>(m_Socket));
+
if ((m_State & (LINK | OPEN)) != (LINK | OPEN)) {
// This is a connectionless link, do not expect a close from the otherside.
// No use to wait on anything !!, Signal a FORCED CLOSURE (EXCEPTION && SHUTDOWN)
@@ -615,6 +626,8 @@ namespace WPEFramework {
ASSERT(closed == true);
}
}
+ } else {
+ TRACE_L3("Socket is already closed and destroyed");
}
m_syncAdmin.Unlock();
@@ -655,7 +668,7 @@ namespace WPEFramework {
// Kernel doubles the buffer size, take that into account.
m_SocketReceiveBufferSize /= 2;
if (origSocketReceiveBufferSize != m_SocketReceiveBufferSize) {
- TRACE_L2("Adjusted socket receive buffer size (%u->%u)", origSocketReceiveBufferSize, m_SocketReceiveBufferSize);
+ TRACE_L3("Adjusted socket receive buffer size (%u->%u)", origSocketReceiveBufferSize, m_SocketReceiveBufferSize);
}
if (m_ReceiveBufferSize == static_cast<uint16_t>(~0)) {
@@ -677,7 +690,7 @@ namespace WPEFramework {
::getsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char*)&m_SocketSendBufferSize, &valueLength);
m_SocketSendBufferSize /= 2;
if (origSocketSendBufferSize != m_SocketSendBufferSize) {
- TRACE_L2("Adjusted socket send buffer size (%u->%u)", origSocketSendBufferSize, m_SocketSendBufferSize);
+ TRACE_L3("Adjusted socket send buffer size (%u->%u)", origSocketSendBufferSize, m_SocketSendBufferSize);
}
if (m_SendBufferSize == static_cast<uint16_t>(~0)) {
@@ -977,7 +990,7 @@ namespace WPEFramework {
#ifdef __WINDOWS__
result = FD_CLOSE;
#else
- result = POLLHUP;
+ result = (POLLHUP | POLLRDHUP);
#endif
}
else if (m_State != 0) {
@@ -1014,7 +1027,7 @@ namespace WPEFramework {
Write();
}
#ifdef __LINUX__
- result |= ((m_State & SocketPort::LINK) != 0 ? POLLHUP : 0) | ((m_State & SocketPort::WRITE) != 0 ? POLLOUT : 0);
+ result |= ((m_State & SocketPort::LINK) != 0 ? (POLLHUP | POLLRDHUP) : 0) | ((m_State & SocketPort::WRITE) != 0 ? POLLOUT : 0);
#endif
}
}
@@ -1053,9 +1066,17 @@ namespace WPEFramework {
#else
if ((flagsSet & POLLHUP) != 0) {
+ TRACE_L3("HUP event received on socket %u", static_cast<uint32_t>(m_Socket));
Closed();
}
- else if (IsListening()) {
+ else if ((flagsSet & POLLRDHUP) != 0) {
+ TRACE_L3("RDHUP event received on socket %u", static_cast<uint32_t>(m_Socket));
+
+ // The other side wants to shut down the connection. Let's do the same then.
+ // Once the connection is shut down in both directions, a HUP event will arrive.
+ Close(0);
+ }
+ else if (IsListening()) {
if ((flagsSet & POLLIN) != 0) {
// This triggeres an Addition of clients
Accepted();
@@ -1303,6 +1324,7 @@ namespace WPEFramework {
m_Socket = result;
m_State = (SocketPort::UPDATE | SocketPort::MONITOR | SocketPort::LINK | SocketPort::OPEN | SocketPort::READ | SocketPort::WRITESLOT);
+ TRACE_L3("Socket %u constructed", static_cast<uint32_t>(m_Socket));
}
return (newConnection);
@@ -1327,7 +1349,7 @@ namespace WPEFramework {
NodeId remoteId;
if (::listen(m_Socket, MAX_LISTEN_QUEUE) == SOCKET_ERROR) {
- TRACE_L5("Error on port socket LISTEN. Error %d", __ERRORRESULT__);
+ TRACE_L1("Error on port socket LISTEN. Error %d", __ERRORRESULT__);
}
else {
// Trigger state to Open