Restructure internal Scheduler callback representation
[senf.git] / Scheduler / Scheduler.hh
1 // $Id$
2 //
3 // Copyright (C) 2006 
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
7 //
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.
12 //
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.
17 //
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.
22
23 #ifndef HH_Scheduler_
24 #define HH_Scheduler_ 1
25
26 // Custom includes
27 #include <map>
28 #include <boost/function.hpp>
29 #include <boost/utility.hpp>
30 #include <boost/call_traits.hpp>
31
32 //#include "scheduler.mpp"
33 ///////////////////////////////hh.p////////////////////////////////////////
34
35 namespace satcom {
36 namespace lib {
37
38     /** \brief Singleton class to manage the event loop
39
40         This class manages a single select() type event loop. A
41         customer of this class may register any number of file
42         descriptiors with this class and pass callback functions to be
43         called on input, output or error. This functions are specified
44         using boost::function objects
45       */
46     class Scheduler
47         : boost::noncopyable
48     {
49     public:
50         ///////////////////////////////////////////////////////////////////////////
51         // Types
52
53         enum EventId { EV_NONE=0, 
54                        EV_READ=1, EV_PRIO=2, EV_WRITE=4, EV_HUP=8, EV_ERR=16, 
55                        EV_ALL=31 };
56
57         template <class Handle>
58         struct GenericCallback {
59             typedef boost::function<void (typename boost::call_traits<Handle>::param_type,
60                                           EventId) > Callback;
61         };
62
63         ///////////////////////////////////////////////////////////////////////////
64         ///\name Structors and default members
65         ///@{
66
67         // private default constructor
68         // no copy constructor
69         // no copy assignment
70         // default destructor
71         // no conversion constructors
72
73         static Scheduler & instance();
74
75         ///@}
76         ///////////////////////////////////////////////////////////////////////////
77
78         template <class Handle>
79         void add(Handle const & handle, 
80                  typename GenericCallback<Handle>::Callback const & cb,
81                  EventId eventMask = EV_ALL);
82         template <class Handle>
83         void remove(Handle const & handle, EventId eventMask = EV_ALL);
84
85         void process();
86
87         void terminate();
88
89     protected:
90
91     private:
92         Scheduler();
93  
94         typedef boost::function<void (EventId)> InternalCallback;
95         
96         void do_add(int fd, InternalCallback const & cb, EventId eventMask = EV_ALL);
97         void do_remove(int fd, EventId eventMask = EV_ALL);
98         
99         struct EventSpec 
100         {
101             InternalCallback cb_read;
102             InternalCallback cb_prio;
103             InternalCallback cb_write;
104             InternalCallback cb_hup;
105             InternalCallback cb_err;
106
107             int epollMask() const;
108         };
109         
110         typedef std::map<int,EventSpec> FdTable;
111
112         FdTable fdTable_;
113         int epollFd_;
114         bool terminate_;
115     };
116
117     int retrieve_filehandle(int fd);
118
119 }}
120
121 ///////////////////////////////hh.e////////////////////////////////////////
122 #include "Scheduler.cci"
123 #include "Scheduler.ct"
124 #include "Scheduler.cti"
125 #endif
126
127 \f
128 // Local Variables:
129 // mode: c++
130 // c-file-style: "satcom"
131 // End: