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
NestedIdFromEvent(PetscLogEvent e)10b9321188SToby Isaac static inline PETSC_UNUSED NestedId NestedIdFromEvent(PetscLogEvent e)
11b9321188SToby Isaac {
12b9321188SToby Isaac return e;
13b9321188SToby Isaac }
14*6b2a052cSToby Isaac
NestedIdToEvent(NestedId e)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
NestedIdFromStage(PetscLogStage s)20b9321188SToby Isaac static inline PETSC_UNUSED NestedId NestedIdFromStage(PetscLogStage s)
21b9321188SToby Isaac {
22b9321188SToby Isaac return -(s + 2);
23b9321188SToby Isaac }
24b9321188SToby Isaac
NestedIdToStage(NestedId s)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