#include <boost/function.hpp>
#include <boost/utility.hpp>
#include <boost/call_traits.hpp>
-
-#include "Utils/MicroTime.hh"
+#include <boost/integer.hpp>
+#include "ClockService.hh"
//#include "scheduler.mpp"
///////////////////////////////hh.p////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Types
- /// \brief Types of file descriptor events */
+ /** \brief Types of file descriptor events */
enum EventId { EV_NONE=0,
EV_READ=1, EV_PRIO=2, EV_WRITE=4,
EV_ALL=7,
typedef boost::function<void (typename boost::call_traits<Handle>::param_type,
EventId) > Callback;
};
+
/** \brief Callback type for timer events */
typedef boost::function<void ()> TimerCallback;
\param[in] eventMask arbitrary combination via '|'
operator of EventId designators. */
- void timeout(unsigned long timeout, TimerCallback const & cb); ///< Add timeout event
- /**< \param[in] timeout timeout in milliseconds
+ unsigned timeout(ClockService::clock_type timeout, TimerCallback const & cb);
+ ///< Add timeout event
+ /**< \param[in] timeout timeout in nanoseconds
\param[in] cb callback to call after \a timeout
milliseconds
\todo Return some kind of handle/pointer and add
support to update or revoke a timeout */
+ void cancelTimeout(unsigned id);
+
void process(); ///< Event handler main loop
/**< This member must be called at some time to enter the
event handler main loop. Only while this function is
main loop to terminate. The main loop will return to
it's caller after the currently running callback
returns. */
+
+ ClockService::clock_type eventTime() const; ///< Return date/time of last event
protected:
struct TimerSpec
{
TimerSpec() : timeout(), cb() {}
- TimerSpec(unsigned long long timeout_, TimerCallback cb_)
- : timeout(timeout_), cb(cb_) {}
+ TimerSpec(ClockService::clock_type timeout_, TimerCallback cb_, unsigned id_)
+ : timeout(timeout_), cb(cb_), id(id_), canceled(false) {}
bool operator< (TimerSpec const & other) const
{ return timeout > other.timeout; }
- unsigned long long timeout;
+ ClockService::clock_type timeout;
TimerCallback cb;
+ unsigned id;
+ bool canceled;
};
typedef std::map<int,EventSpec> FdTable;
- typedef std::priority_queue<TimerSpec> TimerQueue;
+ typedef std::map<unsigned,TimerSpec> TimerMap; // sorted by id
+
+ struct TimerSpecCompare
+ {
+ typedef TimerMap::iterator first_argument_type;
+ typedef TimerMap::iterator second_argument_type;
+ typedef bool result_type;
+
+ result_type operator()(first_argument_type a, second_argument_type b);
+ };
+
+ typedef std::priority_queue<TimerMap::iterator, std::vector<TimerMap::iterator>,
+ TimerSpecCompare> TimerQueue; // sorted by time
FdTable fdTable_;
+ unsigned timerIdCounter_;
TimerQueue timerQueue_;
+ TimerMap timerMap_;
int epollFd_;
bool terminate_;
+ ClockService::clock_type eventTime_;
};
/** \brief Default file descriptor accessor
// indent-tabs-mode: nil
// ispell-local-dictionary: "american"
// compile-command: "scons -u test"
+// comment-column: 40
// End: