1a4963045SJacob Faibussowitsch #pragma once 2b9321188SToby Isaac 3b9321188SToby Isaac #include <petsc/private/loghandlerimpl.h> 4b9321188SToby Isaac #include <petsc/private/logimpl.h> 5b9321188SToby Isaac #include <../src/sys/logging/handler/impls/default/logdefault.h> 6b9321188SToby Isaac #include <petsc/private/hashmap.h> 7b9321188SToby Isaac 8b9321188SToby Isaac typedef int NestedId; 9b9321188SToby Isaac 10b9321188SToby Isaac static inline PETSC_UNUSED NestedId NestedIdFromEvent(PetscLogEvent e) 11b9321188SToby Isaac { 12b9321188SToby Isaac return e; 13b9321188SToby Isaac } 14*6b2a052cSToby Isaac 15*6b2a052cSToby Isaac static inline PETSC_UNUSED PetscLogEvent NestedIdToEvent(NestedId e) 16*6b2a052cSToby Isaac { 17*6b2a052cSToby Isaac return e; 18*6b2a052cSToby Isaac } 19*6b2a052cSToby Isaac 20b9321188SToby Isaac static inline PETSC_UNUSED NestedId NestedIdFromStage(PetscLogStage s) 21b9321188SToby Isaac { 22b9321188SToby Isaac return -(s + 2); 23b9321188SToby Isaac } 24b9321188SToby Isaac 25*6b2a052cSToby Isaac static inline PETSC_UNUSED PetscLogStage NestedIdToStage(NestedId s) 26*6b2a052cSToby Isaac { 27*6b2a052cSToby Isaac return -(s + 2); 28*6b2a052cSToby Isaac } 29*6b2a052cSToby Isaac 30b9321188SToby Isaac typedef struct _n_NestedIdPair NestedIdPair; 31b9321188SToby Isaac struct _n_NestedIdPair { 32b9321188SToby Isaac PetscLogEvent root; 33b9321188SToby Isaac NestedId leaf; 34b9321188SToby Isaac }; 35b9321188SToby Isaac 36b9321188SToby Isaac #define NestedIdPairHash(key) PetscHashCombine(PetscHash_UInt32((PetscHash32_t)((key).root)), PetscHash_UInt32((PetscHash32_t)((key).leaf))) 37b9321188SToby Isaac #define NestedIdPairEqual(k1, k2) (((k1).root == (k2).root) && ((k1).leaf == (k2).leaf)) 38b9321188SToby Isaac 39b9321188SToby Isaac PETSC_HASH_MAP(NestedHash, NestedIdPair, PetscLogEvent, NestedIdPairHash, NestedIdPairEqual, -1) 40b9321188SToby Isaac 41b9321188SToby Isaac typedef struct _n_PetscLogHandler_Nested *PetscLogHandler_Nested; 42b9321188SToby Isaac struct _n_PetscLogHandler_Nested { 43b9321188SToby Isaac PetscLogState state; 44b9321188SToby Isaac PetscLogHandler handler; 45b9321188SToby Isaac PetscNestedHash pair_map; 46*6b2a052cSToby Isaac PetscIntStack nested_stack; // stack of nested ids 47*6b2a052cSToby Isaac PetscIntStack orig_stack; // stack of the original ids 48b9321188SToby Isaac PetscClassId nested_stage_id; 49b9321188SToby Isaac PetscLogDouble threshold; 50b9321188SToby Isaac }; 51b9321188SToby Isaac 52b9321188SToby Isaac typedef struct { 53b9321188SToby Isaac const char *name; 54b9321188SToby Isaac PetscInt id; 55b9321188SToby Isaac PetscInt parent; 56b9321188SToby Isaac PetscInt num_descendants; 57b9321188SToby Isaac } PetscNestedEventNode; 58b9321188SToby Isaac 59b9321188SToby Isaac typedef struct { 60b9321188SToby Isaac MPI_Comm comm; 61b9321188SToby Isaac PetscLogGlobalNames global_events; 62b9321188SToby Isaac PetscNestedEventNode *nodes; 63b9321188SToby Isaac PetscEventPerfInfo *perf; 64b9321188SToby Isaac } PetscNestedEventTree; 65b9321188SToby Isaac 66b9321188SToby Isaac typedef enum { 67b9321188SToby Isaac PETSC_LOG_NESTED_XML, 68b9321188SToby Isaac PETSC_LOG_NESTED_FLAMEGRAPH 69b9321188SToby Isaac } PetscLogNestedType; 70b9321188SToby Isaac 71b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_XML(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer); 72b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_Flamegraph(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer); 73