From d093a9422b098548b91d025751beceabcb4bea2b Mon Sep 17 00:00:00 2001 From: curt Date: Fri, 22 May 1998 21:14:53 +0000 Subject: [PATCH] Rewrote event.cxx in C++ as a class using STL for the internal event list and run queue this removes the arbitrary list sizes and makes things much more dynamic. Because this is C++-classified we can now have multiple event_tables if we'd ever want them. --- Time/event.cxx | 455 ++++++++++++++++++++--------------------------- Time/event.hxx | 192 ++++++++++++-------- Time/fg_time.hxx | 8 +- 3 files changed, 323 insertions(+), 332 deletions(-) diff --git a/Time/event.cxx b/Time/event.cxx index 146401525..15acbd6c3 100644 --- a/Time/event.cxx +++ b/Time/event.cxx @@ -1,27 +1,25 @@ -/************************************************************************** - * event.c -- Flight Gear periodic event scheduler - * - * Written by Curtis Olson, started December 1997. - * - * Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - * (Log is kept at end of this file) - **************************************************************************/ +// event.cxx -- Flight Gear periodic event scheduler +// +// Written by Curtis Olson, started December 1997. +// +// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ +// (Log is kept at end of this file) #ifdef HAVE_CONFIG_H @@ -36,132 +34,38 @@ #endif #if defined( HAVE_WINDOWS_H ) && defined(__MWERKS__) -# include /* For Metrowerks environment */ -# include /* There is no ANSI/MSL time function that */ - /* contains milliseconds */ +# include // For Metrowerks environment +# include // There is no ANSI/MSL time function that + // contains milliseconds #endif #include #include "event.hxx" -#include "fg_time.hxx" +fgEVENT_MGR global_events; -#define MAX_EVENTS 100 /* size of event table */ -#define MAX_RUN_QUEUE 100 /* size of run queue */ - -struct fgEVENT { - char description[256]; - - void (*event)( void ); /* pointer to function */ - int status; /* status flag */ - - long interval; /* interval in ms between each iteration of this event */ - - fg_timestamp last_run; - fg_timestamp current; - fg_timestamp next_run; - - long cum_time; /* cumulative processor time of this event */ - long min_time; /* time of quickest execution */ - long max_time; /* time of slowest execution */ - long count; /* number of times executed */ -}; - - -/* Event table */ -struct fgEVENT events[MAX_EVENTS]; -int event_ptr; - - -/* Run Queue */ -int queue[MAX_RUN_QUEUE]; -int queue_front; -int queue_end; - - -/* initialize the run queue */ -void initq( void ) { - queue_front = queue_end = 0; -} - - -/* return queue empty status */ -int emptyq( void ) { - if ( queue_front == queue_end ) { - return(1); - } else { - return(0); - } -} - - -/* return queue full status */ -int fullq( void ) { - if ( (queue_end + 1) % MAX_RUN_QUEUE == queue_front ) { - return(1); - } else { - return(0); - } -} - - -/* add a member to the back of the queue */ -void addq(int ptr) { - if ( !fullq() ) { - queue[queue_end] = ptr; - events[ptr].status = FG_EVENT_QUEUED; - - queue_end = (queue_end + 1) % MAX_RUN_QUEUE; - } else { - printf("RUN QUEUE FULL!!!\n"); - } - - /* printf("Queued function %d (%d %d)\n", ptr, queue_front, queue_end); */ -} - - -/* remove a member from the front of the queue */ -int popq( void ) { - int ptr; - - if ( emptyq() ) { - printf("PANIC: RUN QUEUE IS EMPTY!!!\n"); - ptr = 0; - } else { - ptr = queue[queue_front]; - /* printf("Popped position %d = %d\n", queue_front, ptr); */ - queue_front = (queue_front + 1) % MAX_RUN_QUEUE; - } - - return(ptr); -} - - -/* run a specified event */ -void fgEventRun(int ptr) { - struct fgEVENT *e; +// run a specified event +static void RunEvent(fgEVENT *e) { long duration; - e = &events[ptr]; - printf("Running %s\n", e->description); - /* record starting time */ + // record starting time timestamp(&(e->last_run)); - /* run the event */ + // run the event (*e->event)(); - /* increment the counter for this event */ + // increment the counter for this event e->count++; - /* update the event status */ + // update the event status e->status = FG_EVENT_READY; - /* calculate duration and stats */ + // calculate duration and stats timestamp(&(e->current)); duration = timediff(&(e->last_run), &(e->current)); @@ -175,189 +79,220 @@ void fgEventRun(int ptr) { e->max_time = duration; } - /* determine the next absolute run time */ + // determine the next absolute run time timesum(&(e->next_run), &(e->last_run), e->interval); } -/* Initialize the scheduling subsystem */ -void fgEventInit( void ) { +// Constructor +fgEVENT_MGR::fgEVENT_MGR( void ) { +} + + +// Initialize the scheduling subsystem +void fgEVENT_MGR::Init( void ) { printf("Initializing event manager\n"); - event_ptr = 0; - initq(); + // clear event table + while ( event_table.size() ) { + event_table.pop_front(); + } + + // clear run queue + while ( run_queue.size() ) { + run_queue.pop_front(); + } } -/* Register an event with the scheduler, returns a pointer into the - * event table */ -int fgEventRegister(char *desc, void (*event)( void ), int status, +// Register an event with the scheduler +void fgEVENT_MGR::Register(char *desc, void (*event)( void ), int status, int interval) { - struct fgEVENT *e; - - e = &events[event_ptr]; + fgEVENT e; printf("Registering event: %s\n", desc); if ( strlen(desc) < 256 ) { - strcpy(e->description, desc); + strcpy(e.description, desc); } else { - strncpy(e->description, desc, 255); - e->description[255] = '\0'; + strncpy(e.description, desc, 255); + e.description[255] = '\0'; } - e->event = event; - e->status = status; - e->interval = interval; - - e->cum_time = 0; - e->min_time = 100000; - e->max_time = 0; - e->count = 0; + e.event = event; + e.status = status; + e.interval = interval; - /* Actually run the event */ - fgEventRun(event_ptr); + e.cum_time = 0; + e.min_time = 100000; + e.max_time = 0; + e.count = 0; - event_ptr++; + // Actually run the event + RunEvent(&e); - return(event_ptr - 1); + // Now add to event_table + event_table.push_back(e); } -/* Update the scheduling parameters for an event */ -void fgEventUpdate( void ) { +// Update the scheduling parameters for an event +void fgEVENT_MGR::Update( void ) { } -/* Delete a scheduled event */ -void fgEventDelete( void ) { +// Delete a scheduled event +void fgEVENT_MGR::Delete( void ) { } -/* Temporarily suspend scheduling of an event */ -void fgEventSuspend( void ) { +// Temporarily suspend scheduling of an event +void fgEVENT_MGR::Suspend( void ) { } -/* Resume scheduling and event */ -void fgEventResume( void ) { +// Resume scheduling and event +void fgEVENT_MGR::Resume( void ) { } -/* Dump scheduling stats */ -void fgEventPrintStats( void ) { - int i; - - if ( event_ptr > 0 ) { - printf("\n"); - printf("Event Stats\n"); - printf("-----------\n"); - - for ( i = 0; i < event_ptr; i++ ) { - printf(" %-20s int=%.2fs cum=%ld min=%ld max=%ld count=%ld ave=%.2f\n", - events[i].description, - events[i].interval / 1000.0, - events[i].cum_time, - events[i].min_time, events[i].max_time, events[i].count, - events[i].cum_time / (double)events[i].count); - } - printf("\n"); +// Dump scheduling stats +void fgEVENT_MGR::PrintStats( void ) { + deque < fgEVENT > :: iterator current = event_table.begin(); + deque < fgEVENT > :: iterator last = event_table.end(); + fgEVENT e; + + printf("\n"); + printf("Event Stats\n"); + printf("-----------\n"); + + while ( current != last ) { + e = *current++; + printf(" %-20s int=%.2fs cum=%ld min=%ld max=%ld count=%ld ave=%.2f\n", + e.description, + e.interval / 1000.0, + e.cum_time, e.min_time, e.max_time, e.count, + e.cum_time / (double)e.count); } + + printf("\n"); } -/* Add pending jobs to the run queue and run the job at the front of - * the queue */ -void fgEventProcess( void ) { - fg_timestamp current; - int i; +// Add pending jobs to the run queue and run the job at the front of +// the queue +void fgEVENT_MGR::Process( void ) { + fgEVENT *e_ptr; + fg_timestamp cur_time; + unsigned int i, size; fgPrintf(FG_EVENT, FG_DEBUG, "Processing events\n"); - /* get the current time */ - timestamp(¤t); + // get the current time + timestamp(&cur_time); - fgPrintf(FG_EVENT, FG_DEBUG, " Current timestamp = %ld\n", current.seconds); + fgPrintf( FG_EVENT, FG_DEBUG, + " Current timestamp = %ld\n", cur_time.seconds); - /* printf("Checking if anything is ready to move to the run queue\n"); */ + // printf("Checking if anything is ready to move to the run queue\n"); - /* see if anything else is ready to be placed on the run queue */ - for ( i = 0; i < event_ptr; i++ ) { - if ( events[i].status == FG_EVENT_READY ) { + // see if anything else is ready to be placed on the run queue + size = event_table.size(); + // while ( current != last ) { + for ( i = 0; i < size; i++ ) { + // e = *current++; + e_ptr = &event_table[i]; + if ( e_ptr->status == FG_EVENT_READY ) { fgPrintf(FG_EVENT, FG_DEBUG, " Item %d, current %d, next run @ %ld\n", - i, current.seconds, events[i].next_run.seconds); - if ( timediff(¤t, &(events[i].next_run)) <= 0) { - addq(i); + i, cur_time.seconds, e_ptr->next_run.seconds); + if ( timediff(&cur_time, &(e_ptr->next_run)) <= 0) { + run_queue.push_back(e_ptr); + e_ptr->status = FG_EVENT_QUEUED; } } } - /* Checking to see if there is anything on the run queue */ - /* printf("Checking to see if there is anything on the run queue\n"); */ - if ( !emptyq() ) { - /* printf("Yep, running it\n"); */ - i = popq(); - fgEventRun(i); + // Checking to see if there is anything on the run queue + // printf("Checking to see if there is anything on the run queue\n"); + if ( run_queue.size() ) { + // printf("Yep, running it\n"); + e_ptr = run_queue.front(); + run_queue.pop_front(); + RunEvent(e_ptr); } } -/* $Log$ -/* Revision 1.2 1998/04/25 22:06:33 curt -/* Edited cvs log messages in source files ... bad bad bad! -/* - * Revision 1.1 1998/04/24 00:52:26 curt - * Wrapped "#include " in "#ifdef HAVE_CONFIG_H" - * Fog color fixes. - * Separated out lighting calcs into their own file. - * - * Revision 1.13 1998/04/18 04:14:08 curt - * Moved fg_debug.c to it's own library. - * - * Revision 1.12 1998/04/09 18:40:13 curt - * We had unified some of the platform disparate time handling code, and - * there was a bug in timesum() which calculated a new time stamp based on - * the current time stamp + offset. This hosed the periodic event processing - * logic because you'd never arrive at the time the event was scheduled for. - * Sky updates and lighting changes are handled via this event mechanism so - * they never changed ... it is fixed now. - * - * Revision 1.11 1998/04/03 22:12:55 curt - * Converting to Gnu autoconf system. - * Centralized time handling differences. - * - * Revision 1.10 1998/03/14 00:28:34 curt - * replaced a printf() with an fgPrintf(). - * - * Revision 1.9 1998/01/31 00:43:44 curt - * Added MetroWorks patches from Carmen Volpe. - * - * Revision 1.8 1998/01/27 00:48:05 curt - * Incorporated Paul Bleisch's new debug message - * system and commandline/config file processing code. - * - * Revision 1.7 1998/01/19 19:27:19 curt - * Merged in make system changes from Bob Kuehne - * This should simplify things tremendously. - * - * Revision 1.6 1998/01/19 18:40:39 curt - * Tons of little changes to clean up the code and to remove fatal errors - * when building with the c++ compiler. - * - * Revision 1.5 1998/01/06 01:20:27 curt - * Tweaks to help building with MSVC++ - * - * Revision 1.4 1997/12/31 17:46:50 curt - * Tweaked fg_time.c to be able to use ftime() instead of gettimeofday() - * - * Revision 1.3 1997/12/30 22:22:42 curt - * Further integration of event manager. - * - * Revision 1.2 1997/12/30 20:47:58 curt - * Integrated new event manager with subsystem initializations. - * - * Revision 1.1 1997/12/30 04:19:22 curt - * Initial revision. - * - */ +// Destructor +fgEVENT_MGR::~fgEVENT_MGR( void ) { +} + + +void fgEventPrintStats( void ) { + global_events.PrintStats(); +} + + +// $Log$ +// Revision 1.3 1998/05/22 21:14:53 curt +// Rewrote event.cxx in C++ as a class using STL for the internal event list +// and run queue this removes the arbitrary list sizes and makes things much +// more dynamic. Because this is C++-classified we can now have multiple +// event_tables if we'd ever want them. +// +// Revision 1.2 1998/04/25 22:06:33 curt +// Edited cvs log messages in source files ... bad bad bad! +// +// Revision 1.1 1998/04/24 00:52:26 curt +// Wrapped "#include " in "#ifdef HAVE_CONFIG_H" +// Fog color fixes. +// Separated out lighting calcs into their own file. +// +// Revision 1.13 1998/04/18 04:14:08 curt +// Moved fg_debug.c to it's own library. +// +// Revision 1.12 1998/04/09 18:40:13 curt +// We had unified some of the platform disparate time handling code, and +// there was a bug in timesum() which calculated a new time stamp based on +// the current time stamp + offset. This hosed the periodic event processing +// logic because you'd never arrive at the time the event was scheduled for. +// Sky updates and lighting changes are handled via this event mechanism so +// they never changed ... it is fixed now. +// +// Revision 1.11 1998/04/03 22:12:55 curt +// Converting to Gnu autoconf system. +// Centralized time handling differences. +// +// Revision 1.10 1998/03/14 00:28:34 curt +// replaced a printf() with an fgPrintf(). +// +// Revision 1.9 1998/01/31 00:43:44 curt +// Added MetroWorks patches from Carmen Volpe. +// +// Revision 1.8 1998/01/27 00:48:05 curt +// Incorporated Paul Bleisch's new debug message +// system and commandline/config file processing code. +// +// Revision 1.7 1998/01/19 19:27:19 curt +// Merged in make system changes from Bob Kuehne +// This should simplify things tremendously. +// +// Revision 1.6 1998/01/19 18:40:39 curt +// Tons of little changes to clean up the code and to remove fatal errors +// when building with the c++ compiler. +// +// Revision 1.5 1998/01/06 01:20:27 curt +// Tweaks to help building with MSVC++ +// +// Revision 1.4 1997/12/31 17:46:50 curt +// Tweaked fg_time.c to be able to use ftime() instead of gettimeofday() +// +// Revision 1.3 1997/12/30 22:22:42 curt +// Further integration of event manager. +// +// Revision 1.2 1997/12/30 20:47:58 curt +// Integrated new event manager with subsystem initializations. +// +// Revision 1.1 1997/12/30 04:19:22 curt +// Initial revision. diff --git a/Time/event.hxx b/Time/event.hxx index af16b9bbd..8fda92eaa 100644 --- a/Time/event.hxx +++ b/Time/event.hxx @@ -1,27 +1,25 @@ -/************************************************************************** - * event.hxx -- Flight Gear periodic event scheduler - * - * Written by Curtis Olson, started December 1997. - * - * Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Id$ - * (Log is kept at end of this file) - **************************************************************************/ +// event.hxx -- Flight Gear periodic event scheduler +// +// Written by Curtis Olson, started December 1997. +// +// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ +// (Log is kept at end of this file) #ifndef _EVENT_HXX @@ -33,63 +31,115 @@ #endif +#include // STL double ended queue +#include // STL list + +#include "fg_time.hxx" + + #define FG_EVENT_SUSP 0 #define FG_EVENT_READY 1 #define FG_EVENT_QUEUED 2 -/* Initialize the scheduling subsystem */ -void fgEventInit( void ); +typedef struct { + char description[256]; + + void (*event)( void ); // pointer to function + int status; // status flag + + long interval; // interval in ms between each iteration of this event + + fg_timestamp last_run; + fg_timestamp current; + fg_timestamp next_run; + + long cum_time; // cumulative processor time of this event + long min_time; // time of quickest execution + long max_time; // time of slowest execution + long count; // number of times executed +} fgEVENT; + + +class fgEVENT_MGR { + + // Event table + deque < fgEVENT > event_table; -/* Register an event with the scheduler, returns a pointer into the - * event table */ -int fgEventRegister(char *desc, void (*event)( void ), int status, - int interval); + // Run Queue + list < fgEVENT * > run_queue; -/* Update the scheduling parameters for an event */ -void fgEventUpdate( void ); +public: -/* Delete a scheduled event */ -void fgEventDelete( void ); + // Constructor + fgEVENT_MGR ( void ); -/* Temporarily suspend scheduling of an event */ -void fgEventSuspend( void ); + // Initialize the scheduling subsystem + void Init( void ); -/* Resume scheduling and event */ -void fgEventResume( void ); + // Register an event with the scheduler + void Register(char *desc, void (*event)( void ), int status, + int interval); -/* Dump scheduling stats */ + // Update the scheduling parameters for an event + void Update( void ); + + // Delete a scheduled event + void Delete( void ); + + // Temporarily suspend scheduling of an event + void Suspend( void ); + + // Resume scheduling and event + void Resume( void ); + + // Dump scheduling stats + void PrintStats( void ); + + // Add pending jobs to the run queue and run the job at the front + // of the queue + void Process( void ); + + // Destructor + ~fgEVENT_MGR ( void ); +}; + + +// Wrapper to dump scheduling stats void fgEventPrintStats( void ); -/* Add pending jobs to the run queue and run the job at the front of - * the queue */ -void fgEventProcess( void ); - - -#endif /* _EVENT_HXX */ - - -/* $Log$ -/* Revision 1.1 1998/04/24 00:52:26 curt -/* Wrapped "#include " in "#ifdef HAVE_CONFIG_H" -/* Fog color fixes. -/* Separated out lighting calcs into their own file. -/* - * Revision 1.4 1998/04/21 17:01:43 curt - * Fixed a problems where a pointer to a function was being passed around. In - * one place this functions arguments were defined as ( void ) while in another - * place they were defined as ( int ). The correct answer was ( int ). - * - * Prepairing for C++ integration. - * - * Revision 1.3 1998/01/22 02:59:43 curt - * Changed #ifdef FILE_H to #ifdef _FILE_H - * - * Revision 1.2 1998/01/19 18:40:39 curt - * Tons of little changes to clean up the code and to remove fatal errors - * when building with the c++ compiler. - * - * Revision 1.1 1997/12/30 04:19:22 curt - * Initial revision. - * - */ +extern fgEVENT_MGR global_events; + + +#endif // _EVENT_HXX + + +// $Log$ +// Revision 1.2 1998/05/22 21:14:54 curt +// Rewrote event.cxx in C++ as a class using STL for the internal event list +// and run queue this removes the arbitrary list sizes and makes things much +// more dynamic. Because this is C++-classified we can now have multiple +// event_tables if we'd ever want them. +// +// Revision 1.1 1998/04/24 00:52:26 curt +// Wrapped "#include " in "#ifdef HAVE_CONFIG_H" +// Fog color fixes. +// Separated out lighting calcs into their own file. +// +// Revision 1.4 1998/04/21 17:01:43 curt +// Fixed a problems where a pointer to a function was being passed around. In +// one place this functions arguments were defined as ( void ) while in another +// place they were defined as ( int ). The correct answer was ( int ). +// +// Prepairing for C++ integration. +// +// Revision 1.3 1998/01/22 02:59:43 curt +// Changed #ifdef FILE_H to #ifdef _FILE_H +// +// Revision 1.2 1998/01/19 18:40:39 curt +// Tons of little changes to clean up the code and to remove fatal errors +// when building with the c++ compiler. +// +// Revision 1.1 1997/12/30 04:19:22 curt +// Initial revision. + diff --git a/Time/fg_time.hxx b/Time/fg_time.hxx index 8e5c01913..d205c425c 100644 --- a/Time/fg_time.hxx +++ b/Time/fg_time.hxx @@ -85,7 +85,7 @@ typedef struct { extern fgTIME cur_time_params; -typedef struct fg_timestamp_t { +typedef struct { long seconds; long millis; } fg_timestamp; @@ -115,6 +115,12 @@ void fgTimeUpdate(fgFLIGHT *f, fgTIME *t); // $Log$ +// Revision 1.5 1998/05/22 21:14:54 curt +// Rewrote event.cxx in C++ as a class using STL for the internal event list +// and run queue this removes the arbitrary list sizes and makes things much +// more dynamic. Because this is C++-classified we can now have multiple +// event_tables if we'd ever want them. +// // Revision 1.4 1998/04/28 01:22:17 curt // Type-ified fgTIME and fgVIEW. // -- 2.39.2