]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socketengines/socketengine_ports.cpp
Remove Command and ModeHandler objects in their destructors; fixes possible pointer...
[user/henk/code/inspircd.git] / src / socketengines / socketengine_ports.cpp
index a99806fc49568a034214659480f803d36fdc5388..28dfdf4e4813b74fedf5413cb46443009a7db8ac 100644 (file)
 #include "inspircd.h"
 #include "exitcodes.h"
 #include <port.h>
-#include "socketengines/socketengine_ports.h"
+/*       +------------------------------------+
+ *       | Inspire Internet Relay Chat Daemon |
+ *       +------------------------------------+
+ *
+ *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
+ *
+ * This program is free but copyrighted software; see
+ *            the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#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 bool DelFd(EventHandler* eh, bool force = false);
+       virtual int DispatchEvents();
+       virtual std::string GetName();
+       virtual void WantWrite(EventHandler* eh);
+};
+
+#endif
+
+
 #include <ulimit.h>
 
 PortsEngine::PortsEngine()
@@ -60,7 +114,7 @@ static int mask_to_events(int event_mask)
        int rv = 0;
        if (event_mask & (FD_WANT_POLL_READ | FD_WANT_FAST_READ))
                rv |= POLLRDNORM;
-       if (event_mask & (FD_WANT_POLL_WRITE | FD_WANT_FAST_WRITE))
+       if (event_mask & (FD_WANT_POLL_WRITE | FD_WANT_FAST_WRITE | FD_WANT_SINGLE_WRITE))
                rv |= POLLWRNORM;
        return rv;
 }
@@ -132,7 +186,7 @@ int PortsEngine::DispatchEvents()
                                {
                                        int mask = eh->GetEventMask();
                                        if (events[i].portev_events & POLLWRNORM)
-                                               mask &= ~(FD_WRITE_WILL_BLOCK | FD_WANT_FAST_WRITE);
+                                               mask &= ~(FD_WRITE_WILL_BLOCK | FD_WANT_FAST_WRITE | FD_WANT_SINGLE_WRITE);
                                        if (events[i].portev_events & POLLRDNORM)
                                                mask &= ~FD_READ_WILL_BLOCK;
                                        // reinsert port for next time around, pretending to be one-shot for writes
@@ -163,3 +217,7 @@ std::string PortsEngine::GetName()
        return "ports";
 }
 
+SocketEngine* CreateSocketEngine()
+{
+       return new PortsEngine;
+}