Actual source code: lognested.h

      1: #pragma once

      3: #include <petsc/private/loghandlerimpl.h>
      4: #include <petsc/private/logimpl.h>
      5: #include <../src/sys/logging/handler/impls/default/logdefault.h>
      6: #include <petsc/private/hashmap.h>

      8: typedef int NestedId;

     10: static inline PETSC_UNUSED NestedId NestedIdFromEvent(PetscLogEvent e)
     11: {
     12:   return e;
     13: }

     15: static inline PETSC_UNUSED PetscLogEvent NestedIdToEvent(NestedId e)
     16: {
     17:   return e;
     18: }

     20: static inline PETSC_UNUSED NestedId NestedIdFromStage(PetscLogStage s)
     21: {
     22:   return -(s + 2);
     23: }

     25: static inline PETSC_UNUSED PetscLogStage NestedIdToStage(NestedId s)
     26: {
     27:   return -(s + 2);
     28: }

     30: typedef struct _n_NestedIdPair NestedIdPair;
     31: struct _n_NestedIdPair {
     32:   PetscLogEvent root;
     33:   NestedId      leaf;
     34: };

     36: #define NestedIdPairHash(key)     PetscHashCombine(PetscHash_UInt32((PetscHash32_t)((key).root)), PetscHash_UInt32((PetscHash32_t)((key).leaf)))
     37: #define NestedIdPairEqual(k1, k2) (((k1).root == (k2).root) && ((k1).leaf == (k2).leaf))

     39: PETSC_HASH_MAP(NestedHash, NestedIdPair, PetscLogEvent, NestedIdPairHash, NestedIdPairEqual, -1)

     41: typedef struct _n_PetscLogHandler_Nested *PetscLogHandler_Nested;
     42: struct _n_PetscLogHandler_Nested {
     43:   PetscLogState   state;
     44:   PetscLogHandler handler;
     45:   PetscNestedHash pair_map;
     46:   PetscIntStack   nested_stack; // stack of nested ids
     47:   PetscIntStack   orig_stack;   // stack of the original ids
     48:   PetscClassId    nested_stage_id;
     49:   PetscLogDouble  threshold;
     50: };

     52: typedef struct {
     53:   const char *name;
     54:   PetscInt    id;
     55:   PetscInt    parent;
     56:   PetscInt    num_descendants;
     57: } PetscNestedEventNode;

     59: typedef struct {
     60:   MPI_Comm              comm;
     61:   PetscLogGlobalNames   global_events;
     62:   PetscNestedEventNode *nodes;
     63:   PetscEventPerfInfo   *perf;
     64: } PetscNestedEventTree;

     66: typedef enum {
     67:   PETSC_LOG_NESTED_XML,
     68:   PETSC_LOG_NESTED_FLAMEGRAPH
     69: } PetscLogNestedType;

     71: PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_XML(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer);
     72: PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_Flamegraph(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer);