4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief TimerDispatcher public header */
26 #ifndef HH_SENF_Scheduler_TimerEvent_
27 #define HH_SENF_Scheduler_TimerEvent_ 1
31 #include <senf/boost_intrusive/iset_hook.hpp>
32 #include "ClockService.hh"
33 #include "FIFORunner.hh"
34 #include <senf/Utils/Logger/SenfLog.hh>
36 //#include "TimerEvent.mpp"
37 ///////////////////////////////hh.p////////////////////////////////////////
44 typedef boost::intrusive::iset_base_hook<TimerSetTag> TimerSetBase;
45 struct TimerSetCompare;
46 class TimerDispatcher;
49 /** \brief Deadline timer event
51 The TimerEvent class registers a deadline timer callback which will be called when the
54 Timer events are implemented using POSIX timers. Depending on kernel features, the timer
55 resolution will be far more precise than the linux clock tick resolution. The nominal timer
56 resolution is 1 nanosecond.
58 The timeout time is set as \e absolute time as returned by the senf::ClockService. After
59 expiration, the timer will be disabled. It may be re-enabled by setting a new timeout time.
60 It is also possible to change a running timer resetting the timeout time.
62 The TimerEvent class is an implementation of the RAII idiom: The event will be automatically
63 unregistered in the TimerEvent destructor. The TimerEvent instance should be created
64 within the same scope or on a scope below where the callback is defined (e.g. if the
65 callback is a member function it should be defined as a class member).
68 : public detail::FIFORunner::TaskInfo,
69 public detail::TimerSetBase
72 ///////////////////////////////////////////////////////////////////////////
75 typedef boost::function<void ()> Callback;
77 ///////////////////////////////////////////////////////////////////////////
78 ///\name Structors and default members
81 TimerEvent(std::string const & name, Callback const & cb, ClockService::clock_type timeout,
82 bool initiallyEnabled = true);
83 ///< Register a timer event
84 /**< Registers \a cb to be called as soon as possible after
85 the time \a timeout is reached. If \a initiallyEnabled
86 is set \c false, the callback will not be enabled
87 automatically. Use enable() to do so.
88 \param[in] name Descriptive timer name (purely
90 \param[in] cb Callback to call
91 \param[in] timeout timeout time after the timer
93 \param[in] initiallyEnabled if set \c false, do not
94 enable callback automatically. */
95 TimerEvent(std::string const & name, Callback const & cb);
96 ///< Create a timer event
97 /**< Creates a timer event for callback \a cb. The timer is
98 initially disabled. Use the timeout() member to set the
100 \param[in] name Descriptive timer name (purely
102 \param[in] cb Callback to call. */
106 ///////////////////////////////////////////////////////////////////////////
108 void disable(); ///< Disable timer
109 void enable(); ///< Enable timer
111 void action(Callback const & cb); ///< Change timer event callback
112 void timeout(ClockService::clock_type timeout, bool initiallyEnabled=true);
113 ///< Re-arm or move timeout
114 /**< \param[in] timeout new timeout time
115 \param[in] initiallyEnabled if set \c false, do not
116 enable callback automatically. */
117 ClockService::clock_type timeout() const;
118 ///< Get current/last timeout value
121 virtual void v_run();
122 virtual char const * v_type() const;
123 virtual std::string v_info() const;
126 ClockService::clock_type timeout_;
128 friend class detail::TimerDispatcher;
129 friend class detail::TimerSetCompare;
134 ///////////////////////////////hh.e////////////////////////////////////////
135 #include "TimerEvent.cci"
136 //#include "TimerEvent.ct"
137 //#include "TimerEvent.cti"
144 // comment-column: 40
145 // c-file-style: "senf"
146 // indent-tabs-mode: nil
147 // ispell-local-dictionary: "american"
148 // compile-command: "scons -u test"