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