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