net: rearrange so that socket accesses can be grouped together
This commit is contained in:
parent
02464da5e4
commit
45e2e08561
1 changed files with 23 additions and 14 deletions
31
src/net.cpp
31
src/net.cpp
|
@ -1152,9 +1152,6 @@ void CConnman::ThreadSocketHandler()
|
|||
{
|
||||
if (pnode->hSocket == INVALID_SOCKET)
|
||||
continue;
|
||||
FD_SET(pnode->hSocket, &fdsetError);
|
||||
hSocketMax = std::max(hSocketMax, pnode->hSocket);
|
||||
have_fds = true;
|
||||
|
||||
// Implement the following logic:
|
||||
// * If there is data to send, select() for sending data. As this only
|
||||
|
@ -1166,15 +1163,23 @@ void CConnman::ThreadSocketHandler()
|
|||
// receiving data.
|
||||
// * Hand off all complete messages to the processor, to be handled without
|
||||
// blocking here.
|
||||
|
||||
bool select_recv = !pnode->fPauseRecv;
|
||||
bool select_send;
|
||||
{
|
||||
LOCK(pnode->cs_vSend);
|
||||
if (!pnode->vSendMsg.empty()) {
|
||||
select_send = !pnode->vSendMsg.empty();
|
||||
}
|
||||
|
||||
FD_SET(pnode->hSocket, &fdsetError);
|
||||
hSocketMax = std::max(hSocketMax, pnode->hSocket);
|
||||
have_fds = true;
|
||||
|
||||
if (select_send) {
|
||||
FD_SET(pnode->hSocket, &fdsetSend);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
{
|
||||
if (!pnode->fPauseRecv)
|
||||
if (select_recv) {
|
||||
FD_SET(pnode->hSocket, &fdsetRecv);
|
||||
}
|
||||
}
|
||||
|
@ -1229,9 +1234,15 @@ void CConnman::ThreadSocketHandler()
|
|||
//
|
||||
// Receive
|
||||
//
|
||||
bool recvSet = false;
|
||||
bool sendSet = false;
|
||||
bool errorSet = false;
|
||||
if (pnode->hSocket == INVALID_SOCKET)
|
||||
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
|
||||
//
|
||||
if (pnode->hSocket == INVALID_SOCKET)
|
||||
continue;
|
||||
if (FD_ISSET(pnode->hSocket, &fdsetSend))
|
||||
if (sendSet)
|
||||
{
|
||||
LOCK(pnode->cs_vSend);
|
||||
size_t nBytes = SocketSendData(pnode);
|
||||
|
|
Loading…
Reference in a new issue