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 #include <Include/compiler.h>
35 #include <Include/fg_callback.hxx>
37 #include <deque> // STL double ended queue
38 #include <list> // STL list
41 #include "fg_time.hxx"
42 #include "timestamp.hxx"
59 friend class fgEVENT_MGR;
61 fgEVENT() {} // Required by deque<>.
63 fgEVENT( const string& desc,
65 EventState evt_status,
72 // void PrintStats() const;
73 int PrintStats() const;
77 fgEVENT( const fgEVENT& evt );
78 fgEVENT& operator= ( const fgEVENT& evt );
84 // The callback object.
87 EventState status; // status flag
89 long interval; // interval in ms between each iteration of this event
95 long cum_time; // cumulative processor time of this event
96 long min_time; // time of quickest execution
97 long max_time; // time of slowest execution
98 long count; // number of times executed
105 typedef deque < fgEVENT* > EventContainer;
106 typedef EventContainer::iterator EventIterator;
107 typedef EventContainer::const_iterator ConstEventIterator;
109 EventContainer event_table;
112 typedef list < fgEVENT * > RunContainer;
114 RunContainer run_queue;
119 fgEVENT_MGR ( void );
121 // Initialize the scheduling subsystem
124 // Register an event with the scheduler
125 void Register( const string& desc, void (*event)( void ),
126 fgEVENT::EventState status, int interval) {
127 Register( desc, fgFunctionCallback(event), status, interval );
130 void Register( const string& desc,
131 const fgCallback& cb,
132 fgEVENT::EventState status,
135 // Update the scheduling parameters for an event
138 // Delete a scheduled event
141 // Temporarily suspend scheduling of an event
142 void Suspend( void );
144 // Resume scheduling and event
147 // Dump scheduling stats
148 void PrintStats( void );
150 // Add pending jobs to the run queue and run the job at the front
152 void Process( void );
155 ~fgEVENT_MGR ( void );
159 // Wrapper to dump scheduling stats
160 void fgEventPrintStats( void );
162 extern fgEVENT_MGR global_events;
169 // Revision 1.1 1999/04/05 21:32:47 curt
172 // Revision 1.18 1999/03/02 01:03:33 curt
173 // Tweaks for building with native SGI compilers.
175 // Revision 1.17 1999/02/26 22:10:08 curt
176 // Added initial support for native SGI compilers.
178 // Revision 1.16 1999/01/09 13:37:43 curt
179 // Convert fgTIMESTAMP to FGTimeStamp which holds usec instead of ms.
181 // Revision 1.15 1999/01/07 20:25:33 curt
182 // Portability changes and updates from Bernie Bright.
184 // Revision 1.14 1998/12/05 14:21:28 curt
185 // Moved struct fg_timestamp to class fgTIMESTAMP and moved it's definition
186 // to it's own file, timestamp.hxx.
188 // Revision 1.13 1998/12/04 01:32:47 curt
189 // Converted "struct fg_timestamp" to "class fgTIMESTAMP" and added some
190 // convenience inline operators.
192 // Revision 1.12 1998/10/16 00:56:08 curt
193 // Converted to Point3D class.
195 // Revision 1.11 1998/09/15 02:09:30 curt
196 // Include/fg_callback.hxx
197 // Moved code inline to stop g++ 2.7 from complaining.
199 // Simulator/Time/event.[ch]xx
200 // Changed return type of fgEVENT::printStat(). void caused g++ 2.7 to
201 // complain bitterly.
203 // Minor bugfix and changes.
205 // Simulator/Main/GLUTmain.cxx
206 // Added missing type to idle_state definition - eliminates a warning.
208 // Simulator/Main/fg_init.cxx
209 // Changes to airport lookup.
211 // Simulator/Main/options.cxx
212 // Uses fg_gzifstream when loading config file.
214 // Revision 1.10 1998/09/08 21:41:06 curt
215 // Added constructor for fgEVENT.
217 // Revision 1.9 1998/09/02 14:37:45 curt
218 // Renamed struct -> class.
220 // Revision 1.8 1998/08/29 13:11:32 curt
221 // Bernie Bright writes:
222 // I've created some new classes to enable pointers-to-functions and
223 // pointers-to-class-methods to be treated like objects. These objects
224 // can be registered with fgEVENT_MGR.
226 // File "Include/fg_callback.hxx" contains the callback class defns.
228 // Modified fgEVENT and fgEVENT_MGR to use the callback classes. Also
229 // some minor tweaks to STL usage.
231 // Added file "Include/fg_stl_config.h" to deal with STL portability
232 // issues. I've added an initial config for egcs (and probably gcc-2.8.x).
233 // I don't have access to Visual C++ so I've left that for someone else.
234 // This file is influenced by the stl_config.h file delivered with egcs.
236 // Added "Include/auto_ptr.hxx" which contains an implementation of the
237 // STL auto_ptr class which is not provided in all STL implementations
238 // and is needed to use the callback classes.
240 // Deleted fgLightUpdate() which was just a wrapper to call
241 // fgLIGHT::Update().
243 // Modified fg_init.cxx to register two method callbacks in place of the
244 // old wrapper functions.
246 // Revision 1.7 1998/07/30 23:48:54 curt
250 // Revision 1.6 1998/07/24 21:42:25 curt
251 // Output message tweaks.
253 // Revision 1.5 1998/07/13 21:02:07 curt
254 // Wrote access functions for current fgOPTIONS.
256 // Revision 1.4 1998/06/12 00:59:52 curt
257 // Build only static libraries.
258 // Declare memmove/memset for Sloaris.
259 // Rewrote fg_time.c routine to get LST start seconds to better handle
260 // Solaris, and be easier to port, and understand the GMT vs. local
263 // Revision 1.3 1998/06/03 00:48:12 curt
264 // No .h for STL includes.
266 // Revision 1.2 1998/05/22 21:14:54 curt
267 // Rewrote event.cxx in C++ as a class using STL for the internal event list
268 // and run queue this removes the arbitrary list sizes and makes things much
269 // more dynamic. Because this is C++-classified we can now have multiple
270 // event_tables if we'd ever want them.
272 // Revision 1.1 1998/04/24 00:52:26 curt
273 // Wrapped "#include <config.h>" in "#ifdef HAVE_CONFIG_H"
275 // Separated out lighting calcs into their own file.
277 // Revision 1.4 1998/04/21 17:01:43 curt
278 // Fixed a problems where a pointer to a function was being passed around. In
279 // one place this functions arguments were defined as ( void ) while in another
280 // place they were defined as ( int ). The correct answer was ( int ).
282 // Prepairing for C++ integration.
284 // Revision 1.3 1998/01/22 02:59:43 curt
285 // Changed #ifdef FILE_H to #ifdef _FILE_H
287 // Revision 1.2 1998/01/19 18:40:39 curt
288 // Tons of little changes to clean up the code and to remove fatal errors
289 // when building with the c++ compiler.
291 // Revision 1.1 1997/12/30 04:19:22 curt