refactor: IArchNetwork turn anonymous enum into PollEventMask struct with set of static values
This commit is contained in:
committed by
Chris Rizzitello
parent
47d44db497
commit
8f6f014bcd
@ -72,12 +72,12 @@ public:
|
||||
Events for \c poll() are bitmasks and can be combined using the
|
||||
bitwise operators.
|
||||
*/
|
||||
enum
|
||||
struct PollEventMask
|
||||
{
|
||||
kPOLLIN = 1, //!< Socket is readable
|
||||
kPOLLOUT = 2, //!< Socket is writable
|
||||
kPOLLERR = 4, //!< The socket is in an error state
|
||||
kPOLLNVAL = 8 //!< The socket is invalid
|
||||
inline static const int In = 1; //!< Socket is readable
|
||||
inline static const int Out = 2; //!< Socket is writable
|
||||
inline static const int Error = 4; //!< The socket is in an error state
|
||||
inline static const int Invalid = 8; //!< The socket is invalid
|
||||
};
|
||||
|
||||
//! A socket query for \c poll()
|
||||
@ -89,8 +89,7 @@ public:
|
||||
|
||||
//! The events to query for
|
||||
/*!
|
||||
The events to query for can be any combination of kPOLLIN and
|
||||
kPOLLOUT.
|
||||
The events to query for can be any combination of PollEventMask::In and PollEventMask::Out.
|
||||
*/
|
||||
unsigned short m_events;
|
||||
|
||||
@ -175,9 +174,9 @@ public:
|
||||
and/or writable (or indefinitely if \c timeout < 0). Returns the
|
||||
number of sockets that were readable (if readability was being
|
||||
queried) or writable (if writablility was being queried) and sets
|
||||
the \c m_revents members of the entries. \c kPOLLERR and \c kPOLLNVAL
|
||||
the \c m_revents members of the entries. \c PollEventMask::Error and \c PollEventMask::Invalid
|
||||
are set in \c m_revents as appropriate. If a socket indicates
|
||||
\c kPOLLERR then \c throwErrorOnSocket() can be used to determine
|
||||
\c PollEventMask::Error then \c throwErrorOnSocket() can be used to determine
|
||||
the type of error. Returns 0 immediately regardless of the \c timeout
|
||||
if no valid sockets are selected for testing.
|
||||
|
||||
|
||||
@ -278,10 +278,10 @@ int ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout)
|
||||
for (int i = 0; i < num; ++i) {
|
||||
pfd[i].fd = (pe[i].m_socket == nullptr) ? -1 : pe[i].m_socket->m_fd;
|
||||
pfd[i].events = 0;
|
||||
if ((pe[i].m_events & kPOLLIN) != 0) {
|
||||
if ((pe[i].m_events & PollEventMask::In) != 0) {
|
||||
pfd[i].events |= POLLIN;
|
||||
}
|
||||
if ((pe[i].m_events & kPOLLOUT) != 0) {
|
||||
if ((pe[i].m_events & PollEventMask::Out) != 0) {
|
||||
pfd[i].events |= POLLOUT;
|
||||
}
|
||||
}
|
||||
@ -328,16 +328,16 @@ int ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout)
|
||||
for (int i = 0; i < num; ++i) {
|
||||
pe[i].m_revents = 0;
|
||||
if ((pfd[i].revents & POLLIN) != 0) {
|
||||
pe[i].m_revents |= kPOLLIN;
|
||||
pe[i].m_revents |= PollEventMask::In;
|
||||
}
|
||||
if ((pfd[i].revents & POLLOUT) != 0) {
|
||||
pe[i].m_revents |= kPOLLOUT;
|
||||
pe[i].m_revents |= PollEventMask::Out;
|
||||
}
|
||||
if ((pfd[i].revents & POLLERR) != 0) {
|
||||
pe[i].m_revents |= kPOLLERR;
|
||||
pe[i].m_revents |= PollEventMask::Error;
|
||||
}
|
||||
if ((pfd[i].revents & POLLNVAL) != 0) {
|
||||
pe[i].m_revents |= kPOLLNVAL;
|
||||
pe[i].m_revents |= PollEventMask::Invalid;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -380,16 +380,16 @@ int ArchNetworkWinsock::pollSocket(PollEntry pe[], int num, double timeout)
|
||||
|
||||
// set invalid flag if socket is bogus then go to next socket
|
||||
if (pe[i].m_socket == nullptr) {
|
||||
pe[i].m_revents |= kPOLLNVAL;
|
||||
pe[i].m_revents |= PollEventMask::Invalid;
|
||||
continue;
|
||||
}
|
||||
|
||||
// select desired events
|
||||
long socketEvents = 0;
|
||||
if ((pe[i].m_events & kPOLLIN) != 0) {
|
||||
if ((pe[i].m_events & PollEventMask::In) != 0) {
|
||||
socketEvents |= FD_READ | FD_ACCEPT | FD_CLOSE;
|
||||
}
|
||||
if ((pe[i].m_events & kPOLLOUT) != 0) {
|
||||
if ((pe[i].m_events & PollEventMask::Out) != 0) {
|
||||
socketEvents |= FD_WRITE | FD_CONNECT | FD_CLOSE;
|
||||
|
||||
// if m_pollWrite is false then we assume the socket is
|
||||
@ -397,7 +397,7 @@ int ArchNetworkWinsock::pollSocket(PollEntry pe[], int num, double timeout)
|
||||
// when the state changes from unwritable.
|
||||
if (!pe[i].m_socket->m_pollWrite) {
|
||||
canWrite = true;
|
||||
pe[i].m_revents |= kPOLLOUT;
|
||||
pe[i].m_revents |= PollEventMask::Out;
|
||||
}
|
||||
}
|
||||
|
||||
@ -462,7 +462,7 @@ int ArchNetworkWinsock::pollSocket(PollEntry pe[], int num, double timeout)
|
||||
}
|
||||
for (i = 0, n = 0; i < num; ++i) {
|
||||
// skip events we didn't check
|
||||
if (pe[i].m_socket == nullptr || (pe[i].m_events & (kPOLLIN | kPOLLOUT)) == 0) {
|
||||
if (pe[i].m_socket == nullptr || (pe[i].m_events & (PollEventMask::In | PollEventMask::Out)) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -472,13 +472,13 @@ int ArchNetworkWinsock::pollSocket(PollEntry pe[], int num, double timeout)
|
||||
continue;
|
||||
}
|
||||
if ((info.lNetworkEvents & FD_READ) != 0) {
|
||||
pe[i].m_revents |= kPOLLIN;
|
||||
pe[i].m_revents |= PollEventMask::In;
|
||||
}
|
||||
if ((info.lNetworkEvents & FD_ACCEPT) != 0) {
|
||||
pe[i].m_revents |= kPOLLIN;
|
||||
pe[i].m_revents |= PollEventMask::In;
|
||||
}
|
||||
if ((info.lNetworkEvents & FD_WRITE) != 0) {
|
||||
pe[i].m_revents |= kPOLLOUT;
|
||||
pe[i].m_revents |= PollEventMask::Out;
|
||||
|
||||
// socket is now writable so don't bothing polling for
|
||||
// writable until it becomes unwritable.
|
||||
@ -486,21 +486,21 @@ int ArchNetworkWinsock::pollSocket(PollEntry pe[], int num, double timeout)
|
||||
}
|
||||
if ((info.lNetworkEvents & FD_CONNECT) != 0) {
|
||||
if (info.iErrorCode[FD_CONNECT_BIT] != 0) {
|
||||
pe[i].m_revents |= kPOLLERR;
|
||||
pe[i].m_revents |= PollEventMask::Error;
|
||||
} else {
|
||||
pe[i].m_revents |= kPOLLOUT;
|
||||
pe[i].m_revents |= PollEventMask::Out;
|
||||
pe[i].m_socket->m_pollWrite = false;
|
||||
}
|
||||
}
|
||||
if ((info.lNetworkEvents & FD_CLOSE) != 0) {
|
||||
if (info.iErrorCode[FD_CLOSE_BIT] != 0) {
|
||||
pe[i].m_revents |= kPOLLERR;
|
||||
pe[i].m_revents |= PollEventMask::Error;
|
||||
} else {
|
||||
if ((pe[i].m_events & kPOLLIN) != 0) {
|
||||
pe[i].m_revents |= kPOLLIN;
|
||||
if ((pe[i].m_events & PollEventMask::In) != 0) {
|
||||
pe[i].m_revents |= PollEventMask::In;
|
||||
}
|
||||
if ((pe[i].m_events & kPOLLOUT) != 0) {
|
||||
pe[i].m_revents |= kPOLLOUT;
|
||||
if ((pe[i].m_events & PollEventMask::Out) != 0) {
|
||||
pe[i].m_revents |= PollEventMask::Out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -152,10 +152,10 @@ void SocketMultiplexer::serviceThread(void *)
|
||||
pfd.m_socket = job->getSocket();
|
||||
pfd.m_events = 0;
|
||||
if (job->isReadable()) {
|
||||
pfd.m_events |= IArchNetwork::kPOLLIN;
|
||||
pfd.m_events |= IArchNetwork::PollEventMask::In;
|
||||
}
|
||||
if (job->isWritable()) {
|
||||
pfd.m_events |= IArchNetwork::kPOLLOUT;
|
||||
pfd.m_events |= IArchNetwork::PollEventMask::Out;
|
||||
}
|
||||
pfds.push_back(pfd);
|
||||
}
|
||||
@ -187,9 +187,10 @@ void SocketMultiplexer::serviceThread(void *)
|
||||
if (*jobCursor != nullptr) {
|
||||
// get poll state
|
||||
unsigned short revents = pfds[i].m_revents;
|
||||
bool read = ((revents & IArchNetwork::kPOLLIN) != 0);
|
||||
bool write = ((revents & IArchNetwork::kPOLLOUT) != 0);
|
||||
bool error = ((revents & (IArchNetwork::kPOLLERR | IArchNetwork::kPOLLNVAL)) != 0);
|
||||
bool read = ((revents & int(IArchNetwork::PollEventMask::In)) != 0);
|
||||
bool write = ((revents & int(IArchNetwork::PollEventMask::Out)) != 0);
|
||||
bool error =
|
||||
((revents & (int(IArchNetwork::PollEventMask::Error) | int(IArchNetwork::PollEventMask::Invalid))) != 0);
|
||||
|
||||
// run job
|
||||
ISocketMultiplexerJob *job = *jobCursor;
|
||||
|
||||
@ -84,7 +84,8 @@ TEST(ArchNetworkBSDTests, pollSocket_pfdHasRevents_copiedToEntries)
|
||||
|
||||
networkBSD.pollSocket(entries.data(), static_cast<int>(entries.size()), 1);
|
||||
|
||||
const auto expect = IArchNetwork::kPOLLIN | IArchNetwork::kPOLLOUT | IArchNetwork::kPOLLERR | IArchNetwork::kPOLLNVAL;
|
||||
const auto expect = IArchNetwork::PollEventMask::In | IArchNetwork::PollEventMask::Out |
|
||||
IArchNetwork::PollEventMask::Error | IArchNetwork::PollEventMask::Invalid;
|
||||
EXPECT_EQ(entries[0].m_revents, expect);
|
||||
}
|
||||
|
||||
@ -116,7 +117,7 @@ TEST(ArchNetworkBSDTests, pollSocket_eventHasPollInBit_bitWasSet)
|
||||
auto deps = MockDeps::makeNice();
|
||||
ArchNetworkBSD networkBSD(deps);
|
||||
ArchSocketImpl socket{1, 0};
|
||||
PollEntries entries{{&socket, IArchNetwork::kPOLLIN, 0}};
|
||||
PollEntries entries{{&socket, IArchNetwork::PollEventMask::In, 0}};
|
||||
|
||||
networkBSD.pollSocket(entries.data(), static_cast<int>(entries.size()), 1);
|
||||
|
||||
@ -128,7 +129,7 @@ TEST(ArchNetworkBSDTests, pollSocket_eventHasPollOutBit_bitWasSet)
|
||||
auto deps = MockDeps::makeNice();
|
||||
ArchNetworkBSD networkBSD(deps);
|
||||
ArchSocketImpl socket{1, 0};
|
||||
PollEntries entries{{&socket, IArchNetwork::kPOLLOUT, 0}};
|
||||
PollEntries entries{{&socket, IArchNetwork::PollEventMask::Out, 0}};
|
||||
|
||||
networkBSD.pollSocket(entries.data(), static_cast<int>(entries.size()), 1);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user