]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socketengines/socketengine_ports.cpp
Merge pull request #16 from Adam-/insp20
[user/henk/code/inspircd.git] / src / socketengines / socketengine_ports.cpp
index d23857f506d500293e7311dd61d17bfc3ee000da..258c89709ace33ee1129d47b43a87960c8279d76 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
  * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
 #include "inspircd.h"
 #include "exitcodes.h"
 #include <port.h>
-#include "socketengines/socketengine_ports.h"
+
+#ifndef __SOCKETENGINE_PORTS__
+#define __SOCKETENGINE_PORTS__
+
+#ifndef __sun
+# error You need Solaris 10 or later to make use of this code.
+#endif
+
+#include <vector>
+#include <string>
+#include <map>
+#include "inspircd_config.h"
+#include "inspircd.h"
+#include "socketengine.h"
+#include <port.h>
+
+/** A specialisation of the SocketEngine class, designed to use solaris 10 I/O completion ports
+ */
+class PortsEngine : public SocketEngine
+{
+private:
+       /** These are used by epoll() to hold socket events
+        */
+       port_event_t* events;
+public:
+       /** Create a new PortsEngine
+        * @param Instance The creator of this object
+        */
+       PortsEngine();
+       /** Delete a PortsEngine
+        */
+       virtual ~PortsEngine();
+       virtual bool AddFd(EventHandler* eh, int event_mask);
+       void OnSetEvent(EventHandler* eh, int old_event, int new_event);
+       virtual void DelFd(EventHandler* eh);
+       virtual int DispatchEvents();
+       virtual std::string GetName();
+       virtual void WantWrite(EventHandler* eh);
+};
+
+#endif
+
+
 #include <ulimit.h>
 
 PortsEngine::PortsEngine()
@@ -23,7 +65,6 @@ PortsEngine::PortsEngine()
        if (max > 0)
        {
                MAX_DESCRIPTORS = max;
-               return max;
        }
        else
        {
@@ -89,11 +130,11 @@ void PortsEngine::WantWrite(EventHandler* eh, int old_mask, int new_mask)
                port_associate(EngineHandle, PORT_SOURCE_FD, eh->GetFd(), mask_to_events(new_mask), eh);
 }
 
-bool PortsEngine::DelFd(EventHandler* eh, bool force)
+void PortsEngine::DelFd(EventHandler* eh)
 {
        int fd = eh->GetFd();
        if ((fd < 0) || (fd > GetMaxFds() - 1))
-               return false;
+               return;
 
        port_dissociate(EngineHandle, PORT_SOURCE_FD, fd);
 
@@ -113,6 +154,7 @@ int PortsEngine::DispatchEvents()
 
        unsigned int nget = 1; // used to denote a retrieve request.
        int i = port_getn(EngineHandle, this->events, GetMaxFds() - 1, &nget, &poll_time);
+       ServerInstance->UpdateTime();
 
        // first handle an error condition
        if (i == -1)
@@ -142,6 +184,8 @@ int PortsEngine::DispatchEvents()
                                        {
                                                ReadEvents++;
                                                eh->HandleEvent(EVENT_READ);
+                                               if (eh != ref[fd])
+                                                       continue;
                                        }
                                        if (events[i].portev_events & POLLWRNORM)
                                        {
@@ -163,3 +207,7 @@ std::string PortsEngine::GetName()
        return "ports";
 }
 
+SocketEngine* CreateSocketEngine()
+{
+       return new PortsEngine;
+}