4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief EventHook public header */
31 #ifndef HH_SENF_Scheduler_EventHook_
32 #define HH_SENF_Scheduler_EventHook_ 1
35 #include <boost/function.hpp>
36 #include <senf/boost_intrusive/ilist_hook.hpp>
37 #include "FIFORunner.hh"
39 //#include "EventHook.mpp"
40 //-/////////////////////////////////////////////////////////////////////////////////////////////////
46 struct EventHookListTag;
47 typedef boost::intrusive::ilist_base_hook<EventHookListTag> EventHookListBase;
48 class EventHookDispatcher;
51 /** \brief Event hook event
53 This event is special: It is not a real event, it is a kind of hook which is called,
54 whenever any other event is signaled. Combining this with explicit priority specification,
55 this can be used to implement hooks which are called before or after any other callback.
58 void beforeEventHook();
59 void afterEventHook();
61 senf::scheduler::EventHook beforeEventHookEvent (
62 "beforeEventHook", beforeEventHook, true, senf::scheduler::EventHook::POST);
63 senf::scheduler::EventHook afterEventHookEvent (
64 "afterEventHook", afterEventHook, true, senf::scheduler::EventHook::PRE);
67 The EventHook class is an implementation of the RAII idiom: The event will be automatically
68 unregistered in the EventHook destructor. The EventHook instance should be created within
69 the same scope or on a scope below where the callback is defined (e.g. if the callback is a
70 member function it should be defined as a class member).
73 : public detail::FIFORunner::TaskInfo,
74 public detail::EventHookListBase
77 //-////////////////////////////////////////////////////////////////////////
80 typedef boost::function<void ()> Callback;
82 static Priority const PRE = PRIORITY_HIGH; ///< Execute hook BEFORE all other events
83 static Priority const POST = PRIORITY_LOW; ///< Execute hook AFTER all other events
85 //-////////////////////////////////////////////////////////////////////////
86 ///\name Structors and default members
89 EventHook(std::string const & name, Callback const & cb,
90 Priority priority, bool initiallyEnabled = true);
91 ///< Register an event hook
92 /**< Registers \a cb to be called whenever any other event
93 is signaled by the scheduler. If \a initiallyEnabled is
94 set \c false, the callback will not be enabled
95 automatically. Use enable() to do so.
96 \param[in] name Descriptive event name (purely
98 \param[in] cb Callback to call
99 \param[in] initiallyEnabled if set \c false, do not
100 enable callback automatically.
101 \param[in] priority event priority, defaults to
106 //-////////////////////////////////////////////////////////////////////////
108 void disable(); ///< Disable event
109 void enable(); ///< Enable event
111 void action(Callback const & cb); ///< Change event callback
116 virtual void v_run();
117 virtual char const * v_type() const;
118 virtual std::string v_info() const;
122 friend class detail::EventHookDispatcher;
127 //-/////////////////////////////////////////////////////////////////////////////////////////////////
128 #include "EventHook.cci"
129 //#include "EventHook.ct"
130 //#include "EventHook.cti"
137 // comment-column: 40
138 // c-file-style: "senf"
139 // indent-tabs-mode: nil
140 // ispell-local-dictionary: "american"
141 // compile-command: "scons -u test"