10970d93fSToby Isaac #include <petsc/private/loghandlerimpl.h> 20970d93fSToby Isaac 30970d93fSToby Isaac typedef struct _n_PetscLogHandler_Legacy *PetscLogHandler_Legacy; 40970d93fSToby Isaac struct _n_PetscLogHandler_Legacy { 50970d93fSToby Isaac PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 60970d93fSToby Isaac PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject); 70970d93fSToby Isaac PetscErrorCode (*PetscLogPHC)(PetscObject); 80970d93fSToby Isaac PetscErrorCode (*PetscLogPHD)(PetscObject); 90970d93fSToby Isaac }; 100970d93fSToby Isaac 110970d93fSToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_Legacy(PetscLogHandler handler, PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 120970d93fSToby Isaac { 130970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 140970d93fSToby Isaac 15*f4f49eeaSPierre Jolivet return (*legacy->PetscLogPLB)(e, 0, o1, o2, o3, o4); 160970d93fSToby Isaac } 170970d93fSToby Isaac 180970d93fSToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_Legacy(PetscLogHandler handler, PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 190970d93fSToby Isaac { 200970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 210970d93fSToby Isaac 22*f4f49eeaSPierre Jolivet return (*legacy->PetscLogPLE)(e, 0, o1, o2, o3, o4); 230970d93fSToby Isaac } 240970d93fSToby Isaac 250970d93fSToby Isaac static PetscErrorCode PetscLogHandlerObjectCreate_Legacy(PetscLogHandler handler, PetscObject o) 260970d93fSToby Isaac { 270970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 280970d93fSToby Isaac 29*f4f49eeaSPierre Jolivet return (*legacy->PetscLogPHC)(o); 300970d93fSToby Isaac } 310970d93fSToby Isaac 320970d93fSToby Isaac static PetscErrorCode PetscLogHandlerObjectDestroy_Legacy(PetscLogHandler handler, PetscObject o) 330970d93fSToby Isaac { 340970d93fSToby Isaac PetscLogHandler_Legacy legacy = (PetscLogHandler_Legacy)handler->data; 350970d93fSToby Isaac 36*f4f49eeaSPierre Jolivet return (*legacy->PetscLogPHD)(o); 370970d93fSToby Isaac } 380970d93fSToby Isaac 390970d93fSToby Isaac static PetscErrorCode PetcLogHandlerDestroy_Legacy(PetscLogHandler handler) 400970d93fSToby Isaac { 410970d93fSToby Isaac PetscFunctionBegin; 420970d93fSToby Isaac PetscCall(PetscFree(handler->data)); 430970d93fSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 440970d93fSToby Isaac } 450970d93fSToby Isaac 460970d93fSToby Isaac /*MC 47294de794SToby Isaac PETSCLOGHANDLERLEGACY - PETSCLOGHANDLERLEGACY = "legacy" - A 480970d93fSToby Isaac `PetscLogHandler` that can be constructed from the callbacks used in 49b665b14eSToby Isaac `PetscLogSet()`. A log handler of this type is created and started by 50b665b14eSToby Isaac `PetscLogLegacyCallbacksBegin()`. 510970d93fSToby Isaac 520970d93fSToby Isaac Level: developer 530970d93fSToby Isaac 540970d93fSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreateLegacy()` 550970d93fSToby Isaac M*/ 560970d93fSToby Isaac 570970d93fSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Legacy(PetscLogHandler handler) 580970d93fSToby Isaac { 590970d93fSToby Isaac PetscLogHandler_Legacy legacy; 600970d93fSToby Isaac 610970d93fSToby Isaac PetscFunctionBegin; 620970d93fSToby Isaac PetscCall(PetscNew(&legacy)); 630970d93fSToby Isaac handler->data = (void *)legacy; 640970d93fSToby Isaac handler->ops->destroy = PetcLogHandlerDestroy_Legacy; 650970d93fSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 660970d93fSToby Isaac } 670970d93fSToby Isaac 680970d93fSToby Isaac /*@C 690970d93fSToby Isaac PetscLogHandlerCreateLegacy - Create a `PetscLogHandler` from callbacks matching PETSc's legacy log handler callbacks 700970d93fSToby Isaac 710970d93fSToby Isaac Collective 720970d93fSToby Isaac 730970d93fSToby Isaac Input Parameters: 740970d93fSToby Isaac + comm - an MPI communicator 750970d93fSToby Isaac . PetscLogPLB - a function to call during `PetscLogHandlerEventBegin()` (or `NULL`) 760970d93fSToby Isaac . PetscLogPLE - a function to call during `PetscLogHandlerEventEnd()` (or `NULL`) 770970d93fSToby Isaac . PetscLogPHC - a function to call during `PetscLogHandlerObjectCreate()` (or `NULL`) 780970d93fSToby Isaac - PetscLogPHD - a function to call during `PetscLogHandlerObjectDestroy()` (or `NULL`) 790970d93fSToby Isaac 800970d93fSToby Isaac Output Parameter: 810970d93fSToby Isaac . handler - a `PetscLogHandler` 820970d93fSToby Isaac 830970d93fSToby Isaac Calling sequence of `PetscLogPLB`: 840970d93fSToby Isaac + e - a `PetscLogEvent` that is beginning 850970d93fSToby Isaac . _i - deprecated, unused 860970d93fSToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 870970d93fSToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 880970d93fSToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 890970d93fSToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 900970d93fSToby Isaac 910970d93fSToby Isaac Calling sequence of `PetscLogPLE`: 920970d93fSToby Isaac + e - a `PetscLogEvent` that is beginning 930970d93fSToby Isaac . _i - deprecated, unused 940970d93fSToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`) 950970d93fSToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`) 960970d93fSToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`) 970970d93fSToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`) 980970d93fSToby Isaac 990970d93fSToby Isaac Calling sequence of `PetscLogPHC`: 1000970d93fSToby Isaac . o - a `PetscObject` that has just been created 1010970d93fSToby Isaac 1020970d93fSToby Isaac Calling sequence of `PetscLogPHD`: 1030970d93fSToby Isaac . o - a `PetscObject` that is about to be destroyed 1040970d93fSToby Isaac 1050970d93fSToby Isaac Level: developer 1060970d93fSToby Isaac 1070970d93fSToby Isaac Notes: 1080970d93fSToby Isaac This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code. 1090970d93fSToby Isaac 1100970d93fSToby Isaac `PetscLogLegacyCallbacksBegin()`, which calls this function, creates and starts (`PetscLogHandlerStart()`) a log handler, 1110970d93fSToby Isaac should be used in almost all cases. 1120970d93fSToby Isaac 1130970d93fSToby Isaac .seealso: [](ch_profiling) 1140970d93fSToby Isaac @*/ 1150970d93fSToby 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) 1160970d93fSToby Isaac { 1170970d93fSToby Isaac PetscLogHandler_Legacy legacy; 1180970d93fSToby Isaac PetscLogHandler h; 1194d86920dSPierre Jolivet 1200970d93fSToby Isaac PetscFunctionBegin; 1210970d93fSToby Isaac PetscCall(PetscLogHandlerCreate(comm, handler)); 1220970d93fSToby Isaac h = *handler; 123294de794SToby Isaac PetscCall(PetscLogHandlerSetType(h, PETSCLOGHANDLERLEGACY)); 1240970d93fSToby Isaac legacy = (PetscLogHandler_Legacy)h->data; 1250970d93fSToby Isaac 1260970d93fSToby Isaac legacy->PetscLogPLB = PetscLogPLB; 1270970d93fSToby Isaac legacy->PetscLogPLE = PetscLogPLE; 1280970d93fSToby Isaac legacy->PetscLogPHC = PetscLogPHC; 1290970d93fSToby Isaac legacy->PetscLogPHD = PetscLogPHD; 1300970d93fSToby Isaac 1310970d93fSToby Isaac h->ops->eventbegin = PetscLogPLB ? PetscLogHandlerEventBegin_Legacy : NULL; 1320970d93fSToby Isaac h->ops->eventend = PetscLogPLE ? PetscLogHandlerEventEnd_Legacy : NULL; 1330970d93fSToby Isaac h->ops->objectcreate = PetscLogPHC ? PetscLogHandlerObjectCreate_Legacy : NULL; 1340970d93fSToby Isaac h->ops->objectdestroy = PetscLogPHD ? PetscLogHandlerObjectDestroy_Legacy : NULL; 1350970d93fSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 1360970d93fSToby Isaac } 137