1*9de6b0b6SToby Isaac const char help[] = "How to create a log handler using legacy callbacks"; 2*9de6b0b6SToby Isaac 3*9de6b0b6SToby Isaac #include <petscsys.h> 4*9de6b0b6SToby Isaac 5*9de6b0b6SToby Isaac /* Log handlers that use the legacy callbacks have no context pointer, 6*9de6b0b6SToby Isaac but they can access global logging information. If your log handler only 7*9de6b0b6SToby Isaac needs to interact with the arguments to the callback functions and global 8*9de6b0b6SToby Isaac data structures, the legacy callbacks can be used. */ 9*9de6b0b6SToby Isaac 10*9de6b0b6SToby Isaac #define PrintData(format_string, ...) \ 11*9de6b0b6SToby Isaac do { \ 12*9de6b0b6SToby Isaac PetscMPIInt rank; \ 13*9de6b0b6SToby Isaac PetscLogDouble time; \ 14*9de6b0b6SToby Isaac PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); \ 15*9de6b0b6SToby Isaac PetscCall(PetscTime(&time)); \ 16*9de6b0b6SToby Isaac PetscCall(PetscPrintf(PETSC_COMM_SELF, "[%d:%g:%-22s] " format_string, rank, time, PETSC_FUNCTION_NAME, __VA_ARGS__)); \ 17*9de6b0b6SToby Isaac } while (0) 18*9de6b0b6SToby Isaac 19*9de6b0b6SToby Isaac static PetscErrorCode MyEventBeginHandler(PetscLogEvent event, int _unused, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 20*9de6b0b6SToby Isaac { 21*9de6b0b6SToby Isaac const char *name; 22*9de6b0b6SToby Isaac PetscObject objs[] = {o1, o2, o3, o4}; 23*9de6b0b6SToby Isaac 24*9de6b0b6SToby Isaac PetscFunctionBegin; 25*9de6b0b6SToby Isaac PetscCall(PetscLogEventGetName(event, &name)); 26*9de6b0b6SToby Isaac PrintData("event name: %s\n", name); 27*9de6b0b6SToby Isaac for (int i = 0; i < 4; i++) { 28*9de6b0b6SToby Isaac if (objs[i]) { 29*9de6b0b6SToby Isaac const char *obj_name; 30*9de6b0b6SToby Isaac PetscCall(PetscObjectGetName(objs[i], &obj_name)); 31*9de6b0b6SToby Isaac PrintData(" associated object name: %s\n", obj_name); 32*9de6b0b6SToby Isaac } 33*9de6b0b6SToby Isaac } 34*9de6b0b6SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 35*9de6b0b6SToby Isaac } 36*9de6b0b6SToby Isaac 37*9de6b0b6SToby Isaac static PetscErrorCode MyEventEndHandler(PetscLogEvent event, int _unused, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 38*9de6b0b6SToby Isaac { 39*9de6b0b6SToby Isaac const char *name; 40*9de6b0b6SToby Isaac 41*9de6b0b6SToby Isaac PetscFunctionBegin; 42*9de6b0b6SToby Isaac PetscCall(PetscLogEventGetName(event, &name)); 43*9de6b0b6SToby Isaac PrintData("event name: %s\n", name); 44*9de6b0b6SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 45*9de6b0b6SToby Isaac } 46*9de6b0b6SToby Isaac 47*9de6b0b6SToby Isaac static PetscErrorCode MyObjectCreateHandler(PetscObject o) 48*9de6b0b6SToby Isaac { 49*9de6b0b6SToby Isaac const char *obj_class; 50*9de6b0b6SToby Isaac 51*9de6b0b6SToby Isaac PetscCall(PetscObjectGetClassName(o, &obj_class)); 52*9de6b0b6SToby Isaac PetscFunctionBegin; 53*9de6b0b6SToby Isaac PrintData("object class: %s\n", obj_class); 54*9de6b0b6SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 55*9de6b0b6SToby Isaac } 56*9de6b0b6SToby Isaac 57*9de6b0b6SToby Isaac static PetscErrorCode MyObjectDestroyHandler(PetscObject o) 58*9de6b0b6SToby Isaac { 59*9de6b0b6SToby Isaac const char *obj_class; 60*9de6b0b6SToby Isaac const char *name; 61*9de6b0b6SToby Isaac 62*9de6b0b6SToby Isaac PetscCall(PetscObjectGetClassName(o, &obj_class)); 63*9de6b0b6SToby Isaac PetscCall(PetscObjectGetName(o, &name)); 64*9de6b0b6SToby Isaac PetscFunctionBegin; 65*9de6b0b6SToby Isaac PrintData("object type: %s, name: %s\n", obj_class, name); 66*9de6b0b6SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 67*9de6b0b6SToby Isaac } 68*9de6b0b6SToby Isaac 69*9de6b0b6SToby Isaac int main(int argc, char **argv) 70*9de6b0b6SToby Isaac { 71*9de6b0b6SToby Isaac PetscLogEvent event; 72*9de6b0b6SToby Isaac PetscLogStage stage; 73*9de6b0b6SToby Isaac PetscContainer o1, o2, o3, o4; 74*9de6b0b6SToby Isaac 75*9de6b0b6SToby Isaac PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 76*9de6b0b6SToby Isaac PetscCall(PetscLogLegacyCallbacksBegin(MyEventBeginHandler, MyEventEndHandler, MyObjectCreateHandler, MyObjectDestroyHandler)); 77*9de6b0b6SToby Isaac PetscCall(PetscLogStageRegister("User stage", &stage)); 78*9de6b0b6SToby Isaac PetscCall(PetscLogEventRegister("User class", PETSC_CONTAINER_CLASSID, &event)); 79*9de6b0b6SToby Isaac PetscCall(PetscLogStagePush(stage)); 80*9de6b0b6SToby Isaac PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o1)); 81*9de6b0b6SToby Isaac PetscCall(PetscObjectSetName((PetscObject)o1, "Container 1")); 82*9de6b0b6SToby Isaac PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o2)); 83*9de6b0b6SToby Isaac PetscCall(PetscObjectSetName((PetscObject)o2, "Container 2")); 84*9de6b0b6SToby Isaac PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o3)); 85*9de6b0b6SToby Isaac PetscCall(PetscObjectSetName((PetscObject)o3, "Container 3")); 86*9de6b0b6SToby Isaac PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o4)); 87*9de6b0b6SToby Isaac PetscCall(PetscObjectSetName((PetscObject)o4, "Container 4")); 88*9de6b0b6SToby Isaac PetscCall(PetscLogEventBegin(event, o1, o2, o3, o4)); 89*9de6b0b6SToby Isaac PetscCall(PetscLogEventEnd(event, o1, o2, o3, o4)); 90*9de6b0b6SToby Isaac PetscCall(PetscContainerDestroy(&o1)); 91*9de6b0b6SToby Isaac PetscCall(PetscContainerDestroy(&o2)); 92*9de6b0b6SToby Isaac PetscCall(PetscContainerDestroy(&o3)); 93*9de6b0b6SToby Isaac PetscCall(PetscContainerDestroy(&o4)); 94*9de6b0b6SToby Isaac PetscCall(PetscLogStagePop()); 95*9de6b0b6SToby Isaac PetscCall(PetscFinalize()); 96*9de6b0b6SToby Isaac return 0; 97*9de6b0b6SToby Isaac } 98*9de6b0b6SToby Isaac 99*9de6b0b6SToby Isaac /*TEST 100*9de6b0b6SToby Isaac 101*9de6b0b6SToby Isaac test: 102*9de6b0b6SToby Isaac suffix: 0 103*9de6b0b6SToby Isaac requires: defined(PETSC_USE_LOG) 104*9de6b0b6SToby Isaac filter: sed -E "s/:[^:]+:/:time_removed:/g" 105*9de6b0b6SToby Isaac 106*9de6b0b6SToby Isaac TEST*/ 107