LCOV - code coverage report
Current view: top level - src - sumo_main.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 35 46 76.1 %
Date: 2024-05-04 15:27:10 Functions: 2 2 100.0 %

          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             : /****************************************************************************/

Generated by: LCOV version 1.14