Actual source code: ex68.c

  1: const char help[] = "Test PetscLogEventsPause() and PetscLogEventsUnpause()";

  3: #include <petscsys.h>

  5: int main(int argc, char **argv)
  6: {
  7:   const PetscInt  num_log_events = 4;
  8:   PetscLogStage   main_stage, unrelated_stage_1, unrelated_stage_2;
  9:   PetscLogEvent   runtime_event, unrelated_event[4];
 10:   PetscLogHandler default_handler;
 11:   PetscClassId    runtime_classid, unrelated_classid[4];
 12:   PetscBool       main_visible      = PETSC_FALSE;
 13:   PetscBool       unrelated_visible = PETSC_FALSE;
 14:   PetscBool       get_main_visible;
 15:   PetscBool       get_unrelated_1_visible;
 16:   PetscBool       get_unrelated_2_visible;
 17:   PetscBool       is_active;

 19:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 20:   PetscCall(PetscLogIsActive(&is_active));
 21:   PetscCheck(is_active, PETSC_COMM_WORLD, PETSC_ERR_SUP, "Logging must be active for this test");
 22:   PetscCall(PetscLogActions(PETSC_FALSE));
 23:   PetscCall(PetscLogObjects(PETSC_FALSE));

 25:   PetscOptionsBegin(PETSC_COMM_WORLD, NULL, help, NULL);
 26:   PetscCall(PetscOptionsBool("-main_visible", "The logging visibility of the main stage", NULL, main_visible, &main_visible, NULL));
 27:   PetscCall(PetscOptionsBool("-unrelated_visible", "The logging visibility of the unrelated stage", NULL, unrelated_visible, &unrelated_visible, NULL));
 28:   PetscOptionsEnd();

 30:   /* This test simulates a program with unrelated logging stages and events
 31:      that has to "stop the world" to lazily initialize a runtime.

 33:      - Pausing events should send the log data for the runtime initialization
 34:        to the Main Stage

 36:      - Turning the Main Stage invisible should hide it from -log_view

 38:      So the runtime initialization should be more or less missing from -log_view. */

 40:   PetscCall(PetscClassIdRegister("External runtime", &runtime_classid));
 41:   PetscCall(PetscLogEventRegister("External runtime initialization", runtime_classid, &runtime_event));

 43:   for (PetscInt i = 0; i < num_log_events; i++) {
 44:     char name[32];

 46:     PetscCall(PetscSNPrintf(name, sizeof(name) / sizeof(char), "Unrelated event %" PetscInt_FMT, i));
 47:     PetscCall(PetscClassIdRegister(name, &unrelated_classid[i]));
 48:     PetscCall(PetscLogEventRegister(name, unrelated_classid[i], &unrelated_event[i]));
 49:   }
 50:   PetscCall(PetscLogStageRegister("Unrelated stage 1", &unrelated_stage_1));
 51:   PetscCall(PetscLogStageRegister("Unrelated stage 2", &unrelated_stage_2));
 52:   PetscCall(PetscLogStageGetId("Main Stage", &main_stage));
 53:   PetscCall(PetscLogStageSetVisible(main_stage, main_visible));
 54:   PetscCall(PetscLogStageSetVisible(unrelated_stage_1, unrelated_visible));
 55:   PetscCall(PetscLogStageSetVisible(unrelated_stage_2, unrelated_visible));
 56:   PetscCall(PetscLogGetDefaultHandler(&default_handler));
 57:   if (default_handler) {
 58:     PetscCall(PetscLogStageGetVisible(main_stage, &get_main_visible));
 59:     PetscCall(PetscLogStageGetVisible(unrelated_stage_1, &get_unrelated_1_visible));
 60:     PetscCall(PetscLogStageGetVisible(unrelated_stage_2, &get_unrelated_2_visible));
 61:     PetscCheck(main_visible == get_main_visible, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Get/Set stage visibility discrepancy");
 62:     PetscCheck(unrelated_visible == get_unrelated_1_visible, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Get/Set stage visibility discrepancy");
 63:     PetscCheck(unrelated_visible == get_unrelated_2_visible, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Get/Set stage visibility discrepancy");
 64:   }

 66:   PetscCall(PetscLogStagePush(unrelated_stage_1));
 67:   PetscCall(PetscLogEventBegin(unrelated_event[0], NULL, NULL, NULL, NULL));
 68:   PetscCall(PetscSleep(0.05));
 69:   PetscCall(PetscLogEventBegin(unrelated_event[1], NULL, NULL, NULL, NULL));
 70:   PetscCall(PetscSleep(0.05));
 71:   PetscCall(PetscLogStagePush(unrelated_stage_2));
 72:   PetscCall(PetscLogEventBegin(unrelated_event[2], NULL, NULL, NULL, NULL));
 73:   PetscCall(PetscSleep(0.05));
 74:   PetscCall(PetscLogEventBegin(unrelated_event[3], NULL, NULL, NULL, NULL));
 75:   PetscCall(PetscSleep(0.05));
 76:   PetscCall(PetscLogEventsPause());
 77:   PetscCall(PetscLogEventBegin(runtime_event, NULL, NULL, NULL, NULL));
 78:   PetscCall(PetscSleep(0.2));
 79:   PetscCall(PetscLogEventEnd(runtime_event, NULL, NULL, NULL, NULL));
 80:   PetscCall(PetscLogEventsResume());
 81:   PetscCall(PetscLogEventEnd(unrelated_event[3], NULL, NULL, NULL, NULL));
 82:   PetscCall(PetscSleep(0.05));
 83:   PetscCall(PetscLogEventEnd(unrelated_event[2], NULL, NULL, NULL, NULL));
 84:   PetscCall(PetscSleep(0.05));
 85:   PetscCall(PetscLogStagePop());
 86:   PetscCall(PetscSleep(0.05));
 87:   PetscCall(PetscLogEventEnd(unrelated_event[1], NULL, NULL, NULL, NULL));
 88:   PetscCall(PetscSleep(0.05));
 89:   PetscCall(PetscLogEventEnd(unrelated_event[0], NULL, NULL, NULL, NULL));
 90:   PetscCall(PetscLogStagePop());
 91:   { // test of PetscLogStageGetPerfInfo()
 92:     PetscLogHandler handler;

 94:     PetscCall(PetscLogGetDefaultHandler(&handler));
 95:     if (handler) {
 96:       PetscEventPerfInfo stage_info;

 98:       PetscCall(PetscLogStageGetPerfInfo(unrelated_stage_1, &stage_info));
 99:       (void)stage_info;
100:     }
101:   }
102:   PetscCall(PetscFinalize());
103:   return 0;
104: }

106: /*TEST

108:   # main stage invisible, "External runtime initialization" shouldn't appear in the log
109:   test:
110:     requires: defined(PETSC_USE_LOG)
111:     suffix: 0
112:     args: -log_view -unrelated_visible -log_view_memory
113:     filter: grep -o "\\(External runtime initialization\\|Unrelated event\\)"

115:   # unrelated stage invisible, "Unrelated event" shouldn't appear in the log
116:   test:
117:     requires: defined(PETSC_USE_LOG)
118:     suffix: 1
119:     args: -log_view -main_visible -log_view_memory
120:     filter: grep -o "\\(External runtime initialization\\|Unrelated event\\)"

122: TEST*/