Skip to content

Commit ed7d976

Browse files
committed
refactor: move wakeup pipe (de)registration to ETE
1 parent f50c710 commit ed7d976

File tree

3 files changed

+62
-50
lines changed

3 files changed

+62
-50
lines changed

src/net.cpp

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3385,31 +3385,9 @@ bool CConnman::Start(CDeterministicMNManager& dmnman, CMasternodeMetaMan& mn_met
33853385
if (fcntl(wakeupPipe[1], F_SETFL, fFlags | O_NONBLOCK) == -1) {
33863386
LogPrint(BCLog::NET, "fcntl for O_NONBLOCK on wakeupPipe failed\n");
33873387
}
3388-
#ifdef USE_KQUEUE
3389-
if (socketEventsMode == SocketEventsMode::KQueue) {
3390-
struct kevent event;
3391-
EV_SET(&event, wakeupPipe[0], EVFILT_READ, EV_ADD, 0, 0, nullptr);
3392-
int r = kevent(Assert(m_edge_trig_events)->m_fd, &event, 1, nullptr, 0, nullptr);
3393-
if (r != 0) {
3394-
LogPrint(BCLog::NET, "%s -- kevent(%d, %d, %d, ...) failed. error: %s\n", __func__,
3395-
m_edge_trig_events->m_fd, EV_ADD, wakeupPipe[0], NetworkErrorString(WSAGetLastError()));
3396-
return false;
3397-
}
3388+
if (m_edge_trig_events && !m_edge_trig_events->RegisterPipe(wakeupPipe[0])) {
3389+
LogPrint(BCLog::NET, "EdgeTriggeredEvents::RegisterPipe() failed\n");
33983390
}
3399-
#endif
3400-
#ifdef USE_EPOLL
3401-
if (socketEventsMode == SocketEventsMode::EPoll) {
3402-
epoll_event event;
3403-
event.events = EPOLLIN;
3404-
event.data.fd = wakeupPipe[0];
3405-
int r = epoll_ctl(Assert(m_edge_trig_events)->m_fd, EPOLL_CTL_ADD, wakeupPipe[0], &event);
3406-
if (r != 0) {
3407-
LogPrint(BCLog::NET, "%s -- epoll_ctl(%d, %d, %d, ...) failed. error: %s\n", __func__,
3408-
m_edge_trig_events->m_fd, EPOLL_CTL_ADD, wakeupPipe[0], NetworkErrorString(WSAGetLastError()));
3409-
return false;
3410-
}
3411-
}
3412-
#endif
34133391
}
34143392
#endif
34153393

@@ -3578,24 +3556,14 @@ void CConnman::StopNodes()
35783556
semOutbound.reset();
35793557
semAddnode.reset();
35803558

3581-
#ifdef USE_KQUEUE
3582-
if (socketEventsMode == SocketEventsMode::KQueue && Assert(m_edge_trig_events)->m_fd != -1) {
3559+
if (m_edge_trig_events) {
35833560
#ifdef USE_WAKEUP_PIPE
3584-
struct kevent event;
3585-
EV_SET(&event, wakeupPipe[0], EVFILT_READ, EV_DELETE, 0, 0, nullptr);
3586-
kevent(m_edge_trig_events->m_fd, &event, 1, nullptr, 0, nullptr);
3587-
#endif
3588-
m_edge_trig_events.reset();
3589-
}
3590-
#endif
3591-
#ifdef USE_EPOLL
3592-
if (socketEventsMode == SocketEventsMode::EPoll && Assert(m_edge_trig_events)->m_fd != -1) {
3593-
#ifdef USE_WAKEUP_PIPE
3594-
epoll_ctl(m_edge_trig_events->m_fd, EPOLL_CTL_DEL, wakeupPipe[0], nullptr);
3561+
if (!m_edge_trig_events->UnregisterPipe(wakeupPipe[0])) {
3562+
LogPrintf("EdgeTriggeredEvents::UnregisterPipe() failed\n");
3563+
}
35953564
#endif
35963565
m_edge_trig_events.reset();
35973566
}
3598-
#endif
35993567

36003568
#ifdef USE_WAKEUP_PIPE
36013569
if (wakeupPipe[0] != -1) close(wakeupPipe[0]);

src/util/edge.cpp

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,17 @@ EdgeTriggeredEvents::~EdgeTriggeredEvents()
5959
}
6060
}
6161

62-
bool EdgeTriggeredEvents::AddSocket(SOCKET socket) const
62+
bool EdgeTriggeredEvents::RegisterEntity(int entity, std::string entity_name) const
6363
{
6464
assert(m_valid);
6565

6666
if (m_mode == SocketEventsMode::EPoll) {
6767
#ifdef USE_EPOLL
6868
epoll_event event;
69-
event.data.fd = socket;
69+
event.data.fd = entity;
7070
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",
71+
if (epoll_ctl(m_fd, EPOLL_CTL_ADD, entity, &event) != 0) {
72+
LogPrintf("Failed to add %s to epoll fd (epoll_ctl returned error %s)\n", entity_name,
7373
NetworkErrorString(WSAGetLastError()));
7474
return false;
7575
}
@@ -79,9 +79,9 @@ bool EdgeTriggeredEvents::AddSocket(SOCKET socket) const
7979
} else if (m_mode == SocketEventsMode::KQueue) {
8080
#ifdef USE_KQUEUE
8181
struct kevent event;
82-
EV_SET(&event, socket, EVFILT_READ, EV_ADD, 0, 0, nullptr);
82+
EV_SET(&event, entity, EVFILT_READ, EV_ADD, 0, 0, nullptr);
8383
if (kevent(m_fd, &event, 1, nullptr, 0, nullptr) != 0) {
84-
LogPrintf("Failed to add socket to kqueue fd (kevent returned error %s)\n",
84+
LogPrintf("Failed to add %s to kqueue fd (kevent returned error %s)\n", entity_name,
8585
NetworkErrorString(WSAGetLastError()));
8686
return false;
8787
}
@@ -94,14 +94,14 @@ bool EdgeTriggeredEvents::AddSocket(SOCKET socket) const
9494
return true;
9595
}
9696

97-
bool EdgeTriggeredEvents::RemoveSocket(SOCKET socket) const
97+
bool EdgeTriggeredEvents::UnregisterEntity(int entity, std::string entity_name) const
9898
{
9999
assert(m_valid);
100100

101101
if (m_mode == SocketEventsMode::EPoll) {
102102
#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",
103+
if (epoll_ctl(m_fd, EPOLL_CTL_DEL, entity, nullptr) != 0) {
104+
LogPrintf("Failed to remove %s from epoll fd (epoll_ctl returned error %s)\n", entity_name,
105105
NetworkErrorString(WSAGetLastError()));
106106
return false;
107107
}
@@ -111,9 +111,9 @@ bool EdgeTriggeredEvents::RemoveSocket(SOCKET socket) const
111111
} else if (m_mode == SocketEventsMode::KQueue) {
112112
#ifdef USE_KQUEUE
113113
struct kevent event;
114-
EV_SET(&event, socket, EVFILT_READ, EV_DELETE, 0, 0, nullptr);
114+
EV_SET(&event, entity, EVFILT_READ, EV_DELETE, 0, 0, nullptr);
115115
if (kevent(m_fd, &event, 1, nullptr, 0, nullptr) != 0) {
116-
LogPrintf("Failed to remove socket from kqueue fd (kevent returned error %s)\n",
116+
LogPrintf("Failed to remove %s from kqueue fd (kevent returned error %s)\n", entity_name,
117117
NetworkErrorString(WSAGetLastError()));
118118
return false;
119119
}
@@ -126,6 +126,38 @@ bool EdgeTriggeredEvents::RemoveSocket(SOCKET socket) const
126126
return true;
127127
}
128128

129+
bool EdgeTriggeredEvents::AddSocket(SOCKET socket) const
130+
{
131+
return RegisterEntity(socket, "socket");
132+
}
133+
134+
bool EdgeTriggeredEvents::RemoveSocket(SOCKET socket) const
135+
{
136+
return UnregisterEntity(socket, "socket");
137+
}
138+
139+
bool EdgeTriggeredEvents::RegisterPipe(int wakeup_pipe)
140+
{
141+
if (m_pipe_registered) {
142+
LogPrintf("Pipe already registered, ignoring new registration request\n");
143+
return false;
144+
}
145+
bool ret = RegisterEntity(wakeup_pipe, "wakeup pipe");
146+
if (ret) m_pipe_registered = true;
147+
return ret;
148+
}
149+
150+
bool EdgeTriggeredEvents::UnregisterPipe(int wakeup_pipe)
151+
{
152+
if (!m_pipe_registered) {
153+
LogPrintf("No pipe currently registered to unregister, ignoring request\n");
154+
return false;
155+
}
156+
bool ret = UnregisterEntity(wakeup_pipe, "wakeup pipe");
157+
if (ret) m_pipe_registered = false;
158+
return ret;
159+
}
160+
129161
bool EdgeTriggeredEvents::RegisterEvents(SOCKET socket) const
130162
{
131163
assert(m_valid && socket != INVALID_SOCKET);

src/util/edge.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <compat.h>
99

1010
#include <cstdint>
11+
#include <string>
1112

1213
enum class SocketEventsMode : int8_t;
1314

@@ -21,23 +22,34 @@ class EdgeTriggeredEvents
2122
explicit EdgeTriggeredEvents(SocketEventsMode events_mode);
2223
~EdgeTriggeredEvents();
2324

25+
bool IsValid() const { return m_valid; }
26+
2427
/* Add socket to interest list */
2528
bool AddSocket(SOCKET socket) const;
2629
/* Remove socket from interest list */
2730
bool RemoveSocket(SOCKET socket) const;
2831

29-
bool IsValid() const { return m_valid; }
32+
/* Register wakeup pipe with EdgeTriggeredEvents instance */
33+
bool RegisterPipe(int wakeup_pipe);
34+
/* Unregister wakeup pipe with EdgeTriggeredEvents instance */
35+
bool UnregisterPipe(int wakeup_pipe);
3036

3137
/* Register events for socket */
3238
bool RegisterEvents(SOCKET socket) const;
3339
/* Unregister events for socket */
3440
bool UnregisterEvents(SOCKET socket) const;
3541

42+
private:
43+
bool RegisterEntity(int entity, std::string entity_name) const;
44+
bool UnregisterEntity(int entity, std::string entity_name) const;
45+
3646
public:
3747
/* File descriptor used to interact with events mode */
3848
int m_fd{-1};
3949

4050
private:
51+
/* Flag set if pipe has been registered with instance */
52+
bool m_pipe_registered{false};
4153
/* Instance validity flag set during construction */
4254
bool m_valid{false};
4355
/* Flag for storing selected socket events mode */

0 commit comments

Comments
 (0)