X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsocketengines%2Fsocketengine_ports.cpp;h=d7425813eef26eedd01175db6f56b580273f2d12;hb=efe77ba63b1e519fc4d563bd9b599277c4bd96e5;hp=226f59f04b4b8073f5de74b038ae2b45b393008e;hpb=aea38a0dd702895b7dfd18efd26a0dcead2279fc;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/socketengines/socketengine_ports.cpp b/src/socketengines/socketengine_ports.cpp index 226f59f04..d7425813e 100644 --- a/src/socketengines/socketengine_ports.cpp +++ b/src/socketengines/socketengine_ports.cpp @@ -36,27 +36,17 @@ /** A specialisation of the SocketEngine class, designed to use solaris 10 I/O completion ports */ -class PortsEngine : public SocketEngine +namespace { -private: /** These are used by ports to hold socket events */ - std::vector events; + std::vector events(16); int EngineHandle; -public: - /** Create a new PortsEngine - */ - PortsEngine(); - /** Delete a PortsEngine - */ - virtual ~PortsEngine(); - virtual bool AddFd(EventHandler* eh, int event_mask); - virtual void OnSetEvent(EventHandler* eh, int old_mask, int new_mask); - virtual void DelFd(EventHandler* eh); - virtual int DispatchEvents(); -}; - -PortsEngine::PortsEngine() : events(1) +} + +/** Initialize ports engine + */ +void SocketEngine::Init() { int max = ulimit(4, 0); if (max > 0) @@ -81,9 +71,15 @@ PortsEngine::PortsEngine() : events(1) } } -PortsEngine::~PortsEngine() +/** Shutdown the ports engine + */ +void SocketEngine::Deinit() +{ + SocketEngine::Close(EngineHandle); +} + +void SocketEngine::RecoverFromFork() { - this->Close(EngineHandle); } static int mask_to_events(int event_mask) @@ -96,7 +92,7 @@ static int mask_to_events(int event_mask) return rv; } -bool PortsEngine::AddFd(EventHandler* eh, int event_mask) +bool SocketEngine::AddFd(EventHandler* eh, int event_mask) { int fd = eh->GetFd(); if ((fd < 0) || (fd > GetMaxFds() - 1)) @@ -105,7 +101,7 @@ bool PortsEngine::AddFd(EventHandler* eh, int event_mask) if (!SocketEngine::AddFdRef(eh)) return false; - SocketEngine::SetEventMask(eh, event_mask); + eh->SetEventMask(event_mask); port_associate(EngineHandle, PORT_SOURCE_FD, fd, mask_to_events(event_mask), eh); ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "New file descriptor: %d", fd); @@ -114,13 +110,13 @@ bool PortsEngine::AddFd(EventHandler* eh, int event_mask) return true; } -void PortsEngine::OnSetEvent(EventHandler* eh, int old_mask, int new_mask) +void SocketEngine::OnSetEvent(EventHandler* eh, int old_mask, int new_mask) { if (mask_to_events(new_mask) != mask_to_events(old_mask)) port_associate(EngineHandle, PORT_SOURCE_FD, eh->GetFd(), mask_to_events(new_mask), eh); } -void PortsEngine::DelFd(EventHandler* eh) +void SocketEngine::DelFd(EventHandler* eh) { int fd = eh->GetFd(); if ((fd < 0) || (fd > GetMaxFds() - 1)) @@ -133,7 +129,7 @@ void PortsEngine::DelFd(EventHandler* eh) ServerInstance->Logs->Log("SOCKET", LOG_DEBUG, "Remove file descriptor: %d", fd); } -int PortsEngine::DispatchEvents() +int SocketEngine::DispatchEvents() { struct timespec poll_time; @@ -148,7 +144,7 @@ int PortsEngine::DispatchEvents() if (ret == -1) return -1; - TotalEvents += nget; + stats.TotalEvents += nget; unsigned int i; for (i = 0; i < nget; i++) @@ -171,26 +167,21 @@ int PortsEngine::DispatchEvents() if (portev_events & POLLRDNORM) mask &= ~FD_READ_WILL_BLOCK; // reinsert port for next time around, pretending to be one-shot for writes - SetEventMask(eh, mask); + eh->SetEventMask(mask); port_associate(EngineHandle, PORT_SOURCE_FD, fd, mask_to_events(mask), eh); if (portev_events & POLLRDNORM) { - ReadEvents++; + stats.ReadEvents++; eh->HandleEvent(EVENT_READ); if (eh != GetRef(fd)) continue; } if (portev_events & POLLWRNORM) { - WriteEvents++; + stats.WriteEvents++; eh->HandleEvent(EVENT_WRITE); } } return (int)i; } - -SocketEngine* CreateSocketEngine() -{ - return new PortsEngine; -}