diff -r 000000000000 -r 2b3e5ec03512 sim/Simulator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sim/Simulator.h Thu Apr 21 14:57:45 2011 +0100 @@ -0,0 +1,116 @@ +/* + * Copyright 2004-2006 Intel Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "SimEvent.h" +#include "SimEventHandler.h" + +namespace dtnsim { + +/** + * The main simulator class. This defines the main event loop + */ +class Simulator : public oasys::Singleton, + public SimEventHandler, + public oasys::Logger +{ +public: + /** + * Return the current simulator time. + */ + static double time() { return time_; } + + /** + * Constructor. + */ + Simulator(); + + /** + * Destructor. + */ + virtual ~Simulator() {} + + /** + * Add an event to the main event queue. + */ + static void post(SimEvent *e); + + /** + * Stops simulation and exits the loop + */ + void exit(); + + /** + * Main run loop. + */ + void run(); + + /** + * Handle all bundle events at nodes returning the amount of time + * (in ms) until the next timer is due. + */ + int run_node_events(); + + /** + * Pause execution of the simulator, running a console loop until + * it exits. + */ + void pause(); + + /** + * Run the command loop. + */ + void run_console(bool complete); + + /** + * Register a command to run at exit. + */ + void set_exit_event(SimAtEvent* event); + + static double runtill_; ///< time to end the simulation + +private: + /** + * Virtual from SimEventHandler + */ + void process(SimEvent* e); + + void log_inqueue_stats(); + + static double time_; ///< current time (static to avoid object) + + std::priority_queue, + SimEventCompare> eventq_; + + SimAtEvent* exit_event_; + + void run_at_event(SimAtEvent* evt); + + /* + * Handlers for SIGINT to pause the simulation while it's running. + */ + static void handle_interrupt(int sig); + void check_interrupt(); + static bool interrupted_; +}; + +} // namespace dtnsim +