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