Skip to content

Commit f50c710

Browse files
committed
refactor: move CConnman::(Un)registerEvents to ETE
1 parent 3a9f386 commit f50c710

File tree

4 files changed

+97
-79
lines changed

4 files changed

+97
-79
lines changed

src/net.cpp

Lines changed: 15 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,9 @@ void CNode::CloseSocketDisconnect(CConnman* connman)
563563
}
564564
}
565565

566-
connman->UnregisterEvents(this);
566+
if (connman->m_edge_trig_events && !connman->m_edge_trig_events->UnregisterEvents(hSocket)) {
567+
LogPrint(BCLog::NET, "EdgeTriggeredEvents::UnregisterEvents() failed\n");
568+
}
567569

568570
LogPrint(BCLog::NET, "disconnecting peer=%d\n", id);
569571
CloseSocket(hSocket);
@@ -1276,7 +1278,12 @@ void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
12761278
LOCK(m_nodes_mutex);
12771279
m_nodes.push_back(pnode);
12781280
WITH_LOCK(cs_mapSocketToNode, mapSocketToNode.emplace(hSocket, pnode));
1279-
RegisterEvents(pnode);
1281+
if (m_edge_trig_events) {
1282+
LOCK(pnode->cs_hSocket);
1283+
if (!m_edge_trig_events->RegisterEvents(pnode->hSocket)) {
1284+
LogPrint(BCLog::NET, "EdgeTriggeredEvents::RegisterEvents() failed\n");
1285+
}
1286+
}
12801287
WakeSelect();
12811288
}
12821289

@@ -2980,7 +2987,12 @@ void CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai
29802987
{
29812988
LOCK(m_nodes_mutex);
29822989
m_nodes.push_back(pnode);
2983-
RegisterEvents(pnode);
2990+
if (m_edge_trig_events) {
2991+
LOCK(pnode->cs_hSocket);
2992+
if (!m_edge_trig_events->RegisterEvents(pnode->hSocket)) {
2993+
LogPrint(BCLog::NET, "EdgeTriggeredEvents::RegisterEvents() failed\n");
2994+
}
2995+
}
29842996
WakeSelect();
29852997
}
29862998
}
@@ -4193,79 +4205,6 @@ uint64_t CConnman::CalculateKeyedNetGroup(const CAddress& ad) const
41934205
return GetDeterministicRandomizer(RANDOMIZER_ID_NETGROUP).Write(vchNetGroup.data(), vchNetGroup.size()).Finalize();
41944206
}
41954207

4196-
void CConnman::RegisterEvents(CNode *pnode)
4197-
{
4198-
#ifdef USE_KQUEUE
4199-
if (socketEventsMode == SocketEventsMode::KQueue) {
4200-
LOCK(pnode->cs_hSocket);
4201-
assert(pnode->hSocket != INVALID_SOCKET);
4202-
4203-
struct kevent events[2];
4204-
EV_SET(&events[0], pnode->hSocket, EVFILT_READ, EV_ADD, 0, 0, nullptr);
4205-
EV_SET(&events[1], pnode->hSocket, EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, nullptr);
4206-
4207-
int r = kevent(Assert(m_edge_trig_events)->m_fd, events, 2, nullptr, 0, nullptr);
4208-
if (r != 0) {
4209-
LogPrint(BCLog::NET, "%s -- kevent(%d, %d, %d, ...) failed. error: %s\n", __func__,
4210-
m_edge_trig_events->m_fd, EV_ADD, pnode->hSocket, NetworkErrorString(WSAGetLastError()));
4211-
}
4212-
}
4213-
#endif
4214-
#ifdef USE_EPOLL
4215-
if (socketEventsMode == SocketEventsMode::EPoll) {
4216-
LOCK(pnode->cs_hSocket);
4217-
assert(pnode->hSocket != INVALID_SOCKET);
4218-
4219-
epoll_event e;
4220-
// We're using edge-triggered mode, so it's important that we drain sockets even if no signals come in
4221-
e.events = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLERR | EPOLLHUP;
4222-
e.data.fd = pnode->hSocket;
4223-
4224-
int r = epoll_ctl(Assert(m_edge_trig_events)->m_fd, EPOLL_CTL_ADD, pnode->hSocket, &e);
4225-
if (r != 0) {
4226-
LogPrint(BCLog::NET, "%s -- epoll_ctl(%d, %d, %d, ...) failed. error: %s\n", __func__,
4227-
m_edge_trig_events->m_fd, EPOLL_CTL_ADD, pnode->hSocket, NetworkErrorString(WSAGetLastError()));
4228-
}
4229-
}
4230-
#endif
4231-
}
4232-
4233-
void CConnman::UnregisterEvents(CNode *pnode)
4234-
{
4235-
#ifdef USE_KQUEUE
4236-
if (socketEventsMode == SocketEventsMode::KQueue) {
4237-
AssertLockHeld(pnode->cs_hSocket);
4238-
if (pnode->hSocket == INVALID_SOCKET) {
4239-
return;
4240-
}
4241-
4242-
struct kevent events[2];
4243-
EV_SET(&events[0], pnode->hSocket, EVFILT_READ, EV_DELETE, 0, 0, nullptr);
4244-
EV_SET(&events[1], pnode->hSocket, EVFILT_WRITE, EV_DELETE, 0, 0, nullptr);
4245-
4246-
int r = kevent(Assert(m_edge_trig_events)->m_fd, events, 2, nullptr, 0, nullptr);
4247-
if (r != 0) {
4248-
LogPrint(BCLog::NET, "%s -- kevent(%d, %d, %d, ...) failed. error: %s\n", __func__,
4249-
m_edge_trig_events->m_fd, EV_DELETE, pnode->hSocket, NetworkErrorString(WSAGetLastError()));
4250-
}
4251-
}
4252-
#endif
4253-
#ifdef USE_EPOLL
4254-
if (socketEventsMode == SocketEventsMode::EPoll) {
4255-
AssertLockHeld(pnode->cs_hSocket);
4256-
if (pnode->hSocket == INVALID_SOCKET) {
4257-
return;
4258-
}
4259-
4260-
int r = epoll_ctl(Assert(m_edge_trig_events)->m_fd, EPOLL_CTL_DEL, pnode->hSocket, nullptr);
4261-
if (r != 0) {
4262-
LogPrint(BCLog::NET, "%s -- epoll_ctl(%d, %d, %d, ...) failed. error: %s\n", __func__,
4263-
m_edge_trig_events->m_fd, EPOLL_CTL_DEL, pnode->hSocket, NetworkErrorString(WSAGetLastError()));
4264-
}
4265-
}
4266-
#endif
4267-
}
4268-
42694208
void CaptureMessageToFile(const CAddress& addr,
42704209
const std::string& msg_type,
42714210
Span<const unsigned char> data,

src/net.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,9 +1371,6 @@ friend class CNode;
13711371
// Whether the node should be passed out in ForEach* callbacks
13721372
static bool NodeFullyConnected(const CNode* pnode);
13731373

1374-
void RegisterEvents(CNode* pnode);
1375-
void UnregisterEvents(CNode* pnode);
1376-
13771374
// Network usage totals
13781375
mutable Mutex m_total_bytes_sent_mutex;
13791376
std::atomic<uint64_t> nTotalBytesRecv{0};

src/util/edge.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,80 @@ bool EdgeTriggeredEvents::RemoveSocket(SOCKET socket) const
125125
}
126126
return true;
127127
}
128+
129+
bool EdgeTriggeredEvents::RegisterEvents(SOCKET socket) const
130+
{
131+
assert(m_valid && socket != INVALID_SOCKET);
132+
133+
if (m_mode == SocketEventsMode::EPoll) {
134+
#ifdef USE_EPOLL
135+
epoll_event e;
136+
// We're using edge-triggered mode, so it's important that we drain sockets even if no signals come in
137+
e.events = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLERR | EPOLLHUP;
138+
e.data.fd = socket;
139+
140+
if (epoll_ctl(m_fd, EPOLL_CTL_ADD, socket, &e) != 0) {
141+
LogPrintf("Failed to register events for socket -- epoll_ctl(%d, %d, %d, ...) returned error: %s\n",
142+
m_fd, EPOLL_CTL_ADD, socket, NetworkErrorString(WSAGetLastError()));
143+
return false;
144+
}
145+
#else
146+
assert(false);
147+
#endif /* USE_EPOLL */
148+
} else if (m_mode == SocketEventsMode::KQueue) {
149+
#ifdef USE_KQUEUE
150+
struct kevent events[2];
151+
EV_SET(&events[0], socket, EVFILT_READ, EV_ADD, 0, 0, nullptr);
152+
EV_SET(&events[1], socket, EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, nullptr);
153+
154+
if (kevent(m_fd, events, 2, nullptr, 0, nullptr) != 0) {
155+
LogPrintf("Failed to register events for socket -- kevent(%d, %d, %d, ...) returned error: %s\n",
156+
m_fd, EV_ADD, socket, NetworkErrorString(WSAGetLastError()));
157+
return false;
158+
}
159+
#else
160+
assert(false);
161+
#endif /* USE_KQUEUE */
162+
} else {
163+
assert(false);
164+
}
165+
return true;
166+
}
167+
168+
bool EdgeTriggeredEvents::UnregisterEvents(SOCKET socket) const
169+
{
170+
assert(m_valid);
171+
172+
if (socket == INVALID_SOCKET) {
173+
LogPrintf("Cannot unregister events for invalid socket\n");
174+
return false;
175+
}
176+
177+
if (m_mode == SocketEventsMode::EPoll) {
178+
#ifdef USE_EPOLL
179+
if (epoll_ctl(m_fd, EPOLL_CTL_DEL, socket, nullptr) != 0) {
180+
LogPrintf("Failed to unregister events for socket -- epoll_ctl(%d, %d, %d, ...) returned error: %s\n",
181+
m_fd, EPOLL_CTL_DEL, socket, NetworkErrorString(WSAGetLastError()));
182+
return false;
183+
}
184+
#else
185+
assert(false);
186+
#endif /* USE_EPOLL */
187+
} else if (m_mode == SocketEventsMode::KQueue) {
188+
#ifdef USE_KQUEUE
189+
struct kevent events[2];
190+
EV_SET(&events[0], socket, EVFILT_READ, EV_DELETE, 0, 0, nullptr);
191+
EV_SET(&events[1], socket, EVFILT_WRITE, EV_DELETE, 0, 0, nullptr);
192+
if (kevent(m_fd, events, 2, nullptr, 0, nullptr) != 0) {
193+
LogPrintf("Failed to unregister events for socket -- kevent(%d, %d, %d, ...) returned error: %s\n",
194+
m_fd, EV_DELETE, socket, NetworkErrorString(WSAGetLastError()));
195+
return false;
196+
}
197+
#else
198+
assert(false);
199+
#endif /* USE_KQUEUE */
200+
} else {
201+
assert(false);
202+
}
203+
return true;
204+
}

src/util/edge.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ class EdgeTriggeredEvents
2828

2929
bool IsValid() const { return m_valid; }
3030

31+
/* Register events for socket */
32+
bool RegisterEvents(SOCKET socket) const;
33+
/* Unregister events for socket */
34+
bool UnregisterEvents(SOCKET socket) const;
35+
3136
public:
3237
/* File descriptor used to interact with events mode */
3338
int m_fd{-1};

0 commit comments

Comments
 (0)