X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.hh;h=0d51c35b4b99e6818411ca97bc7bc56b36c5767d;hb=259da4c692259311c6ec99566b57f5ed1e68e93e;hp=5f0f635c5ee8d319264666a0e4f43d3b91d5ff05;hpb=91b6e8382ce61c2d1286203e41d030ef8cd33f3e;p=senf.git
diff --git a/Scheduler/Scheduler.hh b/Scheduler/Scheduler.hh
index 5f0f635..0d51c35 100644
--- a/Scheduler/Scheduler.hh
+++ b/Scheduler/Scheduler.hh
@@ -72,8 +72,12 @@ namespace senf {
If you need to pass additional information to your handler, use Boost.Bind:
\code
+ // Handle callback function
+ void callback(UDPv4ClientSocketHandle handle, senf::Scheduler::EventId event) {..}
// Pass 'handle' as additional first argument to callback()
- Scheduler::instance().add(handle, boost::bind(&callback, handle, _1))
+ Scheduler::instance().add(handle, boost::bind(&callback, handle, _1), EV_READ)
+ // Timeout function
+ void timeout( int n) {..}
// Call timeout() handler with argument 'n'
Scheduler::instance().timeout(boost::bind(&timeout, n))
\endcode
@@ -82,7 +86,7 @@ namespace senf {
href="http://www.boost.org/libs/bind/bind.html">Boost.Bind or senf::membind()
\code
// e.g. in Foo::Foo() constructor:
- Scheduler::instance().add(handle_, senf::membind(&Foo::callback, this))
+ Scheduler::instance().add(handle_, senf::membind(&Foo::callback, this)), EV_READ)
\endcode
@@ -90,7 +94,7 @@ namespace senf {
File descriptors are managed using add() or remove()
\code
- Scheduler::instance().add(handle, &callback);
+ Scheduler::instance().add(handle, &callback, EV_ALL);
Scheduler::instance().remove(handle);
\endcode
@@ -156,6 +160,9 @@ namespace senf {
\todo Fix the file support to use threads (?) fork (?) and a pipe so it works reliably even
over e.g. NFS.
+
+ \todo Add a check in the alarm callback which is already called every x seconds to check,
+ that a single callback is not blocking.
*/
class Scheduler
: boost::noncopyable
@@ -167,11 +174,23 @@ namespace senf {
///////////////////////////////////////////////////////////////////////////
// Types
- /** \brief Types of file descriptor events */
- enum EventId { EV_NONE=0,
- EV_READ=1, EV_PRIO=2, EV_WRITE=4,
- EV_ALL=7,
- EV_HUP=8, EV_ERR=16 };
+ /** \brief Types of file descriptor events
+
+ These events are grouped into to classes:
+ \li Ordinary file descriptor events for which handlers may be registered. These are
+ EV_READ, EV_PRIO and EV_WRITE. EV_ALL is a combination of these three.
+ \li Error flags. These additional flags may be passed to a handler to pass an error
+ condition to the handler.
+ */
+ enum EventId {
+ EV_NONE = 0 /**< No event */
+ , EV_READ = 1 /**< File descriptor is readable */
+ , EV_PRIO = 2 /**< File descriptor has OOB data */
+ , EV_WRITE = 4 /**< File descriptor is writable */
+ , EV_ALL = 7 /**< Used to register all events at once (read/prio/write) */
+ , EV_HUP = 8 /**< Hangup condition on file handle */
+ , EV_ERR = 16 /**< Error condition on file handle */
+ };
/** \brief Template typedef for Callback type
@@ -234,7 +253,8 @@ namespace senf {
the Handle interface defined above.
\param[in] cb callback
\param[in] eventMask arbitrary combination via '|'
- operator of EventId designators. */
+ operator of \ref senf::Scheduler::EventId "EventId"
+ designators. */
template
void remove(Handle const & handle, int eventMask = EV_ALL); ///< Remove event callback
/**< remove() will remove any callback registered for any of
@@ -243,8 +263,8 @@ namespace senf {
\param[in] handle file descriptor or handle providing
the Handle interface defined above.
\param[in] eventMask arbitrary combination via '|'
- operator of EventId designators. */
-
+ operator of \ref senf::Scheduler::EventId "EventId"
+ designators. */
///\}
///\name Timeouts
@@ -252,7 +272,8 @@ namespace senf {
unsigned timeout(ClockService::clock_type timeout, SimpleCallback const & cb);
///< Add timeout event
- /**< \param[in] timeout timeout in nanoseconds
+ /**< \returns timer id
+ \param[in] timeout timeout in nanoseconds
\param[in] cb callback to call after \a timeout
milliseconds */
@@ -283,9 +304,9 @@ namespace senf {
///< Remove signal handler for \a signal
/// The signal number passed to registerSignal or unregisterSignal is invalid
- struct InvalidSignalNumberException : public std::exception
- { virtual char const * what() const throw()
- { return "senf::Scheduler::InvalidSignalNumberException"; } };
+ struct InvalidSignalNumberException : public senf::Exception
+ { InvalidSignalNumberException()
+ : senf::Exception("senf::Scheduler::InvalidSignalNumberException"){} };
///\}