xref: /petsc/src/sys/logging/state/logstate.c (revision 4d86920da9ee67c835173a5dfffa1b3a52fd24ca)
16873511fSToby Isaac #include <petsc/private/logimpl.h> /*I "petsclog.h" I*/
26873511fSToby Isaac 
36873511fSToby Isaac /*@
46873511fSToby Isaac   PetscLogStateCreate - Create a logging state.
56873511fSToby Isaac 
66873511fSToby Isaac   Not collective
76873511fSToby Isaac 
86873511fSToby Isaac   Output Parameters:
96873511fSToby Isaac . state - a `PetscLogState`
106873511fSToby Isaac 
116873511fSToby Isaac   Level: developer
126873511fSToby Isaac 
136873511fSToby Isaac   Note:
146873511fSToby Isaac   Most users will not need to create a `PetscLogState`.  The global state `PetscLogState()`
156873511fSToby Isaac   is created in `PetscInitialize()`.
166873511fSToby Isaac 
176873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateDestroy()`
186873511fSToby Isaac @*/
196873511fSToby Isaac PetscErrorCode PetscLogStateCreate(PetscLogState *state)
206873511fSToby Isaac {
216873511fSToby Isaac   PetscInt      num_entries, max_events, max_stages;
226873511fSToby Isaac   PetscLogState s;
236873511fSToby Isaac 
246873511fSToby Isaac   PetscFunctionBegin;
256873511fSToby Isaac   PetscCall(PetscNew(state));
266873511fSToby Isaac   s = *state;
276873511fSToby Isaac   PetscCall(PetscLogRegistryCreate(&s->registry));
286873511fSToby Isaac   PetscCall(PetscIntStackCreate(&s->stage_stack));
296873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumEvents(s->registry, NULL, &max_events));
306873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumStages(s->registry, NULL, &max_stages));
316873511fSToby Isaac 
326873511fSToby Isaac   s->bt_num_events = max_events + 1; // one extra column for default stage activity
336873511fSToby Isaac   s->bt_num_stages = max_stages;
346873511fSToby Isaac   num_entries      = s->bt_num_events * s->bt_num_stages;
356873511fSToby Isaac   PetscCall(PetscBTCreate(num_entries, &s->active));
366873511fSToby Isaac   s->current_stage = -1;
376873511fSToby Isaac   s->refct         = 1;
386873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
396873511fSToby Isaac }
406873511fSToby Isaac 
416873511fSToby Isaac /*@
426873511fSToby Isaac   PetscLogStateDestroy - Destroy a logging state.
436873511fSToby Isaac 
446873511fSToby Isaac   Not collective
456873511fSToby Isaac 
466873511fSToby Isaac   Input Parameters:
476873511fSToby Isaac . state - a `PetscLogState`
486873511fSToby Isaac 
496873511fSToby Isaac   Level: developer
506873511fSToby Isaac 
516873511fSToby Isaac   Note:
526873511fSToby Isaac   Most users will not need to destroy a `PetscLogState`.  The global state `PetscLogState()`
536873511fSToby Isaac   is destroyed in `PetscFinalize()`.
546873511fSToby Isaac 
556873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateCreate()`
566873511fSToby Isaac @*/
576873511fSToby Isaac PetscErrorCode PetscLogStateDestroy(PetscLogState *state)
586873511fSToby Isaac {
596873511fSToby Isaac   PetscLogState s;
60*4d86920dSPierre Jolivet 
616873511fSToby Isaac   PetscFunctionBegin;
626873511fSToby Isaac   s      = *state;
636873511fSToby Isaac   *state = NULL;
646873511fSToby Isaac   if (s == NULL || --(s->refct) > 0) PetscFunctionReturn(PETSC_SUCCESS);
656873511fSToby Isaac   PetscCall(PetscLogRegistryDestroy(s->registry));
666873511fSToby Isaac   PetscCall(PetscIntStackDestroy(s->stage_stack));
676873511fSToby Isaac   PetscCall(PetscBTDestroy(&s->active));
686873511fSToby Isaac   PetscCall(PetscFree(s));
696873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
706873511fSToby Isaac }
716873511fSToby Isaac 
726873511fSToby Isaac /*@
736873511fSToby Isaac   PetscLogStateStagePush - Start a new logging stage.
746873511fSToby Isaac 
756873511fSToby Isaac   Not collective
766873511fSToby Isaac 
776873511fSToby Isaac   Input Parameters:
786873511fSToby Isaac + state - a `PetscLogState`
796873511fSToby Isaac - stage - a registered `PetscLogStage`
806873511fSToby Isaac 
816873511fSToby Isaac   Level: developer
826873511fSToby Isaac 
836873511fSToby Isaac   Note:
846873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogStagePush()`.
856873511fSToby Isaac 
866873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStagePop()`, `PetscLogStateGetCurrentStage()`
876873511fSToby Isaac @*/
886873511fSToby Isaac PetscErrorCode PetscLogStateStagePush(PetscLogState state, PetscLogStage stage)
896873511fSToby Isaac {
906873511fSToby Isaac   PetscFunctionBegin;
916873511fSToby Isaac   if (PetscDefined(USE_DEBUG)) {
926873511fSToby Isaac     PetscInt num_stages;
936873511fSToby Isaac     PetscCall(PetscLogRegistryGetNumStages(state->registry, &num_stages, NULL));
946873511fSToby Isaac     PetscCheck(stage >= 0 && stage < num_stages, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid stage %d not in [0,%d)", stage, (int)num_stages);
956873511fSToby Isaac   }
966873511fSToby Isaac   PetscCall(PetscIntStackPush(state->stage_stack, stage));
976873511fSToby Isaac   state->current_stage = stage;
986873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
996873511fSToby Isaac }
1006873511fSToby Isaac 
1016873511fSToby Isaac /*@
1026873511fSToby Isaac   PetscLogStateStagePop - End a running logging stage.
1036873511fSToby Isaac 
1046873511fSToby Isaac   Not collective
1056873511fSToby Isaac 
1066873511fSToby Isaac   Input Parameter:
1076873511fSToby Isaac . state - a `PetscLogState`
1086873511fSToby Isaac 
1096873511fSToby Isaac   Level: developer
1106873511fSToby Isaac 
1116873511fSToby Isaac   Note:
1126873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogStagePush()`.
1136873511fSToby Isaac 
1146873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStagePush()`, `PetscLogStateGetCurrentStage()`
1156873511fSToby Isaac @*/
1166873511fSToby Isaac PetscErrorCode PetscLogStateStagePop(PetscLogState state)
1176873511fSToby Isaac {
1186873511fSToby Isaac   int       curStage;
1196873511fSToby Isaac   PetscBool empty;
1206873511fSToby Isaac 
1216873511fSToby Isaac   PetscFunctionBegin;
1226873511fSToby Isaac   PetscCall(PetscIntStackPop(state->stage_stack, &curStage));
1236873511fSToby Isaac   PetscCall(PetscIntStackEmpty(state->stage_stack, &empty));
1246873511fSToby Isaac   if (!empty) {
1256873511fSToby Isaac     PetscCall(PetscIntStackTop(state->stage_stack, &state->current_stage));
1266873511fSToby Isaac   } else state->current_stage = -1;
1276873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1286873511fSToby Isaac }
1296873511fSToby Isaac 
1306873511fSToby Isaac /*@
1316873511fSToby Isaac   PetscLogStateGetCurrentStage - Get the last stage that was started
1326873511fSToby Isaac 
1336873511fSToby Isaac   Not collective
1346873511fSToby Isaac 
1356873511fSToby Isaac   Input Parameter:
1366873511fSToby Isaac . state - a `PetscLogState`
1376873511fSToby Isaac 
1386873511fSToby Isaac   Output Parameter:
1396873511fSToby Isaac . current - the last `PetscLogStage` started with `PetscLogStateStagePop()`
1406873511fSToby Isaac 
1416873511fSToby Isaac   Level: developer
1426873511fSToby Isaac 
1436873511fSToby Isaac   Note:
1446873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogGetCurrentStage()`.
1456873511fSToby Isaac 
1466873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStagePush()`, `PetscLogStateStagePop()`
1476873511fSToby Isaac @*/
1486873511fSToby Isaac PetscErrorCode PetscLogStateGetCurrentStage(PetscLogState state, PetscLogStage *current)
1496873511fSToby Isaac {
1506873511fSToby Isaac   PetscFunctionBegin;
1516873511fSToby Isaac   *current = state->current_stage;
1526873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1536873511fSToby Isaac }
1546873511fSToby Isaac 
1556873511fSToby Isaac static PetscErrorCode PetscLogStateResize(PetscLogState state)
1566873511fSToby Isaac {
1576873511fSToby Isaac   PetscBT  active_new;
1586873511fSToby Isaac   PetscInt new_num_events;
1596873511fSToby Isaac   PetscInt new_num_stages;
1606873511fSToby Isaac 
1616873511fSToby Isaac   PetscFunctionBegin;
1626873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumEvents(state->registry, NULL, &new_num_events));
1636873511fSToby Isaac   new_num_events++;
1646873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumStages(state->registry, NULL, &new_num_stages));
1656873511fSToby Isaac 
1666873511fSToby Isaac   if (state->bt_num_events == new_num_events && state->bt_num_stages == new_num_stages) PetscFunctionReturn(PETSC_SUCCESS);
1676873511fSToby Isaac   PetscCheck((new_num_stages % PETSC_BITS_PER_BYTE) == 0, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "new number of stages must be multiple of %d", PETSC_BITS_PER_BYTE);
1686873511fSToby Isaac   PetscCall(PetscBTCreate(new_num_events * new_num_stages, &active_new));
1696873511fSToby Isaac   if (new_num_stages == state->bt_num_stages) {
1706873511fSToby Isaac     // single memcpy
1716873511fSToby Isaac     size_t num_chars = (state->bt_num_stages * state->bt_num_events) / PETSC_BITS_PER_BYTE;
1726873511fSToby Isaac 
1736873511fSToby Isaac     PetscCall(PetscMemcpy(active_new, state->active, num_chars));
1746873511fSToby Isaac   } else {
1756873511fSToby Isaac     size_t num_chars_old = state->bt_num_stages / PETSC_BITS_PER_BYTE;
1766873511fSToby Isaac     size_t num_chars_new = new_num_stages / PETSC_BITS_PER_BYTE;
1776873511fSToby Isaac 
1786873511fSToby Isaac     for (PetscInt i = 0; i < state->bt_num_events; i++) { PetscCall(PetscMemcpy(&active_new[i * num_chars_new], &(state->active[i * num_chars_old]), num_chars_old)); }
1796873511fSToby Isaac   }
1806873511fSToby Isaac   PetscCall(PetscBTDestroy(&state->active));
1816873511fSToby Isaac   state->active        = active_new;
1826873511fSToby Isaac   state->bt_num_events = new_num_events;
1836873511fSToby Isaac   state->bt_num_stages = new_num_stages;
1846873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1856873511fSToby Isaac }
1866873511fSToby Isaac 
1876873511fSToby Isaac /*@C
1886873511fSToby Isaac   PetscLogStateStageRegister - Register a new stage with a logging state
1896873511fSToby Isaac 
1906873511fSToby Isaac   Not collective
1916873511fSToby Isaac 
1926873511fSToby Isaac   Input Parameters:
1936873511fSToby Isaac + state - a `PetscLogState`
1946873511fSToby Isaac - sname - a unique name
1956873511fSToby Isaac 
1966873511fSToby Isaac   Output Parameter:
1976873511fSToby Isaac . stage - the identifier for the registered stage
1986873511fSToby Isaac 
1996873511fSToby Isaac   Level: developer
2006873511fSToby Isaac 
2016873511fSToby Isaac   Note:
2026873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogStageRegister()`.
2036873511fSToby Isaac 
2046873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStagePush()`, `PetscLogStateStagePop()`
2056873511fSToby Isaac @*/
2066873511fSToby Isaac PetscErrorCode PetscLogStateStageRegister(PetscLogState state, const char sname[], PetscLogStage *stage)
2076873511fSToby Isaac {
2086873511fSToby Isaac   PetscInt s;
209*4d86920dSPierre Jolivet 
2106873511fSToby Isaac   PetscFunctionBegin;
2116873511fSToby Isaac   PetscCall(PetscLogRegistryStageRegister(state->registry, sname, stage));
2126873511fSToby Isaac   PetscCall(PetscLogStateResize(state));
2136873511fSToby Isaac   s = *stage;
2146873511fSToby Isaac   PetscCall(PetscBTSet(state->active, s)); // stages are by default active
2156873511fSToby Isaac   for (PetscInt e = 1; e < state->bt_num_events; e++) {
2166873511fSToby Isaac     // copy "Main Stage" activities
2176873511fSToby Isaac     if (PetscBTLookup(state->active, 0 + e * state->bt_num_stages)) {
2186873511fSToby Isaac       PetscCall(PetscBTSet(state->active, s + e * state->bt_num_stages));
2196873511fSToby Isaac     } else {
2206873511fSToby Isaac       PetscCall(PetscBTClear(state->active, s + e * state->bt_num_stages));
2216873511fSToby Isaac     }
2226873511fSToby Isaac   }
2236873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2246873511fSToby Isaac }
2256873511fSToby Isaac 
2266873511fSToby Isaac /*@C
2276873511fSToby Isaac   PetscLogStateEventRegister - Register a new event with a logging state
2286873511fSToby Isaac 
2296873511fSToby Isaac   Not collective
2306873511fSToby Isaac 
2316873511fSToby Isaac   Input Parameters:
2326873511fSToby Isaac + state - a `PetscLogState`
2336873511fSToby Isaac . sname - a unique name
2346873511fSToby Isaac - id    - the `PetscClassId` for the type of object most closely associated with this event
2356873511fSToby Isaac 
2366873511fSToby Isaac   Output Parameter:
2376873511fSToby Isaac . event - the identifier for the registered event
2386873511fSToby Isaac 
2396873511fSToby Isaac   Level: developer
2406873511fSToby Isaac 
2416873511fSToby Isaac   Note:
2426873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogEventRegister()`.
2436873511fSToby Isaac 
2446873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStageRegister()`
2456873511fSToby Isaac @*/
2466873511fSToby Isaac PetscErrorCode PetscLogStateEventRegister(PetscLogState state, const char sname[], PetscClassId id, PetscLogEvent *event)
2476873511fSToby Isaac {
2486873511fSToby Isaac   PetscInt e;
2496873511fSToby Isaac 
2506873511fSToby Isaac   PetscFunctionBegin;
2516873511fSToby Isaac   *event = PETSC_DECIDE;
2526873511fSToby Isaac   PetscCall(PetscLogRegistryGetEventFromName(state->registry, sname, event));
2536873511fSToby Isaac   if (*event > 0) PetscFunctionReturn(PETSC_SUCCESS);
2546873511fSToby Isaac   PetscCall(PetscLogRegistryEventRegister(state->registry, sname, id, event));
2556873511fSToby Isaac   PetscCall(PetscLogStateResize(state));
2566873511fSToby Isaac   e = *event;
2576873511fSToby Isaac   for (PetscInt s = 0; s < state->bt_num_stages; s++) PetscCall(PetscBTSet(state->active, s + (e + 1) * state->bt_num_stages)); // events are by default active
2586873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2596873511fSToby Isaac }
2606873511fSToby Isaac 
2616873511fSToby Isaac /*@
2626873511fSToby Isaac   PetscLogStateEventSetCollective - Set the collective nature of a logging event
2636873511fSToby Isaac 
2646873511fSToby Isaac   Logically collective
2656873511fSToby Isaac 
2666873511fSToby Isaac   Input Parameters:
2676873511fSToby Isaac + state      - a `PetscLogState`
2686873511fSToby Isaac . event      - a registered `PetscLogEvent`
2696873511fSToby Isaac - collective - if `PETSC_TRUE`, MPI processes synchronize during this event, and `PetscLogHandlerEventSync()` can be used to help measure the delays between when the processes begin the event
2706873511fSToby Isaac 
2716873511fSToby Isaac   Level: developer
2726873511fSToby Isaac 
2736873511fSToby Isaac   Note:
2746873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogEventSetCollective()`.
2756873511fSToby Isaac 
2766873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventRegister()`
2776873511fSToby Isaac @*/
2786873511fSToby Isaac PetscErrorCode PetscLogStateEventSetCollective(PetscLogState state, PetscLogEvent event, PetscBool collective)
2796873511fSToby Isaac {
2806873511fSToby Isaac   PetscFunctionBegin;
2816873511fSToby Isaac   PetscCall(PetscLogRegistryEventSetCollective(state->registry, event, collective));
2826873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2836873511fSToby Isaac }
2846873511fSToby Isaac 
2856873511fSToby Isaac /*@
2866873511fSToby Isaac   PetscLogStateStageSetActive - Mark a stage as active or inactive.
2876873511fSToby Isaac 
2886873511fSToby Isaac   Not collective
2896873511fSToby Isaac 
2906873511fSToby Isaac   Input Parameters:
2916873511fSToby Isaac + state    - a `PetscLogState`
2926873511fSToby Isaac . stage    - a registered `PetscLogStage`
2936873511fSToby Isaac - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return `PETSC_FALSE` for all events during this stage
2946873511fSToby Isaac 
2956873511fSToby Isaac   Level: developer
2966873511fSToby Isaac 
2976873511fSToby Isaac   Note:
2986873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogStageSetActive()`
2996873511fSToby Isaac 
3006873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventSetActive()`
3016873511fSToby Isaac @*/
3026873511fSToby Isaac PetscErrorCode PetscLogStateStageSetActive(PetscLogState state, PetscLogStage stage, PetscBool isActive)
3036873511fSToby Isaac {
3046873511fSToby Isaac   PetscFunctionBegin;
3056873511fSToby Isaac   PetscCheck(stage >= 0 && stage < state->bt_num_stages, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid stage %d should be in [0,%d)", stage, state->bt_num_stages);
3066873511fSToby Isaac   if (isActive) {
3076873511fSToby Isaac     for (PetscInt e = 0; e < state->bt_num_events; e++) { PetscCall(PetscBTSet(state->active, stage + e * state->bt_num_stages)); }
3086873511fSToby Isaac   } else {
3096873511fSToby Isaac     for (PetscInt e = 0; e < state->bt_num_events; e++) { PetscCall(PetscBTClear(state->active, stage + e * state->bt_num_stages)); }
3106873511fSToby Isaac   }
3116873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
3126873511fSToby Isaac }
3136873511fSToby Isaac 
3146873511fSToby Isaac /*@
3156873511fSToby Isaac   PetscLogStateStageGetActive - Check if a logging stage is active or inactive.
3166873511fSToby Isaac 
3176873511fSToby Isaac   Not collective
3186873511fSToby Isaac 
3196873511fSToby Isaac   Input Parameters:
3206873511fSToby Isaac + state - a `PetscLogState`
3216873511fSToby Isaac - stage - a registered `PetscLogStage`
3226873511fSToby Isaac 
3236873511fSToby Isaac   Output Parameter:
3246873511fSToby Isaac . isActive - if `PETSC_FALSE`, the state should not send logging events to log handlers during this stage.
3256873511fSToby Isaac 
3266873511fSToby Isaac   Level: developer
3276873511fSToby Isaac 
3286873511fSToby Isaac   Note:
3296873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogStageGetActive()`.
3306873511fSToby Isaac 
331b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStageSetActive()`, `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogHandlerEventBegin()`, `PetscLogHandlerEventEnd()`
3326873511fSToby Isaac @*/
3336873511fSToby Isaac PetscErrorCode PetscLogStateStageGetActive(PetscLogState state, PetscLogStage stage, PetscBool *isActive)
3346873511fSToby Isaac {
3356873511fSToby Isaac   PetscFunctionBegin;
3366873511fSToby Isaac   *isActive = PetscBTLookup(state->active, stage) ? PETSC_TRUE : PETSC_FALSE;
3376873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
3386873511fSToby Isaac }
3396873511fSToby Isaac 
3406873511fSToby Isaac /*@
3416873511fSToby Isaac   PetscLogStateEventSetActive - Set a logging event as active or inactive during a logging stage.
3426873511fSToby Isaac 
3436873511fSToby Isaac   Not collective
3446873511fSToby Isaac 
3456873511fSToby Isaac   Input Parameters:
3466873511fSToby Isaac + state    - a `PetscLogState`
3476873511fSToby Isaac . stage    - a registered `PetscLogStage`, or `PETSC_DEFAULT` for the current stage
3486873511fSToby Isaac . event    - a registered `PetscLogEvent`
3496873511fSToby Isaac - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return `PETSC_FALSE` for this stage and this event
3506873511fSToby Isaac 
3516873511fSToby Isaac   Level: developer
3526873511fSToby Isaac 
3536873511fSToby Isaac   Note:
3546873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogEventActivate()` and `PetscLogEventDeactivate()`.
3556873511fSToby Isaac 
3566873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateGetCurrentStage()`, `PetscLogEventSetActiveAll()`
3576873511fSToby Isaac @*/
3586873511fSToby Isaac PetscErrorCode PetscLogStateEventSetActive(PetscLogState state, PetscLogStage stage, PetscLogEvent event, PetscBool isActive)
3596873511fSToby Isaac {
3606873511fSToby Isaac   PetscFunctionBegin;
3616873511fSToby Isaac   stage = (stage < 0) ? state->current_stage : stage;
3626873511fSToby Isaac   PetscCheck(event >= 0 && event < state->bt_num_events, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid event %d should be in [0,%d)", event, state->bt_num_events);
3636873511fSToby Isaac   PetscCheck(stage >= 0 && stage < state->bt_num_stages, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid stage %d should be in [0,%d)", stage, state->bt_num_stages);
3646873511fSToby Isaac   PetscCall((isActive ? PetscBTSet : PetscBTClear)(state->active, state->current_stage + (event + 1) * state->bt_num_stages));
3656873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
3666873511fSToby Isaac }
3676873511fSToby Isaac 
3686873511fSToby Isaac /*@
3696873511fSToby Isaac   PetscLogStateEventSetActiveAll - Set logging event as active or inactive for all logging stages
3706873511fSToby Isaac 
3716873511fSToby Isaac   Not collective
3726873511fSToby Isaac 
3736873511fSToby Isaac   Input Parameters:
3746873511fSToby Isaac + state    - a `PetscLogState`
3756873511fSToby Isaac . event    - a registered `PetscLogEvent`
3766873511fSToby Isaac - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return `PETSC_FALSE` for all stages and all events
3776873511fSToby Isaac 
3786873511fSToby Isaac   Level: developer
3796873511fSToby Isaac 
3806873511fSToby Isaac   Note:
3816873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogEventSetActiveAll()`.
3826873511fSToby Isaac 
3836873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`
3846873511fSToby Isaac @*/
3856873511fSToby Isaac PetscErrorCode PetscLogStateEventSetActiveAll(PetscLogState state, PetscLogEvent event, PetscBool isActive)
3866873511fSToby Isaac {
3876873511fSToby Isaac   PetscFunctionBegin;
3886873511fSToby Isaac   PetscCheck(event >= 0 && event < state->bt_num_events, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid event %d should be in [0,%d)", event, state->bt_num_events);
3896873511fSToby Isaac   for (int stage = 0; stage < state->bt_num_stages; stage++) { PetscCall((isActive ? PetscBTSet : PetscBTClear)(state->active, state->current_stage + (event + 1) * state->bt_num_stages)); }
3906873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
3916873511fSToby Isaac }
3926873511fSToby Isaac 
3936873511fSToby Isaac /*@
3946873511fSToby Isaac   PetscLogStateClassSetActive - Set logging events associated with an event as active or inactive during a logging stage.
3956873511fSToby Isaac 
3966873511fSToby Isaac   Not collective
3976873511fSToby Isaac 
3986873511fSToby Isaac   Input Parameters:
3996873511fSToby Isaac + state    - a `PetscLogState`
4006873511fSToby Isaac . stage    - a registered `PetscLogStage`, or `PETSC_DEFAULT` for the current stage
4016873511fSToby Isaac . classid  - a `PetscClassId`
4026873511fSToby Isaac - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return
4036873511fSToby Isaac              `PETSC_FALSE` for this stage and all events that were associated
4046873511fSToby Isaac              with this class when they were registered (see
4056873511fSToby Isaac              `PetscLogStateEventRegister()`).
4066873511fSToby Isaac 
4076873511fSToby Isaac   Level: developer
4086873511fSToby Isaac 
4096873511fSToby Isaac   Note:
4106873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogEventActivateClass()` and `PetscLogEventDeactivateClass()`.
4116873511fSToby Isaac 
4126873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateEventSetActive()`
4136873511fSToby Isaac @*/
4146873511fSToby Isaac PetscErrorCode PetscLogStateClassSetActive(PetscLogState state, PetscLogStage stage, PetscClassId classid, PetscBool isActive)
4156873511fSToby Isaac {
4166873511fSToby Isaac   PetscInt num_events;
4176873511fSToby Isaac 
4186873511fSToby Isaac   PetscFunctionBegin;
4196873511fSToby Isaac   stage = stage < 0 ? state->current_stage : stage;
4206873511fSToby Isaac   PetscCheck(stage >= 0 && stage < state->bt_num_stages, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid stage %d should be in [0,%d)", stage, state->bt_num_stages);
4216873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumEvents(state->registry, &num_events, NULL));
4226873511fSToby Isaac   for (PetscLogEvent e = 0; e < num_events; e++) {
4236873511fSToby Isaac     PetscLogEventInfo event_info;
4246873511fSToby Isaac     PetscCall(PetscLogRegistryEventGetInfo(state->registry, e, &event_info));
4256873511fSToby Isaac     if (event_info.classid == classid) PetscCall((isActive ? PetscBTSet : PetscBTClear)(state->active, stage + (e + 1) * state->bt_num_stages));
4266873511fSToby Isaac   }
4276873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
4286873511fSToby Isaac }
4296873511fSToby Isaac 
4306873511fSToby Isaac /*@
4316873511fSToby Isaac   PetscLogStateClassSetActiveAll - Set logging events associated with an event as active or inactive for all logging stages
4326873511fSToby Isaac 
4336873511fSToby Isaac   Not collective
4346873511fSToby Isaac 
4356873511fSToby Isaac   Input Parameters:
4366873511fSToby Isaac + state    - a `PetscLogState`
4376873511fSToby Isaac . classid  - a `PetscClassId`
4386873511fSToby Isaac - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return
4396873511fSToby Isaac              `PETSC_FALSE` for all events that were associated with this class when they
4406873511fSToby Isaac              were registered (see `PetscLogStateEventRegister()`).
4416873511fSToby Isaac 
4426873511fSToby Isaac   Level: developer
4436873511fSToby Isaac 
4446873511fSToby Isaac   Note:
4456873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogEventIncludeClass()` and `PetscLogEventExcludeClass()`.
4466873511fSToby Isaac 
4476873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateClassSetActive()`
4486873511fSToby Isaac @*/
4496873511fSToby Isaac PetscErrorCode PetscLogStateClassSetActiveAll(PetscLogState state, PetscClassId classid, PetscBool isActive)
4506873511fSToby Isaac {
4516873511fSToby Isaac   PetscInt num_events, num_stages;
4526873511fSToby Isaac 
4536873511fSToby Isaac   PetscFunctionBegin;
4546873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumEvents(state->registry, &num_events, NULL));
4556873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumStages(state->registry, &num_stages, NULL));
4566873511fSToby Isaac   for (PetscLogEvent e = 0; e < num_events; e++) {
4576873511fSToby Isaac     PetscLogEventInfo event_info;
4586873511fSToby Isaac     PetscCall(PetscLogRegistryEventGetInfo(state->registry, e, &event_info));
4596873511fSToby Isaac     if (event_info.classid == classid) {
4606873511fSToby Isaac       for (PetscLogStage s = 0; s < num_stages; s++) { PetscCall((isActive ? PetscBTSet : PetscBTClear)(state->active, s + (e + 1) * state->bt_num_stages)); }
4616873511fSToby Isaac     }
4626873511fSToby Isaac   }
4636873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
4646873511fSToby Isaac }
4656873511fSToby Isaac 
4666873511fSToby Isaac /*@
4676873511fSToby Isaac   PetscLogStateEventGetActive - Check if a logging event is active or inactive during a logging stage.
4686873511fSToby Isaac 
4696873511fSToby Isaac   Not collective
4706873511fSToby Isaac 
4716873511fSToby Isaac   Input Parameters:
4726873511fSToby Isaac + state - a `PetscLogState`
4736873511fSToby Isaac . stage - a registered `PetscLogStage`, or `PETSC_DEFAULT` for the current stage
4746873511fSToby Isaac - event - a registered `PetscLogEvent`
4756873511fSToby Isaac 
4766873511fSToby Isaac   Output Parameter:
4776873511fSToby Isaac . isActive - If `PETSC_FALSE`, log handlers should not be notified of the event's beginning or end.
4786873511fSToby Isaac 
4796873511fSToby Isaac   Level: developer
4806873511fSToby Isaac 
4816873511fSToby Isaac   Note:
4826873511fSToby Isaac   This is called for the global state (`PetscLogGetState()`) in `PetscLogEventGetActive()`, where it has significance
4836873511fSToby Isaac   for what information is sent to log handlers.
4846873511fSToby Isaac 
485b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateGetCurrentStage()`, `PetscLogHandler()`
4866873511fSToby Isaac @*/
4876873511fSToby Isaac PetscErrorCode PetscLogStateEventGetActive(PetscLogState state, PetscLogStage stage, PetscLogEvent event, PetscBool *isActive)
4886873511fSToby Isaac {
4896873511fSToby Isaac   PetscFunctionBegin;
4906873511fSToby Isaac   stage = (stage < 0) ? state->current_stage : stage;
4916873511fSToby Isaac   PetscCheck(event >= 0 && event < state->bt_num_events, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid event %d should be in [0,%d)", event, state->bt_num_events);
4926873511fSToby Isaac   PetscCheck(stage >= 0 && stage < state->bt_num_stages, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid stage %d should be in [0,%d)", event, state->bt_num_stages);
4936873511fSToby Isaac   *isActive = PetscLogStateStageEventIsActive(state, stage, event) ? PETSC_TRUE : PETSC_FALSE;
4946873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
4956873511fSToby Isaac }
4966873511fSToby Isaac 
4976873511fSToby Isaac /*@
4986873511fSToby Isaac   PetscLogStateGetEventFromName - Get a `PetscLogEvent` from the name it was registered with.
4996873511fSToby Isaac 
5006873511fSToby Isaac   Not collective
5016873511fSToby Isaac 
5026873511fSToby Isaac   Input Parameters:
5036873511fSToby Isaac + state - a `PetscLogState`
5046873511fSToby Isaac - name  - an event's name
5056873511fSToby Isaac 
5066873511fSToby Isaac   Output Parameter:
5076873511fSToby Isaac . event - the event's id
5086873511fSToby Isaac 
5096873511fSToby Isaac   Level: developer
5106873511fSToby Isaac 
5116873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventRegister()`, `PetscLogStateEventGetInfo()`
5126873511fSToby Isaac @*/
5136873511fSToby Isaac PetscErrorCode PetscLogStateGetEventFromName(PetscLogState state, const char name[], PetscLogEvent *event)
5146873511fSToby Isaac {
5156873511fSToby Isaac   PetscFunctionBegin;
5166873511fSToby Isaac   PetscCall(PetscLogRegistryGetEventFromName(state->registry, name, event));
5176873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
5186873511fSToby Isaac }
5196873511fSToby Isaac 
5206873511fSToby Isaac /*@C
5216873511fSToby Isaac   PetscLogStateGetStageFromName - Get a `PetscLogStage` from the name it was registered with.
5226873511fSToby Isaac 
5236873511fSToby Isaac   Not collective
5246873511fSToby Isaac 
5256873511fSToby Isaac   Input Parameters:
5266873511fSToby Isaac + state - a `PetscLogState`
5276873511fSToby Isaac - name  - a stage's name
5286873511fSToby Isaac 
5296873511fSToby Isaac   Output Parameter:
5306873511fSToby Isaac . stage - the stage's id
5316873511fSToby Isaac 
5326873511fSToby Isaac   Level: developer
5336873511fSToby Isaac 
5346873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStageGetInfo()`
5356873511fSToby Isaac @*/
5366873511fSToby Isaac PetscErrorCode PetscLogStateGetStageFromName(PetscLogState state, const char name[], PetscLogStage *stage)
5376873511fSToby Isaac {
5386873511fSToby Isaac   PetscFunctionBegin;
5396873511fSToby Isaac   PetscCall(PetscLogRegistryGetStageFromName(state->registry, name, stage));
5406873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
5416873511fSToby Isaac }
5426873511fSToby Isaac 
5436873511fSToby Isaac /*@C
5446873511fSToby Isaac   PetscLogStateGetClassFromName - Get a `PetscLogClass` from the name of the class it was registered with.
5456873511fSToby Isaac 
5466873511fSToby Isaac   Not collective
5476873511fSToby Isaac 
5486873511fSToby Isaac   Input Parameters:
5496873511fSToby Isaac + state - a `PetscLogState`
5506873511fSToby Isaac - name  - the name string of the class
5516873511fSToby Isaac 
5526873511fSToby Isaac   Output Parameter:
5536873511fSToby Isaac . clss - the classes's logging id
5546873511fSToby Isaac 
5556873511fSToby Isaac   Level: developer
5566873511fSToby Isaac 
5576873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`, `PetscLogStateClassGetInfo()`
5586873511fSToby Isaac @*/
5596873511fSToby Isaac PetscErrorCode PetscLogStateGetClassFromName(PetscLogState state, const char name[], PetscLogClass *clss)
5606873511fSToby Isaac {
5616873511fSToby Isaac   PetscFunctionBegin;
5626873511fSToby Isaac   PetscCall(PetscLogRegistryGetClassFromName(state->registry, name, clss));
5636873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
5646873511fSToby Isaac }
5656873511fSToby Isaac 
5666873511fSToby Isaac /*@
5676873511fSToby Isaac   PetscLogStateGetClassFromClassId - Get a `PetscLogClass` from the `PetscClassId` it was registered with.
5686873511fSToby Isaac 
5696873511fSToby Isaac   Not collective
5706873511fSToby Isaac 
5716873511fSToby Isaac   Input Parameters:
5726873511fSToby Isaac + state   - a `PetscLogState`
5736873511fSToby Isaac - classid - a `PetscClassId`
5746873511fSToby Isaac 
5756873511fSToby Isaac   Output Parameter:
5766873511fSToby Isaac . clss - the classes's logging id
5776873511fSToby Isaac 
5786873511fSToby Isaac   Level: developer
5796873511fSToby Isaac 
5806873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`, `PetscLogStateClassGetInfo()`
5816873511fSToby Isaac @*/
5826873511fSToby Isaac PetscErrorCode PetscLogStateGetClassFromClassId(PetscLogState state, PetscClassId classid, PetscLogClass *clss)
5836873511fSToby Isaac {
5846873511fSToby Isaac   PetscFunctionBegin;
5856873511fSToby Isaac   PetscCall(PetscLogRegistryGetClassFromClassId(state->registry, classid, clss));
5866873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
5876873511fSToby Isaac }
5886873511fSToby Isaac 
5896873511fSToby Isaac /*@
5906873511fSToby Isaac   PetscLogStateGetNumEvents - Get the number of registered events in a logging state.
5916873511fSToby Isaac 
5926873511fSToby Isaac   Not collective
5936873511fSToby Isaac 
5946873511fSToby Isaac   Input Parameter:
5956873511fSToby Isaac . state - a `PetscLogState`
5966873511fSToby Isaac 
5976873511fSToby Isaac   Output Parameter:
5986873511fSToby Isaac . numEvents - the number of registered `PetscLogEvent`s
5996873511fSToby Isaac 
6006873511fSToby Isaac   Level: developer
6016873511fSToby Isaac 
6026873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventRegister()`
6036873511fSToby Isaac @*/
6046873511fSToby Isaac PetscErrorCode PetscLogStateGetNumEvents(PetscLogState state, PetscInt *numEvents)
6056873511fSToby Isaac {
6066873511fSToby Isaac   PetscFunctionBegin;
6076873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumEvents(state->registry, numEvents, NULL));
6086873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6096873511fSToby Isaac }
6106873511fSToby Isaac 
6116873511fSToby Isaac /*@
6126873511fSToby Isaac   PetscLogStateGetNumStages - Get the number of registered stages in a logging state.
6136873511fSToby Isaac 
6146873511fSToby Isaac   Not collective
6156873511fSToby Isaac 
6166873511fSToby Isaac   Input Parameter:
6176873511fSToby Isaac . state - a `PetscLogState`
6186873511fSToby Isaac 
6196873511fSToby Isaac   Output Parameter:
6206873511fSToby Isaac . numStages - the number of registered `PetscLogStage`s
6216873511fSToby Isaac 
6226873511fSToby Isaac   Level: developer
6236873511fSToby Isaac 
6246873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`
6256873511fSToby Isaac @*/
6266873511fSToby Isaac PetscErrorCode PetscLogStateGetNumStages(PetscLogState state, PetscInt *numStages)
6276873511fSToby Isaac {
6286873511fSToby Isaac   PetscFunctionBegin;
6296873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumStages(state->registry, numStages, NULL));
6306873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6316873511fSToby Isaac }
6326873511fSToby Isaac 
6336873511fSToby Isaac /*@
6346873511fSToby Isaac   PetscLogStateGetNumClasses - Get the number of registered classes in a logging state.
6356873511fSToby Isaac 
6366873511fSToby Isaac   Not collective
6376873511fSToby Isaac 
6386873511fSToby Isaac   Input Parameter:
6396873511fSToby Isaac . state - a `PetscLogState`
6406873511fSToby Isaac 
6416873511fSToby Isaac   Output Parameter:
6426873511fSToby Isaac . numClasses - the number of registered `PetscLogClass`s
6436873511fSToby Isaac 
6446873511fSToby Isaac   Level: developer
6456873511fSToby Isaac 
6466873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`
6476873511fSToby Isaac @*/
6486873511fSToby Isaac PetscErrorCode PetscLogStateGetNumClasses(PetscLogState state, PetscInt *numClasses)
6496873511fSToby Isaac {
6506873511fSToby Isaac   PetscFunctionBegin;
6516873511fSToby Isaac   PetscCall(PetscLogRegistryGetNumClasses(state->registry, numClasses, NULL));
6526873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6536873511fSToby Isaac }
6546873511fSToby Isaac 
6556873511fSToby Isaac /*@
6566873511fSToby Isaac   PetscLogStateEventGetInfo - Get the registration information of an event
6576873511fSToby Isaac 
6586873511fSToby Isaac   Not collective
6596873511fSToby Isaac 
6606873511fSToby Isaac   Input Parameters:
6616873511fSToby Isaac + state - a `PetscLogState`
6626873511fSToby Isaac - event - a registered `PetscLogEvent`
6636873511fSToby Isaac 
6646873511fSToby Isaac   Output Parameter:
6656873511fSToby Isaac . info - the `PetscLogEventInfo` of the event will be copied into info
6666873511fSToby Isaac 
6676873511fSToby Isaac   Level: developer
6686873511fSToby Isaac 
6696873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventRegister()`, `PetscLogStateGetEventFromName()`
6706873511fSToby Isaac @*/
6716873511fSToby Isaac PetscErrorCode PetscLogStateEventGetInfo(PetscLogState state, PetscLogEvent event, PetscLogEventInfo *info)
6726873511fSToby Isaac {
6736873511fSToby Isaac   PetscFunctionBegin;
6746873511fSToby Isaac   PetscCall(PetscLogRegistryEventGetInfo(state->registry, event, info));
6756873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6766873511fSToby Isaac }
6776873511fSToby Isaac 
6786873511fSToby Isaac /*@
6796873511fSToby Isaac   PetscLogStateStageGetInfo - Get the registration information of an stage
6806873511fSToby Isaac 
6816873511fSToby Isaac   Not collective
6826873511fSToby Isaac 
6836873511fSToby Isaac   Input Parameters:
6846873511fSToby Isaac + state - a `PetscLogState`
6856873511fSToby Isaac - stage - a registered `PetscLogStage`
6866873511fSToby Isaac 
6876873511fSToby Isaac   Output Parameter:
6886873511fSToby Isaac . info - the `PetscLogStageInfo` of the stage will be copied into info
6896873511fSToby Isaac 
6906873511fSToby Isaac   Level: developer
6916873511fSToby Isaac 
6926873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateGetStageFromName()`
6936873511fSToby Isaac @*/
6946873511fSToby Isaac PetscErrorCode PetscLogStateStageGetInfo(PetscLogState state, PetscLogStage stage, PetscLogStageInfo *info)
6956873511fSToby Isaac {
6966873511fSToby Isaac   PetscFunctionBegin;
6976873511fSToby Isaac   PetscCall(PetscLogRegistryStageGetInfo(state->registry, stage, info));
6986873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6996873511fSToby Isaac }
7006873511fSToby Isaac 
7016873511fSToby Isaac /*@
702b665b14eSToby Isaac   PetscLogStateClassRegister - Register a class to with a `PetscLogState` used by `PetscLogHandler`s.
7036873511fSToby Isaac 
7046873511fSToby Isaac   Logically collective on `PETSC_COMM_WORLD`
7056873511fSToby Isaac 
7066873511fSToby Isaac   Input Parameters:
7076873511fSToby Isaac + state - a `PetscLogState`
7086873511fSToby Isaac . name  - the name of a class registered with `PetscClassIdRegister()`
7096873511fSToby Isaac - id    - the `PetscClassId` obtained from `PetscClassIdRegister()`
7106873511fSToby Isaac 
7116873511fSToby Isaac   Output Parameter:
7126873511fSToby Isaac . logclass - a `PetscLogClass` for this class with this state
7136873511fSToby Isaac 
7146873511fSToby Isaac   Level: developer
7156873511fSToby Isaac 
7166873511fSToby Isaac   Note:
7176873511fSToby Isaac   Classes are automatically registered with PETSc's global logging state (`PetscLogGetState()`), so this
7186873511fSToby Isaac   is only needed for non-global states.
7196873511fSToby Isaac 
7206873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogStateClassGetInfo()` `PetscLogStateGetClassFromName()`, `PetscLogStateGetClassFromClassId()`
7216873511fSToby Isaac @*/
7226873511fSToby Isaac PetscErrorCode PetscLogStateClassRegister(PetscLogState state, const char name[], PetscClassId id, PetscLogClass *logclass)
7236873511fSToby Isaac {
7246873511fSToby Isaac   PetscFunctionBegin;
7256873511fSToby Isaac   PetscCall(PetscLogRegistryClassRegister(state->registry, name, id, logclass));
7266873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
7276873511fSToby Isaac }
7286873511fSToby Isaac 
7296873511fSToby Isaac /*@
7306873511fSToby Isaac   PetscLogStateClassGetInfo - Get the registration information of an class
7316873511fSToby Isaac 
7326873511fSToby Isaac   Not collective
7336873511fSToby Isaac 
7346873511fSToby Isaac   Input Parameters:
7356873511fSToby Isaac + state - a `PetscLogState`
7366873511fSToby Isaac - clss  - a registered `PetscLogClass`
7376873511fSToby Isaac 
7386873511fSToby Isaac   Output Parameter:
7396873511fSToby Isaac . info - the `PetscLogClassInfo` of the class will be copied into info
7406873511fSToby Isaac 
7416873511fSToby Isaac   Level: developer
7426873511fSToby Isaac 
7436873511fSToby Isaac .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`, `PetscLogStateGetClassFromName()`
7446873511fSToby Isaac @*/
7456873511fSToby Isaac PetscErrorCode PetscLogStateClassGetInfo(PetscLogState state, PetscLogClass clss, PetscLogClassInfo *info)
7466873511fSToby Isaac {
7476873511fSToby Isaac   PetscFunctionBegin;
7486873511fSToby Isaac   PetscCall(PetscLogRegistryClassGetInfo(state->registry, clss, info));
7496873511fSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
7506873511fSToby Isaac }
751