net: rearrange so that socket accesses can be grouped together

This commit is contained in:
Cory Fields 2017-02-06 13:47:24 -05:00
parent 02464da5e4
commit 45e2e08561
1 changed files with 23 additions and 14 deletions

View File

@ -1152,9 +1152,6 @@ void CConnman::ThreadSocketHandler()
{ {
if (pnode->hSocket == INVALID_SOCKET) if (pnode->hSocket == INVALID_SOCKET)
continue; continue;
FD_SET(pnode->hSocket, &fdsetError);
hSocketMax = std::max(hSocketMax, pnode->hSocket);
have_fds = true;
// Implement the following logic: // Implement the following logic:
// * If there is data to send, select() for sending data. As this only // * If there is data to send, select() for sending data. As this only
@ -1166,16 +1163,24 @@ void CConnman::ThreadSocketHandler()
// receiving data. // receiving data.
// * Hand off all complete messages to the processor, to be handled without // * Hand off all complete messages to the processor, to be handled without
// blocking here. // blocking here.
bool select_recv = !pnode->fPauseRecv;
bool select_send;
{ {
LOCK(pnode->cs_vSend); LOCK(pnode->cs_vSend);
if (!pnode->vSendMsg.empty()) { select_send = !pnode->vSendMsg.empty();
FD_SET(pnode->hSocket, &fdsetSend);
continue;
}
} }
{
if (!pnode->fPauseRecv) FD_SET(pnode->hSocket, &fdsetError);
FD_SET(pnode->hSocket, &fdsetRecv); hSocketMax = std::max(hSocketMax, pnode->hSocket);
have_fds = true;
if (select_send) {
FD_SET(pnode->hSocket, &fdsetSend);
continue;
}
if (select_recv) {
FD_SET(pnode->hSocket, &fdsetRecv);
} }
} }
} }
@ -1229,9 +1234,15 @@ void CConnman::ThreadSocketHandler()
// //
// Receive // Receive
// //
bool recvSet = false;
bool sendSet = false;
bool errorSet = false;
if (pnode->hSocket == INVALID_SOCKET) if (pnode->hSocket == INVALID_SOCKET)
continue; continue;
if (FD_ISSET(pnode->hSocket, &fdsetRecv) || FD_ISSET(pnode->hSocket, &fdsetError)) recvSet = FD_ISSET(pnode->hSocket, &fdsetRecv);
sendSet = FD_ISSET(pnode->hSocket, &fdsetSend);
errorSet = FD_ISSET(pnode->hSocket, &fdsetError);
if (recvSet || errorSet)
{ {
{ {
{ {
@ -1286,9 +1297,7 @@ void CConnman::ThreadSocketHandler()
// //
// Send // Send
// //
if (pnode->hSocket == INVALID_SOCKET) if (sendSet)
continue;
if (FD_ISSET(pnode->hSocket, &fdsetSend))
{ {
LOCK(pnode->cs_vSend); LOCK(pnode->cs_vSend);
size_t nBytes = SocketSendData(pnode); size_t nBytes = SocketSendData(pnode);