xref: /petsc/src/sys/logging/handler/impls/nested/lognested.h (revision 6b2a052c0918f328006acf4a4a6053dc34c8a37e)
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