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);