1*0970d93fSToby Isaac #include <petsc/private/loghandlerimpl.h> 2*0970d93fSToby Isaac 3*0970d93fSToby Isaac typedef struct _n_PetscLogHandler_Legacy *PetscLogHandler_Legacy; 4*0970d93fSToby Isaac struct _n_PetscLogHandler_Legacy { 5*0970d93fSToby Isaac PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 6*0970d93fSToby Isaac PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 7*0970d93fSToby Isaac PetscErrorCode (*PetscLogPHC)(PetscObject); 8*0970d93fSToby Isaac PetscErrorCode (*PetscLogPHD)(PetscObject); 9*0970d93fSToby Isaac }; 10*0970d93fSToby Isaac 11*0970d93fSToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_Legacy(PetscLogHandler handler, PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 12*0970d93fSToby Isaac { 13*0970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 14*0970d93fSToby Isaac 15*0970d93fSToby Isaac return (*(legacy->PetscLogPLB))(e, 0, o1, o2, o3, o4); 16*0970d93fSToby Isaac } 17*0970d93fSToby Isaac 18*0970d93fSToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_Legacy(PetscLogHandler handler, PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 19*0970d93fSToby Isaac { 20*0970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 21*0970d93fSToby Isaac 22*0970d93fSToby Isaac return (*(legacy->PetscLogPLE))(e, 0, o1, o2, o3, o4); 23*0970d93fSToby Isaac } 24*0970d93fSToby Isaac 25*0970d93fSToby Isaac static PetscErrorCode PetscLogHandlerObjectCreate_Legacy(PetscLogHandler handler, PetscObject o) 26*0970d93fSToby Isaac { 27*0970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 28*0970d93fSToby Isaac 29*0970d93fSToby Isaac return (*(legacy->PetscLogPHC))(o); 30*0970d93fSToby Isaac } 31*0970d93fSToby Isaac 32*0970d93fSToby Isaac static PetscErrorCode PetscLogHandlerObjectDestroy_Legacy(PetscLogHandler handler, PetscObject o) 33*0970d93fSToby Isaac { 34*0970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 35*0970d93fSToby Isaac 36*0970d93fSToby Isaac return (*(legacy->PetscLogPHD))(o); 37*0970d93fSToby Isaac } 38*0970d93fSToby Isaac 39*0970d93fSToby Isaac static PetscErrorCode PetcLogHandlerDestroy_Legacy(PetscLogHandler handler) 40*0970d93fSToby Isaac { 41*0970d93fSToby Isaac PetscFunctionBegin; 42*0970d93fSToby Isaac PetscCall(PetscFree(handler->data)); 43*0970d93fSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 44*0970d93fSToby Isaac } 45*0970d93fSToby Isaac 46*0970d93fSToby Isaac /*MC 47*0970d93fSToby Isaac PETSC_LOG_HANDLER_LEGACY - PETSC_LOG_HANDLER_LEGACY = "legacy" - A 48*0970d93fSToby Isaac `PetscLogHandler` that can be constructed from the callbacks used in 49*0970d93fSToby Isaac `PetscLogSet()`. 50*0970d93fSToby Isaac 51*0970d93fSToby Isaac Level: developer 52*0970d93fSToby Isaac 53*0970d93fSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreateLegacy()` 54*0970d93fSToby Isaac M*/ 55*0970d93fSToby Isaac 56*0970d93fSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Legacy(PetscLogHandler handler) 57*0970d93fSToby Isaac { 58*0970d93fSToby Isaac PetscLogHandler_Legacy legacy; 59*0970d93fSToby Isaac 60*0970d93fSToby Isaac PetscFunctionBegin; 61*0970d93fSToby Isaac PetscCall(PetscNew(&legacy)); 62*0970d93fSToby Isaac handler->data = (void *)legacy; 63*0970d93fSToby Isaac handler->ops->destroy = PetcLogHandlerDestroy_Legacy; 64*0970d93fSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 65*0970d93fSToby Isaac } 66*0970d93fSToby Isaac 67*0970d93fSToby Isaac /*@C 68*0970d93fSToby Isaac PetscLogHandlerCreateLegacy - Create a `PetscLogHandler` from callbacks matching PETSc's legacy log handler callbacks 69*0970d93fSToby Isaac 70*0970d93fSToby Isaac Collective 71*0970d93fSToby Isaac 72*0970d93fSToby Isaac Input Parameters: 73*0970d93fSToby Isaac + comm - an MPI communicator 74*0970d93fSToby Isaac . PetscLogPLB - a function to call during `PetscLogHandlerEventBegin()` (or `NULL`) 75*0970d93fSToby Isaac . PetscLogPLE - a function to call during `PetscLogHandlerEventEnd()` (or `NULL`) 76*0970d93fSToby Isaac . PetscLogPHC - a function to call during `PetscLogHandlerObjectCreate()` (or `NULL`) 77*0970d93fSToby Isaac - PetscLogPHD - a function to call during `PetscLogHandlerObjectDestroy()` (or `NULL`) 78*0970d93fSToby Isaac 79*0970d93fSToby Isaac Output Parameter: 80*0970d93fSToby Isaac . handler - a `PetscLogHandler` 81*0970d93fSToby Isaac 82*0970d93fSToby Isaac Calling sequence of `PetscLogPLB`: 83*0970d93fSToby Isaac + e - a `PetscLogEvent` that is beginning 84*0970d93fSToby Isaac . _i - deprecated, unused 85*0970d93fSToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 86*0970d93fSToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 87*0970d93fSToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 88*0970d93fSToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 89*0970d93fSToby Isaac 90*0970d93fSToby Isaac Calling sequence of `PetscLogPLE`: 91*0970d93fSToby Isaac + e - a `PetscLogEvent` that is beginning 92*0970d93fSToby Isaac . _i - deprecated, unused 93*0970d93fSToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 94*0970d93fSToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 95*0970d93fSToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 96*0970d93fSToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 97*0970d93fSToby Isaac 98*0970d93fSToby Isaac Calling sequence of `PetscLogPHC`: 99*0970d93fSToby Isaac . o - a `PetscObject` that has just been created 100*0970d93fSToby Isaac 101*0970d93fSToby Isaac Calling sequence of `PetscLogPHD`: 102*0970d93fSToby Isaac . o - a `PetscObject` that is about to be destroyed 103*0970d93fSToby Isaac 104*0970d93fSToby Isaac Level: developer 105*0970d93fSToby Isaac 106*0970d93fSToby Isaac Notes: 107*0970d93fSToby Isaac This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code. 108*0970d93fSToby Isaac 109*0970d93fSToby Isaac `PetscLogLegacyCallbacksBegin()`, which calls this function, creates and starts (`PetscLogHandlerStart()`) a log handler, 110*0970d93fSToby Isaac should be used in almost all cases. 111*0970d93fSToby Isaac 112*0970d93fSToby Isaac .seealso: [](ch_profiling) 113*0970d93fSToby Isaac @*/ 114*0970d93fSToby Isaac PetscErrorCode PetscLogHandlerCreateLegacy(MPI_Comm comm, PetscErrorCode (*PetscLogPLB)(PetscLogEvent e, int _i, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4), PetscErrorCode (*PetscLogPLE)(PetscLogEvent e, int _i, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4), PetscErrorCode (*PetscLogPHC)(PetscObject o), PetscErrorCode (*PetscLogPHD)(PetscObject o), PetscLogHandler *handler) 115*0970d93fSToby Isaac { 116*0970d93fSToby Isaac PetscLogHandler_Legacy legacy; 117*0970d93fSToby Isaac 118*0970d93fSToby Isaac PetscLogHandler h; 119*0970d93fSToby Isaac PetscFunctionBegin; 120*0970d93fSToby Isaac PetscCall(PetscLogHandlerCreate(comm, handler)); 121*0970d93fSToby Isaac h = *handler; 122*0970d93fSToby Isaac PetscCall(PetscLogHandlerSetType(h, PETSC_LOG_HANDLER_LEGACY)); 123*0970d93fSToby Isaac legacy = (PetscLogHandler_Legacy)h->data; 124*0970d93fSToby Isaac 125*0970d93fSToby Isaac legacy->PetscLogPLB = PetscLogPLB; 126*0970d93fSToby Isaac legacy->PetscLogPLE = PetscLogPLE; 127*0970d93fSToby Isaac legacy->PetscLogPHC = PetscLogPHC; 128*0970d93fSToby Isaac legacy->PetscLogPHD = PetscLogPHD; 129*0970d93fSToby Isaac 130*0970d93fSToby Isaac h->ops->eventbegin = PetscLogPLB ? PetscLogHandlerEventBegin_Legacy : NULL; 131*0970d93fSToby Isaac h->ops->eventend = PetscLogPLE ? PetscLogHandlerEventEnd_Legacy : NULL; 132*0970d93fSToby Isaac h->ops->objectcreate = PetscLogPHC ? PetscLogHandlerObjectCreate_Legacy : NULL; 133*0970d93fSToby Isaac h->ops->objectdestroy = PetscLogPHD ? PetscLogHandlerObjectDestroy_Legacy : NULL; 134*0970d93fSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 135*0970d93fSToby Isaac } 136