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