X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FFdEvent.hh;h=78409f4fbfdfc34a8b02d57a75987767da6f3ac0;hb=9ded1690d676ba7c7054a7a272debf99102f94c0;hp=736c3cfd66b55646fa000919653fd99c33a8bb39;hpb=03516e8371a90f908ce54dedb3c874eec7dd08ff;p=senf.git diff --git a/Scheduler/FdEvent.hh b/Scheduler/FdEvent.hh index 736c3cf..78409f4 100644 --- a/Scheduler/FdEvent.hh +++ b/Scheduler/FdEvent.hh @@ -51,19 +51,23 @@ namespace scheduler { The FdEvent class registers a file descriptor for read or write events. - The type of event is specified using an event mask. Possible events are + There are a number of different event types supported for file descriptors. Those are + specified using a bit mask. Possible events are \li \c EV_READ: File descriptor is readable (or at EOF) \li \c EV_PRIO: There is out-of-band data available to be read on the file descriptor \li \c EV_WRITE: File descriptor is writable - These event flags can be or-ed together to form an event mask. The callback will be called - with those flags set which are currently signaled. There are additional flags which may be - set when calling the callback: - + The callback will be called with one additional argument. This argument is the event mask of + type int. This mask will tell, which of the registered events are signaled. There are some + additional flags which can be set when calling the handler callback: + \li \c EV_HUP: The other end has closed the connection \li \c EV_ERR: Transport error + Only a single handler may be registered for any combination of file descriptor and event + otherwise a DuplicateEventRegistrationException is thrown. + The file descriptor is specified using an arbitrary handle type which supports the \c retrieve_filehandle() protocol: There must be a global function \c retrieve_filehandle callable with the handle type. This function must return the file descriptor associated with @@ -76,9 +80,9 @@ namespace scheduler { callback is a member function it should be defined as a class member). */ class FdEvent - : public FIFORunner::TaskInfo, + : public detail::FIFORunner::TaskInfo, public detail::FdSetBase, - public FdManager::Event + public detail::FdManager::Event { public: /////////////////////////////////////////////////////////////////////////// @@ -87,9 +91,15 @@ namespace scheduler { typedef boost::function Callback; enum Events { - EV_READ = FdManager::EV_READ, EV_PRIO = FdManager::EV_PRIO, EV_WRITE = FdManager::EV_WRITE, - EV_HUP = FdManager::EV_HUP, EV_ERR = FdManager::EV_ERR, - EV_ALL = FdManager::EV_READ | FdManager::EV_WRITE | FdManager::EV_PRIO + EV_NONE = 0 ///< No event + , EV_READ = detail::FdManager::EV_READ ///< fd readable (or EOF) + , EV_PRIO = detail::FdManager::EV_PRIO ///< OOB data available for read + , EV_WRITE = detail::FdManager::EV_WRITE ///< fd writable + , EV_HUP = detail::FdManager::EV_HUP ///< remote end closed connection + , EV_ERR = detail::FdManager::EV_ERR ///< transport error + , EV_ALL = (detail::FdManager::EV_READ + | detail::FdManager::EV_WRITE + | detail::FdManager::EV_PRIO) ///< register all events (read, prio and write) }; /////////////////////////////////////////////////////////////////////////// @@ -128,7 +138,6 @@ namespace scheduler { void disable(); ///< Disable event void enable(); ///< Enable event - bool enabled(); ///< \c true if event enabled, \c false otherwise FdEvent & action(Callback const & cb); ///< Change event callback @@ -147,7 +156,9 @@ namespace scheduler { private: virtual void signal(int events); - virtual void run(); + virtual void v_run(); + virtual char const * v_type() const; + virtual std::string v_info() const; Callback cb_; int fd_; @@ -161,8 +172,14 @@ namespace scheduler { friend class detail::FileDispatcher; }; - int retrieve_filehandle(int fd); + /** \brief Get file descriptor from handle object + This function will query the \a handle for it's file descriptor. The real implementation + must be provided by a freestanding function \c retrieve_filehandle(Handle const & h) within + the namespace of \a Handle. + */ + template + int get_descriptor(Handle const & handle); }} ///////////////////////////////hh.e////////////////////////////////////////