Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others. 4 : // This program and the accompanying materials are made available under the 5 : // terms of the Eclipse Public License 2.0 which is available at 6 : // https://www.eclipse.org/legal/epl-2.0/ 7 : // This Source Code may also be made available under the following Secondary 8 : // Licenses when the conditions for such availability set forth in the Eclipse 9 : // Public License 2.0 are satisfied: GNU General Public License, version 2 10 : // or later which is available at 11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html 12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later 13 : /****************************************************************************/ 14 : /// @file sumo_main.cpp 15 : /// @author Daniel Krajzewicz 16 : /// @author Jakob Erdmann 17 : /// @author Axel Wegener 18 : /// @author Thimor Bohn 19 : /// @author Michael Behrisch 20 : /// @date Tue, 20 Nov 2001 21 : /// 22 : // Main for SUMO 23 : /****************************************************************************/ 24 : #include <config.h> 25 : 26 : #ifdef HAVE_VERSION_H 27 : #include <version.h> 28 : #endif 29 : 30 : #include <csignal> 31 : #include <netload/NLBuilder.h> 32 : #include <utils/common/MsgHandler.h> 33 : #include <utils/common/SystemFrame.h> 34 : #include <utils/options/OptionsIO.h> 35 : #include <utils/xml/XMLSubSys.h> 36 : #include <traci-server/TraCIServer.h> 37 : 38 : 39 : // =========================================================================== 40 : // functions 41 : // =========================================================================== 42 : void 43 10 : signalHandler(int signum) { 44 10 : if (MSNet::hasInstance()) { 45 10 : switch (signum) { 46 10 : case SIGINT: 47 : case SIGTERM: 48 10 : if (MSNet::getInstance()->isInterrupted()) { 49 0 : std::cout << TL("Another interrupt signal received, hard exit.") << std::endl; 50 0 : exit(signum); 51 : } 52 10 : std::cout << TL("Interrupt signal received, trying to exit gracefully.") << std::endl; 53 10 : MSNet::getInstance()->interrupt(); 54 : break; 55 : #ifndef WIN32 56 : case SIGUSR1: 57 0 : std::cout << "Step #" << SIMSTEP << std::endl; 58 0 : std::cout << MSNet::getInstance()->generateStatistics(string2time(OptionsCont::getOptions().getString("begin")), 59 : SysUtils::getCurrentMillis()) << std::endl; 60 0 : break; 61 : case SIGUSR2: 62 : //TODO reload sim 63 : break; 64 : #endif 65 : default: 66 : break; 67 : } 68 : } 69 10 : } 70 : 71 : 72 : /* ------------------------------------------------------------------------- 73 : * main 74 : * ----------------------------------------------------------------------- */ 75 : int 76 28513 : main(int argc, char** argv) { 77 28513 : signal(SIGINT, signalHandler); 78 28513 : signal(SIGTERM, signalHandler); 79 : #ifndef WIN32 80 28513 : signal(SIGUSR1, signalHandler); 81 28513 : signal(SIGUSR2, signalHandler); 82 : #endif 83 : 84 28513 : OptionsCont& oc = OptionsCont::getOptions(); 85 : // give some application descriptions 86 28513 : oc.setApplicationDescription(TL("A microscopic, multi-modal traffic simulation.")); 87 57026 : oc.setApplicationName("sumo", "Eclipse SUMO sumo Version " VERSION_STRING); 88 28513 : gSimulation = true; 89 : int ret = 0; 90 : MSNet* net = nullptr; 91 : try { 92 : // initialise subsystems 93 28513 : XMLSubSys::init(); 94 28513 : OptionsIO::setArgs(argc, argv); 95 : // load the net 96 : MSNet::SimulationState state = MSNet::SIMSTATE_LOADING; 97 54177 : while (state == MSNet::SIMSTATE_LOADING) { 98 28530 : net = NLBuilder::init(); 99 26435 : if (net != nullptr) { 100 52480 : state = net->simulate(string2time(oc.getString("begin")), string2time(oc.getString("end"))); 101 25664 : delete net; 102 : } else { 103 : break; 104 : } 105 : // flush warnings and prepare reinit of all outputs 106 25664 : MsgHandler::getWarningInstance()->clear(); 107 25664 : OutputDevice::closeAll(); 108 25664 : MsgHandler::cleanupOnEnd(); 109 : } 110 2383 : } catch (const ProcessError& e) { 111 4882 : if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) { 112 1638 : WRITE_ERROR(e.what()); 113 : } 114 2383 : MsgHandler::getErrorInstance()->inform(TL("Quitting (on error)."), false); 115 : // we need to delete the network explicitly to trigger the cleanup in the correct order 116 2383 : delete net; 117 : ret = 1; 118 : #ifndef _DEBUG 119 2383 : } catch (const std::exception& e) { 120 0 : if (std::string(e.what()) != std::string("")) { 121 0 : WRITE_ERROR(e.what()); 122 : } 123 0 : MsgHandler::getErrorInstance()->inform(TL("Quitting (on error)."), false); 124 : ret = 1; 125 0 : } catch (...) { 126 0 : MsgHandler::getErrorInstance()->inform(TL("Quitting (on unknown error)."), false); 127 : ret = 1; 128 : #endif 129 0 : } 130 28513 : TraCIServer::close(); 131 28513 : SystemFrame::close(); 132 : return ret; 133 : } 134 : 135 : 136 : /****************************************************************************/