Skip to content

Commit 3a9f386

Browse files
committed
refactor: move SOCKET addition/removal from interest list to ETE
Additionally, log errors if removal from interest list fails (which is possible if it was already removed or socket is invalid).
1 parent 212df06 commit 3a9f386

File tree

3 files changed

+81
-35
lines changed

3 files changed

+81
-35
lines changed

src/net.cpp

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3132,30 +3132,10 @@ bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError,
31323132
return false;
31333133
}
31343134

3135-
#ifdef USE_KQUEUE
3136-
if (socketEventsMode == SocketEventsMode::KQueue) {
3137-
struct kevent event;
3138-
EV_SET(&event, sock->Get(), EVFILT_READ, EV_ADD, 0, 0, nullptr);
3139-
if (kevent(Assert(m_edge_trig_events)->m_fd, &event, 1, nullptr, 0, nullptr) != 0) {
3140-
strError = strprintf(_("Error: failed to add socket to kqueue fd (kevent returned error %s)"), NetworkErrorString(WSAGetLastError()));
3141-
LogPrintf("%s\n", strError.original);
3142-
return false;
3143-
}
3144-
}
3145-
#endif
3146-
3147-
#ifdef USE_EPOLL
3148-
if (socketEventsMode == SocketEventsMode::EPoll) {
3149-
epoll_event event;
3150-
event.data.fd = sock->Get();
3151-
event.events = EPOLLIN;
3152-
if (epoll_ctl(Assert(m_edge_trig_events)->m_fd, EPOLL_CTL_ADD, sock->Get(), &event) != 0) {
3153-
strError = strprintf(_("Error: failed to add socket to epoll fd (epoll_ctl returned error %s)"), NetworkErrorString(WSAGetLastError()));
3154-
LogPrintf("%s\n", strError.original);
3155-
return false;
3156-
}
3135+
if (m_edge_trig_events && !m_edge_trig_events->AddSocket(sock->Get())) {
3136+
LogPrintf("Error: EdgeTriggeredEvents::AddSocket() failed\n");
3137+
return false;
31573138
}
3158-
#endif
31593139

31603140
vhListenSocket.push_back(ListenSocket(sock->Release(), permissions));
31613141

@@ -3553,23 +3533,15 @@ void CConnman::StopNodes()
35533533
for (CNode *pnode : m_nodes)
35543534
pnode->CloseSocketDisconnect(this);
35553535
}
3556-
for (ListenSocket& hListenSocket : vhListenSocket)
3536+
for (ListenSocket& hListenSocket : vhListenSocket) {
35573537
if (hListenSocket.socket != INVALID_SOCKET) {
3558-
#ifdef USE_KQUEUE
3559-
if (socketEventsMode == SocketEventsMode::KQueue) {
3560-
struct kevent event;
3561-
EV_SET(&event, hListenSocket.socket, EVFILT_READ, EV_DELETE, 0, 0, nullptr);
3562-
kevent(Assert(m_edge_trig_events)->m_fd, &event, 1, nullptr, 0, nullptr);
3538+
if (m_edge_trig_events && !m_edge_trig_events->RemoveSocket(hListenSocket.socket)) {
3539+
LogPrintf("EdgeTriggeredEvents::RemoveSocket() failed\n");
35633540
}
3564-
#endif
3565-
#ifdef USE_EPOLL
3566-
if (socketEventsMode == SocketEventsMode::EPoll) {
3567-
epoll_ctl(Assert(m_edge_trig_events)->m_fd, EPOLL_CTL_DEL, hListenSocket.socket, nullptr);
3568-
}
3569-
#endif
35703541
if (!CloseSocket(hListenSocket.socket))
35713542
LogPrintf("CloseSocket(hListenSocket) failed with error %s\n", NetworkErrorString(WSAGetLastError()));
35723543
}
3544+
}
35733545

35743546
// clean up some globals (to help leak detection)
35753547
std::vector<CNode*> nodes;

src/util/edge.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,70 @@ EdgeTriggeredEvents::~EdgeTriggeredEvents()
5858
#endif /* defined(USE_KQUEUE) || defined(USE_EPOLL) */
5959
}
6060
}
61+
62+
bool EdgeTriggeredEvents::AddSocket(SOCKET socket) const
63+
{
64+
assert(m_valid);
65+
66+
if (m_mode == SocketEventsMode::EPoll) {
67+
#ifdef USE_EPOLL
68+
epoll_event event;
69+
event.data.fd = socket;
70+
event.events = EPOLLIN;
71+
if (epoll_ctl(m_fd, EPOLL_CTL_ADD, socket, &event) != 0) {
72+
LogPrintf("Failed to add socket to epoll fd (epoll_ctl returned error %s)\n",
73+
NetworkErrorString(WSAGetLastError()));
74+
return false;
75+
}
76+
#else
77+
assert(false);
78+
#endif /* USE_EPOLL */
79+
} else if (m_mode == SocketEventsMode::KQueue) {
80+
#ifdef USE_KQUEUE
81+
struct kevent event;
82+
EV_SET(&event, socket, EVFILT_READ, EV_ADD, 0, 0, nullptr);
83+
if (kevent(m_fd, &event, 1, nullptr, 0, nullptr) != 0) {
84+
LogPrintf("Failed to add socket to kqueue fd (kevent returned error %s)\n",
85+
NetworkErrorString(WSAGetLastError()));
86+
return false;
87+
}
88+
#else
89+
assert(false);
90+
#endif /* USE_KQUEUE */
91+
} else {
92+
assert(false);
93+
}
94+
return true;
95+
}
96+
97+
bool EdgeTriggeredEvents::RemoveSocket(SOCKET socket) const
98+
{
99+
assert(m_valid);
100+
101+
if (m_mode == SocketEventsMode::EPoll) {
102+
#ifdef USE_EPOLL
103+
if (epoll_ctl(m_fd, EPOLL_CTL_DEL, socket, nullptr) != 0) {
104+
LogPrintf("Failed to remove socket from epoll fd (epoll_ctl returned error %s)\n",
105+
NetworkErrorString(WSAGetLastError()));
106+
return false;
107+
}
108+
#else
109+
assert(false);
110+
#endif /* USE_EPOLL */
111+
} else if (m_mode == SocketEventsMode::KQueue) {
112+
#ifdef USE_KQUEUE
113+
struct kevent event;
114+
EV_SET(&event, socket, EVFILT_READ, EV_DELETE, 0, 0, nullptr);
115+
if (kevent(m_fd, &event, 1, nullptr, 0, nullptr) != 0) {
116+
LogPrintf("Failed to remove socket from kqueue fd (kevent returned error %s)\n",
117+
NetworkErrorString(WSAGetLastError()));
118+
return false;
119+
}
120+
#else
121+
assert(false);
122+
#endif /* USE_KQUEUE */
123+
} else {
124+
assert(false);
125+
}
126+
return true;
127+
}

src/util/edge.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#ifndef BITCOIN_UTIL_EDGE_H
66
#define BITCOIN_UTIL_EDGE_H
77

8+
#include <compat.h>
9+
810
#include <cstdint>
911

1012
enum class SocketEventsMode : int8_t;
@@ -19,6 +21,11 @@ class EdgeTriggeredEvents
1921
explicit EdgeTriggeredEvents(SocketEventsMode events_mode);
2022
~EdgeTriggeredEvents();
2123

24+
/* Add socket to interest list */
25+
bool AddSocket(SOCKET socket) const;
26+
/* Remove socket from interest list */
27+
bool RemoveSocket(SOCKET socket) const;
28+
2229
bool IsValid() const { return m_valid; }
2330

2431
public:

0 commit comments

Comments
 (0)