1 // event.hxx -- Flight Gear periodic event scheduler
3 // Written by Curtis Olson, started December 1997.
5 // Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 // (Log is kept at end of this file)
30 # error This library requires C++
34 #if defined ( __sun__ ) || defined ( __sgi )
35 extern "C" void *memmove(void *, const void *, size_t);
36 extern "C" void *memset(void *, int, size_t);
40 #include <deque> // STL double ended queue
41 #include <list> // STL list
44 #include "Include/fg_stl_config.h"
46 #ifdef _FG_NEED_AUTO_PTR
47 # include "Include/auto_ptr.hxx"
52 #include "Include/fg_callback.hxx"
54 #ifdef NEEDNAMESPACESTD
58 #include "fg_time.hxx"
71 fgEVENT(); // Required by deque<>.
73 fgEVENT( const string& desc,
78 fgEVENT( const fgEVENT& evt );
84 void PrintStats() const;
90 // The callback object.
91 // We wrap it in an auto_ptr<> because deque<> calls our copy ctor
92 // and dtor when inserting and removing.
93 auto_ptr<fgCallback> event_cb;
95 EventState status; // status flag
97 long interval; // interval in ms between each iteration of this event
99 fg_timestamp last_run;
100 fg_timestamp current;
101 fg_timestamp next_run;
103 long cum_time; // cumulative processor time of this event
104 long min_time; // time of quickest execution
105 long max_time; // time of slowest execution
106 long count; // number of times executed
113 deque < fgEVENT > event_table;
116 list < fgEVENT * > run_queue;
121 fgEVENT_MGR ( void );
123 // Initialize the scheduling subsystem
126 // Register an event with the scheduler
127 void Register( const string& desc, void (*event)( void ),
128 fgEVENT::EventState status, int interval) {
129 Register( desc, fgFunctionCallback(event), status, interval );
132 void Register( const string& desc,
133 const fgCallback& cb,
134 fgEVENT::EventState status,
137 // Update the scheduling parameters for an event
140 // Delete a scheduled event
143 // Temporarily suspend scheduling of an event
144 void Suspend( void );
146 // Resume scheduling and event
149 // Dump scheduling stats
150 void PrintStats( void );
152 // Add pending jobs to the run queue and run the job at the front
154 void Process( void );
157 ~fgEVENT_MGR ( void );
161 // Wrapper to dump scheduling stats
162 void fgEventPrintStats( void );
164 extern fgEVENT_MGR global_events;
171 // Revision 1.10 1998/09/08 21:41:06 curt
172 // Added constructor for fgEVENT.
174 // Revision 1.9 1998/09/02 14:37:45 curt
175 // Renamed struct -> class.
177 // Revision 1.8 1998/08/29 13:11:32 curt
178 // Bernie Bright writes:
179 // I've created some new classes to enable pointers-to-functions and
180 // pointers-to-class-methods to be treated like objects. These objects
181 // can be registered with fgEVENT_MGR.
183 // File "Include/fg_callback.hxx" contains the callback class defns.
185 // Modified fgEVENT and fgEVENT_MGR to use the callback classes. Also
186 // some minor tweaks to STL usage.
188 // Added file "Include/fg_stl_config.h" to deal with STL portability
189 // issues. I've added an initial config for egcs (and probably gcc-2.8.x).
190 // I don't have access to Visual C++ so I've left that for someone else.
191 // This file is influenced by the stl_config.h file delivered with egcs.
193 // Added "Include/auto_ptr.hxx" which contains an implementation of the
194 // STL auto_ptr class which is not provided in all STL implementations
195 // and is needed to use the callback classes.
197 // Deleted fgLightUpdate() which was just a wrapper to call
198 // fgLIGHT::Update().
200 // Modified fg_init.cxx to register two method callbacks in place of the
201 // old wrapper functions.
203 // Revision 1.7 1998/07/30 23:48:54 curt
207 // Revision 1.6 1998/07/24 21:42:25 curt
208 // Output message tweaks.
210 // Revision 1.5 1998/07/13 21:02:07 curt
211 // Wrote access functions for current fgOPTIONS.
213 // Revision 1.4 1998/06/12 00:59:52 curt
214 // Build only static libraries.
215 // Declare memmove/memset for Sloaris.
216 // Rewrote fg_time.c routine to get LST start seconds to better handle
217 // Solaris, and be easier to port, and understand the GMT vs. local
220 // Revision 1.3 1998/06/03 00:48:12 curt
221 // No .h for STL includes.
223 // Revision 1.2 1998/05/22 21:14:54 curt
224 // Rewrote event.cxx in C++ as a class using STL for the internal event list
225 // and run queue this removes the arbitrary list sizes and makes things much
226 // more dynamic. Because this is C++-classified we can now have multiple
227 // event_tables if we'd ever want them.
229 // Revision 1.1 1998/04/24 00:52:26 curt
230 // Wrapped "#include <config.h>" in "#ifdef HAVE_CONFIG_H"
232 // Separated out lighting calcs into their own file.
234 // Revision 1.4 1998/04/21 17:01:43 curt
235 // Fixed a problems where a pointer to a function was being passed around. In
236 // one place this functions arguments were defined as ( void ) while in another
237 // place they were defined as ( int ). The correct answer was ( int ).
239 // Prepairing for C++ integration.
241 // Revision 1.3 1998/01/22 02:59:43 curt
242 // Changed #ifdef FILE_H to #ifdef _FILE_H
244 // Revision 1.2 1998/01/19 18:40:39 curt
245 // Tons of little changes to clean up the code and to remove fatal errors
246 // when building with the c++ compiler.
248 // Revision 1.1 1997/12/30 04:19:22 curt