LCOV - code coverage report
Current view: top level - include/interfaces - PerfGraphInterface.h (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 1 1 100.0 %
Date: 2025-07-17 01:28:37 Functions: 1 2 50.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //* This file is part of the MOOSE framework
       2             : //* https://mooseframework.inl.gov
       3             : //*
       4             : //* All rights reserved, see COPYRIGHT for full restrictions
       5             : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
       6             : //*
       7             : //* Licensed under LGPL 2.1, please see LICENSE for details
       8             : //* https://www.gnu.org/licenses/lgpl-2.1.html
       9             : 
      10             : #pragma once
      11             : 
      12             : #include "Moose.h"
      13             : #include "PerfGuard.h"
      14             : 
      15             : #ifndef MOOSE_NO_PERF_GRAPH
      16             : #define TIME_SECTION1(id)                                                                          \
      17             :   mooseAssert(!Threads::in_threads, "PerfGraph timing cannot be used within threaded sections");   \
      18             :   PerfGuard time_guard(this->_pg_moose_app.perfGraph(), id);
      19             : #define CHECK_TIME_SECTION(id, section_name)                                                       \
      20             :   mooseAssert(moose::internal::getPerfGraphRegistry().sectionInfo(id)._name ==                     \
      21             :                   timedSectionName(section_name),                                                  \
      22             :               "PerfGraph section '" + timedSectionName(section_name) +                             \
      23             :                   "' is already registered with name '" +                                          \
      24             :                   moose::internal::getPerfGraphRegistry().sectionInfo(id)._name + "'");
      25             : #else
      26             : #define TIME_SECTION1(id)
      27             : #define CHECK_TIME_SECTION(id, section_name)
      28             : #endif
      29             : 
      30             : #define TIME_SECTION2(section_name, level)                                                         \
      31             :   const PerfID __perf_id = this->registerTimedSection(section_name, level);                        \
      32             :   CHECK_TIME_SECTION(__perf_id, section_name);                                                     \
      33             :   TIME_SECTION1(__perf_id);
      34             : 
      35             : #define TIME_SECTION3(section_name, level, live_message)                                           \
      36             :   const PerfID __perf_id = this->registerTimedSection(section_name, level, live_message);          \
      37             :   CHECK_TIME_SECTION(__perf_id, section_name);                                                     \
      38             :   TIME_SECTION1(__perf_id);
      39             : 
      40             : #define TIME_SECTION4(section_name, level, live_message, print_dots)                               \
      41             :   const PerfID __perf_id =                                                                         \
      42             :       this->registerTimedSection(section_name, level, live_message, print_dots);                   \
      43             :   CHECK_TIME_SECTION(__perf_id, section_name);                                                     \
      44             :   TIME_SECTION1(__perf_id);
      45             : 
      46             : // Overloading solution from https://stackoverflow.com/a/11763277
      47             : #define GET_MACRO(_1, _2, _3, _4, NAME, ...) NAME
      48             : #define TIME_SECTION(...)                                                                          \
      49             :   GET_MACRO(__VA_ARGS__, TIME_SECTION4, TIME_SECTION3, TIME_SECTION2, TIME_SECTION1, )(__VA_ARGS__)
      50             : 
      51             : class InputParameters;
      52             : class MooseObject;
      53             : 
      54             : /**
      55             :  * Interface for objects interacting with the PerfGraph.
      56             :  *
      57             :  * Enables getting PerfGraph information and registering PerfGraph timed sections.
      58             :  */
      59             : class PerfGraphInterface
      60             : {
      61             : public:
      62             :   /**
      63             :    * For objects that _are_ MooseObjects with a default prefix of type()
      64             :    */
      65             :   PerfGraphInterface(const MooseObject * moose_object);
      66             : 
      67             :   static InputParameters validParams();
      68             : 
      69             :   /**
      70             :    * For objects that _are_ MooseObjects
      71             :    */
      72             :   PerfGraphInterface(const MooseObject * moose_object, const std::string prefix);
      73             : 
      74             :   /**
      75             :    * For objects that aren't MooseObjects
      76             :    */
      77             :   PerfGraphInterface(PerfGraph & perf_graph, const std::string prefix = "");
      78             : 
      79             :   /**
      80             :    * For objects that construct the PerfGraphInterface _before_ the PerfGraph
      81             :    * is initialized (see MooseApp and OutputWarehouse)
      82             :    */
      83             :   PerfGraphInterface(MooseApp & moose_app, const std::string prefix = "");
      84             : 
      85     4021844 :   virtual ~PerfGraphInterface() = default;
      86             : 
      87             :   /**
      88             :    * Get the PerfGraph
      89             :    */
      90             :   PerfGraph & perfGraph();
      91             : 
      92             : protected:
      93             :   /**
      94             :    * Call to register a named section for timing.
      95             :    *
      96             :    * @param section_name The name of the code section to be timed
      97             :    * @param level The importance of the timer - lower is more important (0 will always come out)
      98             :    * @return The ID of the section - use when starting timing
      99             :    */
     100             :   PerfID registerTimedSection(const std::string & section_name, const unsigned int level) const;
     101             : 
     102             :   /**
     103             :    * Call to register a named section for timing.
     104             :    *
     105             :    * @param section_name The name of the code section to be timed
     106             :    * @param level The importance of the timer - lower is more important (0 will always come out)
     107             :    * @param live_message The message to be printed to the screen during execution
     108             :    * @param print_dots Whether or not progress dots should be printed for this section
     109             :    * @return The ID of the section - use when starting timing
     110             :    */
     111             :   PerfID registerTimedSection(const std::string & section_name,
     112             :                               const unsigned int level,
     113             :                               const std::string & live_message,
     114             :                               const bool print_dots = true) const;
     115             : 
     116             :   /**
     117             :    * @returns The name of the timed section with the name \p section_name.
     118             :    *
     119             :    * Optionally adds a prefix if one is defined.
     120             :    */
     121             :   std::string timedSectionName(const std::string & section_name) const;
     122             : 
     123             :   /// The MooseApp that owns the PerfGraph
     124             :   MooseApp & _pg_moose_app;
     125             : 
     126             :   /// A prefix to use for all sections
     127             :   const std::string _prefix;
     128             : };

Generated by: LCOV version 1.14