Actual source code: logstate.c
1: #include <petsc/private/logimpl.h>
3: /*@
4: PetscLogStateCreate - Create a logging state.
6: Not collective
8: Output Parameters:
9: . state - a `PetscLogState`
11: Level: developer
13: Note:
14: Most users will not need to create a `PetscLogState`. The global state `PetscLogState()`
15: is created in `PetscInitialize()`.
17: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateDestroy()`
18: @*/
19: PetscErrorCode PetscLogStateCreate(PetscLogState *state)
20: {
21: PetscInt num_entries, max_events, max_stages;
22: PetscLogState s;
24: PetscFunctionBegin;
25: PetscCall(PetscNew(state));
26: s = *state;
27: PetscCall(PetscLogRegistryCreate(&s->registry));
28: PetscCall(PetscIntStackCreate(&s->stage_stack));
29: PetscCall(PetscLogRegistryGetNumEvents(s->registry, NULL, &max_events));
30: PetscCall(PetscLogRegistryGetNumStages(s->registry, NULL, &max_stages));
32: s->bt_num_events = max_events + 1; // one extra column for default stage activity
33: s->bt_num_stages = max_stages;
34: num_entries = s->bt_num_events * s->bt_num_stages;
35: PetscCall(PetscBTCreate(num_entries, &s->active));
36: s->current_stage = -1;
37: s->refct = 1;
38: PetscFunctionReturn(PETSC_SUCCESS);
39: }
41: /*@
42: PetscLogStateDestroy - Destroy a logging state.
44: Not collective
46: Input Parameters:
47: . state - a `PetscLogState`
49: Level: developer
51: Note:
52: Most users will not need to destroy a `PetscLogState`. The global state `PetscLogState()`
53: is destroyed in `PetscFinalize()`.
55: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateCreate()`
56: @*/
57: PetscErrorCode PetscLogStateDestroy(PetscLogState *state)
58: {
59: PetscLogState s;
61: PetscFunctionBegin;
62: s = *state;
63: *state = NULL;
64: if (s == NULL || --(s->refct) > 0) PetscFunctionReturn(PETSC_SUCCESS);
65: PetscCall(PetscLogRegistryDestroy(s->registry));
66: PetscCall(PetscIntStackDestroy(s->stage_stack));
67: PetscCall(PetscBTDestroy(&s->active));
68: PetscCall(PetscFree(s));
69: PetscFunctionReturn(PETSC_SUCCESS);
70: }
72: /*@
73: PetscLogStateStagePush - Start a new logging stage.
75: Not collective
77: Input Parameters:
78: + state - a `PetscLogState`
79: - stage - a registered `PetscLogStage`
81: Level: developer
83: Note:
84: This is called for the global state (`PetscLogGetState()`) in `PetscLogStagePush()`.
86: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStagePop()`, `PetscLogStateGetCurrentStage()`
87: @*/
88: PetscErrorCode PetscLogStateStagePush(PetscLogState state, PetscLogStage stage)
89: {
90: PetscFunctionBegin;
91: if (PetscDefined(USE_DEBUG)) {
92: PetscInt num_stages;
93: PetscCall(PetscLogRegistryGetNumStages(state->registry, &num_stages, NULL));
94: PetscCheck(stage >= 0 && stage < num_stages, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid stage %d not in [0,%d)", stage, (int)num_stages);
95: }
96: PetscCall(PetscIntStackPush(state->stage_stack, stage));
97: state->current_stage = stage;
98: PetscFunctionReturn(PETSC_SUCCESS);
99: }
101: /*@
102: PetscLogStateStagePop - End a running logging stage.
104: Not collective
106: Input Parameter:
107: . state - a `PetscLogState`
109: Level: developer
111: Note:
112: This is called for the global state (`PetscLogGetState()`) in `PetscLogStagePush()`.
114: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStagePush()`, `PetscLogStateGetCurrentStage()`
115: @*/
116: PetscErrorCode PetscLogStateStagePop(PetscLogState state)
117: {
118: int curStage;
119: PetscBool empty;
121: PetscFunctionBegin;
122: PetscCall(PetscIntStackPop(state->stage_stack, &curStage));
123: PetscCall(PetscIntStackEmpty(state->stage_stack, &empty));
124: if (!empty) {
125: PetscCall(PetscIntStackTop(state->stage_stack, &state->current_stage));
126: } else state->current_stage = -1;
127: PetscFunctionReturn(PETSC_SUCCESS);
128: }
130: /*@
131: PetscLogStateGetCurrentStage - Get the last stage that was started
133: Not collective
135: Input Parameter:
136: . state - a `PetscLogState`
138: Output Parameter:
139: . current - the last `PetscLogStage` started with `PetscLogStateStagePop()`
141: Level: developer
143: Note:
144: This is called for the global state (`PetscLogGetState()`) in `PetscLogGetCurrentStage()`.
146: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStagePush()`, `PetscLogStateStagePop()`
147: @*/
148: PetscErrorCode PetscLogStateGetCurrentStage(PetscLogState state, PetscLogStage *current)
149: {
150: PetscFunctionBegin;
151: *current = state->current_stage;
152: PetscFunctionReturn(PETSC_SUCCESS);
153: }
155: static PetscErrorCode PetscLogStateResize(PetscLogState state)
156: {
157: PetscBT active_new;
158: PetscInt new_num_events;
159: PetscInt new_num_stages;
161: PetscFunctionBegin;
162: PetscCall(PetscLogRegistryGetNumEvents(state->registry, NULL, &new_num_events));
163: new_num_events++;
164: PetscCall(PetscLogRegistryGetNumStages(state->registry, NULL, &new_num_stages));
166: if (state->bt_num_events == new_num_events && state->bt_num_stages == new_num_stages) PetscFunctionReturn(PETSC_SUCCESS);
167: 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);
168: PetscCall(PetscBTCreate(new_num_events * new_num_stages, &active_new));
169: if (new_num_stages == state->bt_num_stages) {
170: // single memcpy
171: size_t num_chars = (state->bt_num_stages * state->bt_num_events) / PETSC_BITS_PER_BYTE;
173: PetscCall(PetscMemcpy(active_new, state->active, num_chars));
174: } else {
175: size_t num_chars_old = state->bt_num_stages / PETSC_BITS_PER_BYTE;
176: size_t num_chars_new = new_num_stages / PETSC_BITS_PER_BYTE;
178: 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)); }
179: }
180: PetscCall(PetscBTDestroy(&state->active));
181: state->active = active_new;
182: state->bt_num_events = new_num_events;
183: state->bt_num_stages = new_num_stages;
184: PetscFunctionReturn(PETSC_SUCCESS);
185: }
187: /*@
188: PetscLogStateStageRegister - Register a new stage with a logging state
190: Not collective
192: Input Parameters:
193: + state - a `PetscLogState`
194: - sname - a unique name
196: Output Parameter:
197: . stage - the identifier for the registered stage
199: Level: developer
201: Note:
202: This is called for the global state (`PetscLogGetState()`) in `PetscLogStageRegister()`.
204: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStagePush()`, `PetscLogStateStagePop()`
205: @*/
206: PetscErrorCode PetscLogStateStageRegister(PetscLogState state, const char sname[], PetscLogStage *stage)
207: {
208: PetscInt s;
210: PetscFunctionBegin;
211: PetscCall(PetscLogRegistryStageRegister(state->registry, sname, stage));
212: PetscCall(PetscLogStateResize(state));
213: s = *stage;
214: PetscCall(PetscBTSet(state->active, s)); // stages are by default active
215: for (PetscInt e = 1; e < state->bt_num_events; e++) {
216: // copy "Main Stage" activities
217: if (PetscBTLookup(state->active, 0 + e * state->bt_num_stages)) {
218: PetscCall(PetscBTSet(state->active, s + e * state->bt_num_stages));
219: } else {
220: PetscCall(PetscBTClear(state->active, s + e * state->bt_num_stages));
221: }
222: }
223: PetscFunctionReturn(PETSC_SUCCESS);
224: }
226: /*@
227: PetscLogStateEventRegister - Register a new event with a logging state
229: Not collective
231: Input Parameters:
232: + state - a `PetscLogState`
233: . sname - a unique name
234: - id - the `PetscClassId` for the type of object most closely associated with this event
236: Output Parameter:
237: . event - the identifier for the registered event
239: Level: developer
241: Note:
242: This is called for the global state (`PetscLogGetState()`) in `PetscLogEventRegister()`.
244: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStageRegister()`
245: @*/
246: PetscErrorCode PetscLogStateEventRegister(PetscLogState state, const char sname[], PetscClassId id, PetscLogEvent *event)
247: {
248: PetscInt e;
250: PetscFunctionBegin;
251: *event = PETSC_DECIDE;
252: PetscCall(PetscLogRegistryGetEventFromName(state->registry, sname, event));
253: if (*event > 0) PetscFunctionReturn(PETSC_SUCCESS);
254: PetscCall(PetscLogRegistryEventRegister(state->registry, sname, id, event));
255: PetscCall(PetscLogStateResize(state));
256: e = *event;
257: 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
258: PetscFunctionReturn(PETSC_SUCCESS);
259: }
261: /*@
262: PetscLogStateEventSetCollective - Set the collective nature of a logging event
264: Logically collective
266: Input Parameters:
267: + state - a `PetscLogState`
268: . event - a registered `PetscLogEvent`
269: - 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
271: Level: developer
273: Note:
274: This is called for the global state (`PetscLogGetState()`) in `PetscLogEventSetCollective()`.
276: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventRegister()`
277: @*/
278: PetscErrorCode PetscLogStateEventSetCollective(PetscLogState state, PetscLogEvent event, PetscBool collective)
279: {
280: PetscFunctionBegin;
281: PetscCall(PetscLogRegistryEventSetCollective(state->registry, event, collective));
282: PetscFunctionReturn(PETSC_SUCCESS);
283: }
285: /*@
286: PetscLogStateStageSetActive - Mark a stage as active or inactive.
288: Not collective
290: Input Parameters:
291: + state - a `PetscLogState`
292: . stage - a registered `PetscLogStage`
293: - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return `PETSC_FALSE` for all events during this stage
295: Level: developer
297: Note:
298: This is called for the global state (`PetscLogGetState()`) in `PetscLogStageSetActive()`
300: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventSetActive()`
301: @*/
302: PetscErrorCode PetscLogStateStageSetActive(PetscLogState state, PetscLogStage stage, PetscBool isActive)
303: {
304: PetscFunctionBegin;
305: 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);
306: if (isActive) {
307: for (PetscInt e = 0; e < state->bt_num_events; e++) { PetscCall(PetscBTSet(state->active, stage + e * state->bt_num_stages)); }
308: } else {
309: for (PetscInt e = 0; e < state->bt_num_events; e++) { PetscCall(PetscBTClear(state->active, stage + e * state->bt_num_stages)); }
310: }
311: PetscFunctionReturn(PETSC_SUCCESS);
312: }
314: /*@
315: PetscLogStateStageGetActive - Check if a logging stage is active or inactive.
317: Not collective
319: Input Parameters:
320: + state - a `PetscLogState`
321: - stage - a registered `PetscLogStage`
323: Output Parameter:
324: . isActive - if `PETSC_FALSE`, the state should not send logging events to log handlers during this stage.
326: Level: developer
328: Note:
329: This is called for the global state (`PetscLogGetState()`) in `PetscLogStageGetActive()`.
331: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStageSetActive()`, `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogHandlerEventBegin()`, `PetscLogHandlerEventEnd()`
332: @*/
333: PetscErrorCode PetscLogStateStageGetActive(PetscLogState state, PetscLogStage stage, PetscBool *isActive)
334: {
335: PetscFunctionBegin;
336: *isActive = PetscBTLookup(state->active, stage) ? PETSC_TRUE : PETSC_FALSE;
337: PetscFunctionReturn(PETSC_SUCCESS);
338: }
340: /*@
341: PetscLogStateEventSetActive - Set a logging event as active or inactive during a logging stage.
343: Not collective
345: Input Parameters:
346: + state - a `PetscLogState`
347: . stage - a registered `PetscLogStage`, or `PETSC_DEFAULT` for the current stage
348: . event - a registered `PetscLogEvent`
349: - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return `PETSC_FALSE` for this stage and this event
351: Level: developer
353: Note:
354: This is called for the global state (`PetscLogGetState()`) in `PetscLogEventActivate()` and `PetscLogEventDeactivate()`.
356: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateGetCurrentStage()`, `PetscLogEventSetActiveAll()`
357: @*/
358: PetscErrorCode PetscLogStateEventSetActive(PetscLogState state, PetscLogStage stage, PetscLogEvent event, PetscBool isActive)
359: {
360: PetscFunctionBegin;
361: stage = (stage < 0) ? state->current_stage : stage;
362: 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);
363: 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);
364: PetscCall((isActive ? PetscBTSet : PetscBTClear)(state->active, state->current_stage + (event + 1) * state->bt_num_stages));
365: PetscFunctionReturn(PETSC_SUCCESS);
366: }
368: /*@
369: PetscLogStateEventSetActiveAll - Set logging event as active or inactive for all logging stages
371: Not collective
373: Input Parameters:
374: + state - a `PetscLogState`
375: . event - a registered `PetscLogEvent`
376: - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return `PETSC_FALSE` for all stages and all events
378: Level: developer
380: Note:
381: This is called for the global state (`PetscLogGetState()`) in `PetscLogEventSetActiveAll()`.
383: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`
384: @*/
385: PetscErrorCode PetscLogStateEventSetActiveAll(PetscLogState state, PetscLogEvent event, PetscBool isActive)
386: {
387: PetscFunctionBegin;
388: 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);
389: 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)); }
390: PetscFunctionReturn(PETSC_SUCCESS);
391: }
393: /*@
394: PetscLogStateClassSetActive - Set logging events associated with an event as active or inactive during a logging stage.
396: Not collective
398: Input Parameters:
399: + state - a `PetscLogState`
400: . stage - a registered `PetscLogStage`, or `PETSC_DEFAULT` for the current stage
401: . classid - a `PetscClassId`
402: - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return
403: `PETSC_FALSE` for this stage and all events that were associated
404: with this class when they were registered (see
405: `PetscLogStateEventRegister()`).
407: Level: developer
409: Note:
410: This is called for the global state (`PetscLogGetState()`) in `PetscLogEventActivateClass()` and `PetscLogEventDeactivateClass()`.
412: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateEventSetActive()`
413: @*/
414: PetscErrorCode PetscLogStateClassSetActive(PetscLogState state, PetscLogStage stage, PetscClassId classid, PetscBool isActive)
415: {
416: PetscInt num_events;
418: PetscFunctionBegin;
419: stage = stage < 0 ? state->current_stage : stage;
420: 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);
421: PetscCall(PetscLogRegistryGetNumEvents(state->registry, &num_events, NULL));
422: for (PetscLogEvent e = 0; e < num_events; e++) {
423: PetscLogEventInfo event_info;
424: PetscCall(PetscLogRegistryEventGetInfo(state->registry, e, &event_info));
425: if (event_info.classid == classid) PetscCall((isActive ? PetscBTSet : PetscBTClear)(state->active, stage + (e + 1) * state->bt_num_stages));
426: }
427: PetscFunctionReturn(PETSC_SUCCESS);
428: }
430: /*@
431: PetscLogStateClassSetActiveAll - Set logging events associated with an event as active or inactive for all logging stages
433: Not collective
435: Input Parameters:
436: + state - a `PetscLogState`
437: . classid - a `PetscClassId`
438: - isActive - if `PETSC_FALSE`, `PetscLogStateEventGetActive()` will return
439: `PETSC_FALSE` for all events that were associated with this class when they
440: were registered (see `PetscLogStateEventRegister()`).
442: Level: developer
444: Note:
445: This is called for the global state (`PetscLogGetState()`) in `PetscLogEventIncludeClass()` and `PetscLogEventExcludeClass()`.
447: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateClassSetActive()`
448: @*/
449: PetscErrorCode PetscLogStateClassSetActiveAll(PetscLogState state, PetscClassId classid, PetscBool isActive)
450: {
451: PetscInt num_events, num_stages;
453: PetscFunctionBegin;
454: PetscCall(PetscLogRegistryGetNumEvents(state->registry, &num_events, NULL));
455: PetscCall(PetscLogRegistryGetNumStages(state->registry, &num_stages, NULL));
456: for (PetscLogEvent e = 0; e < num_events; e++) {
457: PetscLogEventInfo event_info;
458: PetscCall(PetscLogRegistryEventGetInfo(state->registry, e, &event_info));
459: if (event_info.classid == classid) {
460: for (PetscLogStage s = 0; s < num_stages; s++) { PetscCall((isActive ? PetscBTSet : PetscBTClear)(state->active, s + (e + 1) * state->bt_num_stages)); }
461: }
462: }
463: PetscFunctionReturn(PETSC_SUCCESS);
464: }
466: /*@
467: PetscLogStateEventGetActive - Check if a logging event is active or inactive during a logging stage.
469: Not collective
471: Input Parameters:
472: + state - a `PetscLogState`
473: . stage - a registered `PetscLogStage`, or `PETSC_DEFAULT` for the current stage
474: - event - a registered `PetscLogEvent`
476: Output Parameter:
477: . isActive - If `PETSC_FALSE`, log handlers should not be notified of the event's beginning or end.
479: Level: developer
481: Note:
482: This is called for the global state (`PetscLogGetState()`) in `PetscLogEventGetActive()`, where it has significance
483: for what information is sent to log handlers.
485: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogEventGetActive()`, `PetscLogStateGetCurrentStage()`, `PetscLogHandler()`
486: @*/
487: PetscErrorCode PetscLogStateEventGetActive(PetscLogState state, PetscLogStage stage, PetscLogEvent event, PetscBool *isActive)
488: {
489: PetscFunctionBegin;
490: stage = (stage < 0) ? state->current_stage : stage;
491: 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);
492: 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);
493: *isActive = PetscLogStateStageEventIsActive(state, stage, event) ? PETSC_TRUE : PETSC_FALSE;
494: PetscFunctionReturn(PETSC_SUCCESS);
495: }
497: /*@
498: PetscLogStateGetEventFromName - Get a `PetscLogEvent` from the name it was registered with.
500: Not collective
502: Input Parameters:
503: + state - a `PetscLogState`
504: - name - an event's name
506: Output Parameter:
507: . event - the event's id
509: Level: developer
511: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventRegister()`, `PetscLogStateEventGetInfo()`
512: @*/
513: PetscErrorCode PetscLogStateGetEventFromName(PetscLogState state, const char name[], PetscLogEvent *event)
514: {
515: PetscFunctionBegin;
516: PetscCall(PetscLogRegistryGetEventFromName(state->registry, name, event));
517: PetscFunctionReturn(PETSC_SUCCESS);
518: }
520: /*@
521: PetscLogStateGetStageFromName - Get a `PetscLogStage` from the name it was registered with.
523: Not collective
525: Input Parameters:
526: + state - a `PetscLogState`
527: - name - a stage's name
529: Output Parameter:
530: . stage - the stage's id
532: Level: developer
534: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateStageGetInfo()`
535: @*/
536: PetscErrorCode PetscLogStateGetStageFromName(PetscLogState state, const char name[], PetscLogStage *stage)
537: {
538: PetscFunctionBegin;
539: PetscCall(PetscLogRegistryGetStageFromName(state->registry, name, stage));
540: PetscFunctionReturn(PETSC_SUCCESS);
541: }
543: /*@
544: PetscLogStateGetClassFromName - Get a `PetscLogClass` from the name of the class it was registered with.
546: Not collective
548: Input Parameters:
549: + state - a `PetscLogState`
550: - name - the name string of the class
552: Output Parameter:
553: . clss - the classes's logging id
555: Level: developer
557: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`, `PetscLogStateClassGetInfo()`
558: @*/
559: PetscErrorCode PetscLogStateGetClassFromName(PetscLogState state, const char name[], PetscLogClass *clss)
560: {
561: PetscFunctionBegin;
562: PetscCall(PetscLogRegistryGetClassFromName(state->registry, name, clss));
563: PetscFunctionReturn(PETSC_SUCCESS);
564: }
566: /*@
567: PetscLogStateGetClassFromClassId - Get a `PetscLogClass` from the `PetscClassId` it was registered with.
569: Not collective
571: Input Parameters:
572: + state - a `PetscLogState`
573: - classid - a `PetscClassId`
575: Output Parameter:
576: . clss - the classes's logging id
578: Level: developer
580: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`, `PetscLogStateClassGetInfo()`
581: @*/
582: PetscErrorCode PetscLogStateGetClassFromClassId(PetscLogState state, PetscClassId classid, PetscLogClass *clss)
583: {
584: PetscFunctionBegin;
585: PetscCall(PetscLogRegistryGetClassFromClassId(state->registry, classid, clss));
586: PetscFunctionReturn(PETSC_SUCCESS);
587: }
589: /*@
590: PetscLogStateGetNumEvents - Get the number of registered events in a logging state.
592: Not collective
594: Input Parameter:
595: . state - a `PetscLogState`
597: Output Parameter:
598: . numEvents - the number of registered `PetscLogEvent`s
600: Level: developer
602: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventRegister()`
603: @*/
604: PetscErrorCode PetscLogStateGetNumEvents(PetscLogState state, PetscInt *numEvents)
605: {
606: PetscFunctionBegin;
607: PetscCall(PetscLogRegistryGetNumEvents(state->registry, numEvents, NULL));
608: PetscFunctionReturn(PETSC_SUCCESS);
609: }
611: /*@
612: PetscLogStateGetNumStages - Get the number of registered stages in a logging state.
614: Not collective
616: Input Parameter:
617: . state - a `PetscLogState`
619: Output Parameter:
620: . numStages - the number of registered `PetscLogStage`s
622: Level: developer
624: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`
625: @*/
626: PetscErrorCode PetscLogStateGetNumStages(PetscLogState state, PetscInt *numStages)
627: {
628: PetscFunctionBegin;
629: PetscCall(PetscLogRegistryGetNumStages(state->registry, numStages, NULL));
630: PetscFunctionReturn(PETSC_SUCCESS);
631: }
633: /*@
634: PetscLogStateGetNumClasses - Get the number of registered classes in a logging state.
636: Not collective
638: Input Parameter:
639: . state - a `PetscLogState`
641: Output Parameter:
642: . numClasses - the number of registered `PetscLogClass`s
644: Level: developer
646: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`
647: @*/
648: PetscErrorCode PetscLogStateGetNumClasses(PetscLogState state, PetscInt *numClasses)
649: {
650: PetscFunctionBegin;
651: PetscCall(PetscLogRegistryGetNumClasses(state->registry, numClasses, NULL));
652: PetscFunctionReturn(PETSC_SUCCESS);
653: }
655: /*@
656: PetscLogStateEventGetInfo - Get the registration information of an event
658: Not collective
660: Input Parameters:
661: + state - a `PetscLogState`
662: - event - a registered `PetscLogEvent`
664: Output Parameter:
665: . info - the `PetscLogEventInfo` of the event will be copied into info
667: Level: developer
669: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateEventRegister()`, `PetscLogStateGetEventFromName()`
670: @*/
671: PetscErrorCode PetscLogStateEventGetInfo(PetscLogState state, PetscLogEvent event, PetscLogEventInfo *info)
672: {
673: PetscFunctionBegin;
674: PetscCall(PetscLogRegistryEventGetInfo(state->registry, event, info));
675: PetscFunctionReturn(PETSC_SUCCESS);
676: }
678: /*@
679: PetscLogStateStageGetInfo - Get the registration information of an stage
681: Not collective
683: Input Parameters:
684: + state - a `PetscLogState`
685: - stage - a registered `PetscLogStage`
687: Output Parameter:
688: . info - the `PetscLogStageInfo` of the stage will be copied into info
690: Level: developer
692: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateStageRegister()`, `PetscLogStateGetStageFromName()`
693: @*/
694: PetscErrorCode PetscLogStateStageGetInfo(PetscLogState state, PetscLogStage stage, PetscLogStageInfo *info)
695: {
696: PetscFunctionBegin;
697: PetscCall(PetscLogRegistryStageGetInfo(state->registry, stage, info));
698: PetscFunctionReturn(PETSC_SUCCESS);
699: }
701: /*@
702: PetscLogStateClassRegister - Register a class to with a `PetscLogState` used by `PetscLogHandler`s.
704: Logically collective on `PETSC_COMM_WORLD`
706: Input Parameters:
707: + state - a `PetscLogState`
708: . name - the name of a class registered with `PetscClassIdRegister()`
709: - id - the `PetscClassId` obtained from `PetscClassIdRegister()`
711: Output Parameter:
712: . logclass - a `PetscLogClass` for this class with this state
714: Level: developer
716: Note:
717: Classes are automatically registered with PETSc's global logging state (`PetscLogGetState()`), so this
718: is only needed for non-global states.
720: .seealso: [](ch_profiling), `PetscLogStateClassGetInfo()` `PetscLogStateGetClassFromName()`, `PetscLogStateGetClassFromClassId()`
721: @*/
722: PetscErrorCode PetscLogStateClassRegister(PetscLogState state, const char name[], PetscClassId id, PetscLogClass *logclass)
723: {
724: PetscFunctionBegin;
725: PetscCall(PetscLogRegistryClassRegister(state->registry, name, id, logclass));
726: PetscFunctionReturn(PETSC_SUCCESS);
727: }
729: /*@
730: PetscLogStateClassGetInfo - Get the registration information of an class
732: Not collective
734: Input Parameters:
735: + state - a `PetscLogState`
736: - clss - a registered `PetscLogClass`
738: Output Parameter:
739: . info - the `PetscLogClassInfo` of the class will be copied into info
741: Level: developer
743: .seealso: [](ch_profiling), `PetscLogState`, `PetscLogStateClassRegister()`, `PetscLogStateGetClassFromName()`
744: @*/
745: PetscErrorCode PetscLogStateClassGetInfo(PetscLogState state, PetscLogClass clss, PetscLogClassInfo *info)
746: {
747: PetscFunctionBegin;
748: PetscCall(PetscLogRegistryClassGetInfo(state->registry, clss, info));
749: PetscFunctionReturn(PETSC_SUCCESS);
750: }