1 /* +------------------------------------+
\r * | Inspire Internet Relay Chat Daemon |
\r * +------------------------------------+
\r *
\r * InspIRCd: (C) 2002-2007 InspIRCd Development Team
\r * See: http://www.inspircd.org/wiki/index.php/Credits
\r *
\r * This program is free but copyrighted software; see
\r * the file COPYING for details.
\r *
\r * ---------------------------------------------------
\r */
\r\r#ifndef __SOCKETENGINE_SELECT__
\r#define __SOCKETENGINE_SELECT__
\r\r#include <vector>
\r#include <string>
\r#include <map>
\r#include <sys/select.h>
\r#include "inspircd_config.h"
\r#include "globals.h"
\r#include "inspircd.h"
\r#include "socketengine.h"
\r\rclass InspIRCd;
\r\r/** A specialisation of the SocketEngine class, designed to use traditional select().
\r */
\rclass SelectEngine : public SocketEngine
\r{
\rprivate:
\r /** Because select() does not track an fd list for us between calls, we have one of our own
\r */
\r std::map<int,int> fds;
\r /** List of writeable ones (WantWrite())
\r */
\r bool writeable[MAX_DESCRIPTORS];
\r /** The read set and write set, populated before each call to select().
\r */
\r fd_set wfdset, rfdset, errfdset;
\rpublic:
\r /** Create a new SelectEngine
\r * @param Instance The creator of this object
\r */
\r SelectEngine(InspIRCd* Instance);
\r /** Delete a SelectEngine
\r */
\r virtual ~SelectEngine();
\r virtual bool AddFd(EventHandler* eh);
\r virtual int GetMaxFds();
\r virtual int GetRemainingFds();
\r virtual bool DelFd(EventHandler* eh, bool force = false);
\r virtual int DispatchEvents();
\r virtual std::string GetName();
\r virtual void WantWrite(EventHandler* eh);
\r};
\r\r/** Creates a SocketEngine
\r */
\rclass SocketEngineFactory
\r{
\rpublic:
\r /** Create a new instance of SocketEngine based on SelectEngine
\r */
\r SocketEngine* Create(InspIRCd* Instance) { return new SelectEngine(Instance); }
\r};
\r\r#endif
\r