From 034488fc4aca4fb85c923d881f4b95675eba37b6 Mon Sep 17 00:00:00 2001 From: Attila Molnar Date: Sun, 9 Feb 2014 17:31:57 +0100 Subject: Store the EventHandler* in the kevent/epoll_event/portev struct This removes the need to call GetRef() for every socket in DispatchEvents() --- src/socketengines/socketengine_kqueue.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/socketengines/socketengine_kqueue.cpp') diff --git a/src/socketengines/socketengine_kqueue.cpp b/src/socketengines/socketengine_kqueue.cpp index 96def4cca..b7797a82f 100644 --- a/src/socketengines/socketengine_kqueue.cpp +++ b/src/socketengines/socketengine_kqueue.cpp @@ -113,7 +113,7 @@ bool SocketEngine::AddFd(EventHandler* eh, int event_mask) // We always want to read from the socket... struct kevent* ke = GetChangeKE(); - EV_SET(ke, fd, EVFILT_READ, EV_ADD, 0, 0, NULL); + EV_SET(ke, fd, EVFILT_READ, EV_ADD, 0, 0, static_cast(eh)); ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "New file descriptor: %d", fd); @@ -154,7 +154,7 @@ void SocketEngine::OnSetEvent(EventHandler* eh, int old_mask, int new_mask) { // new poll-style write struct kevent* ke = GetChangeKE(); - EV_SET(ke, eh->GetFd(), EVFILT_WRITE, EV_ADD, 0, 0, NULL); + EV_SET(ke, eh->GetFd(), EVFILT_WRITE, EV_ADD, 0, 0, static_cast(eh)); } else if ((old_mask & FD_WANT_POLL_WRITE) && !(new_mask & FD_WANT_POLL_WRITE)) { @@ -165,7 +165,7 @@ void SocketEngine::OnSetEvent(EventHandler* eh, int old_mask, int new_mask) if ((new_mask & (FD_WANT_FAST_WRITE | FD_WANT_SINGLE_WRITE)) && !(old_mask & (FD_WANT_FAST_WRITE | FD_WANT_SINGLE_WRITE))) { struct kevent* ke = GetChangeKE(); - EV_SET(ke, eh->GetFd(), EVFILT_WRITE, EV_ADD | EV_ONESHOT, 0, 0, NULL); + EV_SET(ke, eh->GetFd(), EVFILT_WRITE, EV_ADD | EV_ONESHOT, 0, 0, static_cast(eh)); } } @@ -187,13 +187,14 @@ int SocketEngine::DispatchEvents() for (int j = 0; j < i; j++) { struct kevent& kev = ke_list[j]; + EventHandler* eh = static_cast(kev.udata); + if (!eh) + continue; // Copy these in case the vector gets resized and kev invalidated - const int fd = kev.ident; + const int fd = eh->GetFd(); const short filter = kev.filter; - - EventHandler* eh = GetRef(fd); - if (!eh) + if (fd < 0) continue; if (kev.flags & EV_EOF) -- cgit v1.2.3