1*a4963045SJacob 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 } 14b9321188SToby Isaac static inline PETSC_UNUSED NestedId NestedIdFromStage(PetscLogStage s) 15b9321188SToby Isaac { 16b9321188SToby Isaac return -(s + 2); 17b9321188SToby Isaac } 18b9321188SToby Isaac 19b9321188SToby Isaac typedef struct _n_NestedIdPair NestedIdPair; 20b9321188SToby Isaac struct _n_NestedIdPair { 21b9321188SToby Isaac PetscLogEvent root; 22b9321188SToby Isaac NestedId leaf; 23b9321188SToby Isaac }; 24b9321188SToby Isaac 25b9321188SToby Isaac #define NestedIdPairHash(key) PetscHashCombine(PetscHash_UInt32((PetscHash32_t)((key).root)), PetscHash_UInt32((PetscHash32_t)((key).leaf))) 26b9321188SToby Isaac #define NestedIdPairEqual(k1, k2) (((k1).root == (k2).root) && ((k1).leaf == (k2).leaf)) 27b9321188SToby Isaac 28b9321188SToby Isaac PETSC_HASH_MAP(NestedHash, NestedIdPair, PetscLogEvent, NestedIdPairHash, NestedIdPairEqual, -1) 29b9321188SToby Isaac 30b9321188SToby Isaac typedef struct _n_PetscLogHandler_Nested *PetscLogHandler_Nested; 31b9321188SToby Isaac struct _n_PetscLogHandler_Nested { 32b9321188SToby Isaac PetscLogState state; 33b9321188SToby Isaac PetscLogHandler handler; 34b9321188SToby Isaac PetscNestedHash pair_map; 35b9321188SToby Isaac PetscIntStack stack; // stack of nested ids 36b9321188SToby Isaac PetscClassId nested_stage_id; 37b9321188SToby Isaac PetscLogDouble threshold; 38b9321188SToby Isaac }; 39b9321188SToby Isaac 40b9321188SToby Isaac typedef struct { 41b9321188SToby Isaac const char *name; 42b9321188SToby Isaac PetscInt id; 43b9321188SToby Isaac PetscInt parent; 44b9321188SToby Isaac PetscInt num_descendants; 45b9321188SToby Isaac } PetscNestedEventNode; 46b9321188SToby Isaac 47b9321188SToby Isaac typedef struct { 48b9321188SToby Isaac MPI_Comm comm; 49b9321188SToby Isaac PetscLogGlobalNames global_events; 50b9321188SToby Isaac PetscNestedEventNode *nodes; 51b9321188SToby Isaac PetscEventPerfInfo *perf; 52b9321188SToby Isaac } PetscNestedEventTree; 53b9321188SToby Isaac 54b9321188SToby Isaac typedef enum { 55b9321188SToby Isaac PETSC_LOG_NESTED_XML, 56b9321188SToby Isaac PETSC_LOG_NESTED_FLAMEGRAPH 57b9321188SToby Isaac } PetscLogNestedType; 58b9321188SToby Isaac 59b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_XML(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer); 60b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_Flamegraph(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer); 61