X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fsocketengine.h;h=729f5e0909a8fb66275857bb28cd5bd1c8f8fb57;hb=3ec7995bf4981119115d14ce2cfce0cb5795f803;hp=fd01b4cf80374fbe968b4af7fe115f98cf2c8909;hpb=e381b06561228aaea752deda20a62c6dc99a560e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/socketengine.h b/include/socketengine.h index fd01b4cf8..729f5e090 100644 --- a/include/socketengine.h +++ b/include/socketengine.h @@ -2,17 +2,14 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. - * E-mail: - * - * + * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits * - * Written by Craig Edwards, Craig McLure, and others. * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- -*/ + */ #ifndef __SOCKETENGINE__ #define __SOCKETENGINE__ @@ -26,11 +23,15 @@ /** Types of event an EventHandler may receive. * EVENT_READ is a readable file descriptor, * and EVENT_WRITE is a writeable file descriptor. + * EVENT_ERROR can always occur, and indicates + * a write error or read error on the socket, + * e.g. EOF condition or broken pipe. */ enum EventType { EVENT_READ = 0, - EVENT_WRITE = 1 + EVENT_WRITE = 1, + EVENT_ERROR = 2 }; class InspIRCd; @@ -93,6 +94,12 @@ class EventHandler : public Extensible * is still added to a SocketEngine instance! * If this function is unimplemented, the base class * will return true. + * + * NOTE: You cannot set both Readable() and + * Writeable() to true. If you wish to receive + * a write event for your object, you must call + * SocketEngine::WantWrite() instead. This will + * trigger your objects next EVENT_WRITE type event. */ virtual bool Readable(); @@ -103,6 +110,12 @@ class EventHandler : public Extensible * is still added to a SocketEngine instance! * If this function is unimplemented, the base class * will return false. + * + * NOTE: You cannot set both Readable() and + * Writeable() to true. If you wish to receive + * a write event for your object, you must call + * SocketEngine::WantWrite() instead. This will + * trigger your objects next EVENT_WRITE type event. */ virtual bool Writeable(); @@ -110,11 +123,12 @@ class EventHandler : public Extensible * You MUST implement this function in your derived * class, and it will be called whenever read or write * events are received, depending on what your functions - * Readable() and Writeable() returns. + * Readable() and Writeable() returns and wether you + * previously made a call to SocketEngine::WantWrite(). * @param et either one of EVENT_READ for read events, * and EVENT_WRITE for write events. */ - virtual void HandleEvent(EventType et) = 0; + virtual void HandleEvent(EventType et, int errornum = 0) = 0; }; /** Provides basic file-descriptor-based I/O support. @@ -179,6 +193,19 @@ public: */ virtual bool AddFd(EventHandler* eh); + /** If you call this function and pass it an + * event handler, that event handler will + * receive the next available write event, + * even if the socket is a readable socket only. + * Developers should avoid constantly keeping + * an eventhandler in the writeable state, + * as this will consume large amounts of + * CPU time. + * @param eh An event handler which wants to + * receive the next writeability event. + */ + virtual void WantWrite(EventHandler* eh); + /** Returns the maximum number of file descriptors * you may store in the socket engine at any one time. * @return The maximum fd value @@ -197,10 +224,18 @@ public: * and false if it failed. This does not free the * EventHandler pointer using delete, if this is * required you must do this yourself. + * Note on forcing deletes. DO NOT DO THIS! This is + * extremely dangerous and will most likely render the + * socketengine dead. This was added only for handling + * very rare cases where broken 3rd party libs destroys + * the OS socket beyond our control. If you can't explain + * in minute details why forcing is absolutely necessary + * then you don't need it. That was a NO! * @param eh The event handler object to remove + * @param force *DANGEROUS* See method description! * @return True if the event handler was removed */ - virtual bool DelFd(EventHandler* eh); + virtual bool DelFd(EventHandler* eh, bool force = false); /** Returns true if a file descriptor exists in * the socket engine's list. @@ -216,20 +251,16 @@ public: */ EventHandler* GetRef(int fd); - /** Waits for an event. + /** Waits for events and dispatches them to handlers. * Please note that this doesnt wait long, only - * a couple of milliseconds. It returns a list - * of active EventHandlers in the array fdlist - * which the core will then dispatch events to + * a couple of milliseconds. It returns the number of + * events which occured during this call. + * This method will dispatch events to their handlers * by calling their EventHandler::HandleEvent() * methods with the neccessary EventType value. - * @param fdlist A pointer to a set of EventHandler - * classes. You should ensure that the array you pass - * is at least MAX_DESCRIPTORS in size, to accomodate - * for the maximum number of events which can occur. * @return The number of events which have occured. */ - virtual int Wait(EventHandler** fdlist); + virtual int DispatchEvents(); /** Returns the socket engines name. * This returns the name of the engine for use