do not create a kqueue everytime we call poll

This commit is contained in:
Benjamin Sergeant 2020-08-05 15:00:01 -07:00
parent 22dd32d4e9
commit 0834198e74
4 changed files with 17 additions and 8 deletions

View File

@ -52,10 +52,11 @@ namespace ix
PollResultType Socket::poll(bool readyToRead,
int timeoutMs,
int sockfd,
const SelectInterruptPtr& selectInterrupt)
const SelectInterruptPtr& selectInterrupt,
int kqueuefd)
{
#if defined(__APPLE__)
int kqueuefd = kqueue();
// FIXME int kqueuefd = kqueue();
struct kevent ke;
EV_SET(&ke, sockfd, (readyToRead) ? EVFILT_READ : EVFILT_WRITE, EV_ADD, 0, 0, NULL);
@ -145,7 +146,8 @@ namespace ix
#endif
free(events);
::close(kqueuefd);
// ::close(kqueuefd); //FMXE
return pollResult;
#else
@ -254,7 +256,7 @@ namespace ix
}
bool readyToRead = true;
return poll(readyToRead, timeoutMs, _sockfd, _selectInterrupt);
return poll(readyToRead, timeoutMs, _sockfd, _selectInterrupt, _kqueuefd);
}
PollResultType Socket::isReadyToWrite(int timeoutMs)
@ -265,7 +267,7 @@ namespace ix
}
bool readyToRead = false;
return poll(readyToRead, timeoutMs, _sockfd, _selectInterrupt);
return poll(readyToRead, timeoutMs, _sockfd, _selectInterrupt, _kqueuefd);
}
// Wake up from poll/select by writing to the pipe which is watched by select

View File

@ -101,7 +101,8 @@ namespace ix
static PollResultType poll(bool readyToRead,
int timeoutMs,
int sockfd,
const SelectInterruptPtr& selectInterrupt);
const SelectInterruptPtr& selectInterrupt,
int kqueuefd);
// Used as special codes for pipe communication

View File

@ -66,7 +66,10 @@ namespace ix
int timeoutMs = 10;
bool readyToRead = false;
auto selectInterrupt = std::make_unique<SelectInterrupt>();
PollResultType pollResult = Socket::poll(readyToRead, timeoutMs, fd, selectInterrupt);
int kqueuefd = kqueue();
PollResultType pollResult = Socket::poll(readyToRead, timeoutMs, fd, selectInterrupt, kqueuefd);
::close(kqueuefd);
if (pollResult == PollResultType::Timeout)
{

View File

@ -259,8 +259,11 @@ namespace ix
int timeoutMs = 10;
bool readyToRead = true;
auto selectInterrupt = std::make_unique<SelectInterrupt>();
int kqueuefd = kqueue();
PollResultType pollResult =
Socket::poll(readyToRead, timeoutMs, _serverFd, selectInterrupt);
Socket::poll(readyToRead, timeoutMs, _serverFd, selectInterrupt, kqueuefd);
::close(kqueuefd);
if (pollResult == PollResultType::Error)
{