Actual source code: lhreg.c

  1: #include <petsc/private/petscimpl.h>
  2: #include <petsc/private/loghandlerimpl.h>

  4: PetscClassId PETSCLOGHANDLER_CLASSID = 0;

  6: PetscFunctionList PetscLogHandlerList               = NULL;
  7: PetscBool         PetscLogHandlerRegisterAllCalled  = PETSC_FALSE;
  8: PetscBool         PetscLogHandlerPackageInitialized = PETSC_FALSE;

 10: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Default(PetscLogHandler);
 11: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(PetscLogHandler);
 12: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Trace(PetscLogHandler);
 13: #if PetscDefined(HAVE_MPE)
 14: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_MPE(PetscLogHandler);
 15: #endif
 16: #if PetscDefined(HAVE_TAU_PERFSTUBS)
 17: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Perfstubs(PetscLogHandler);
 18: #endif
 19: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Legacy(PetscLogHandler);
 20: #if PetscDefined(HAVE_CUDA)
 21: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler);
 22: #endif

 24: static PetscErrorCode PetscLogHandlerRegisterAll(void)
 25: {
 26:   PetscFunctionBegin;
 27:   if (PetscLogHandlerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
 28:   PetscLogHandlerRegisterAllCalled = PETSC_TRUE;
 29:   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERDEFAULT, PetscLogHandlerCreate_Default));
 30:   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNESTED, PetscLogHandlerCreate_Nested));
 31:   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERTRACE, PetscLogHandlerCreate_Trace));
 32: #if PetscDefined(HAVE_MPE)
 33:   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERMPE, PetscLogHandlerCreate_MPE));
 34: #endif
 35: #if PetscDefined(HAVE_TAU_PERFSTUBS)
 36:   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERPERFSTUBS, PetscLogHandlerCreate_Perfstubs));
 37: #endif
 38:   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERLEGACY, PetscLogHandlerCreate_Legacy));
 39: #if PetscDefined(HAVE_CUDA)
 40:   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNVTX, PetscLogHandlerCreate_NVTX));
 41: #endif
 42:   PetscFunctionReturn(PETSC_SUCCESS);
 43: }

 45: /*@C
 46:   PetscLogHandlerRegister - Register a new `PetscLogHandler`

 48:   Not collective

 50:   Input Parameters:
 51: + sname    - The name of a new user-defined creation routine
 52: - function - The creation routine

 54:   Example Usage:
 55: .vb
 56:     PetscLogHandlerRegister("my_profiler", MyPetscLogHandlerCreate);
 57: .ve

 59:   Then, your `PetscLogHandler` type can be chosen with the procedural interface via
 60: .vb
 61:     PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *);
 62:     PetscLogHandlerSetType(PetscFE, "my_fe");
 63: .ve

 65:   Level: developer

 67: .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerSetType()`, `PetscLogHandlerGetType()`
 68: @*/
 69: PetscErrorCode PetscLogHandlerRegister(const char sname[], PetscErrorCode (*function)(PetscLogHandler))
 70: {
 71:   PetscFunctionBegin;
 72:   PetscCall(PetscFunctionListAdd(&PetscLogHandlerList, sname, function));
 73:   PetscFunctionReturn(PETSC_SUCCESS);
 74: }

 76: /*@C
 77:   PetscLogHandlerSetType - Set the type of a `PetscLogHandler`

 79:   Input Parameters:
 80: + handler - the `PetscLogHandler`
 81: - name    - The kind of log handler

 83:   Level: developer

 85: .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerGetType()`
 86: @*/
 87: PetscErrorCode PetscLogHandlerSetType(PetscLogHandler handler, PetscLogHandlerType name)
 88: {
 89:   PetscErrorCode (*r)(PetscLogHandler);
 90:   PetscBool match;

 92:   PetscFunctionBegin;
 94:   PetscCall(PetscObjectTypeCompare((PetscObject)handler, name, &match));
 95:   if (match) PetscFunctionReturn(PETSC_SUCCESS);

 97:   PetscCall(PetscLogHandlerRegisterAll());
 98:   PetscCall(PetscFunctionListFind(PetscLogHandlerList, name, &r));
 99:   PetscCheck(r, PetscObjectComm((PetscObject)handler), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscLogHandler type: %s", name);

101:   PetscTryTypeMethod(handler, destroy);
102:   handler->ops->destroy = NULL;

104:   PetscCall((*r)(handler));
105:   PetscCall(PetscObjectChangeTypeName((PetscObject)handler, name));
106:   PetscFunctionReturn(PETSC_SUCCESS);
107: }

109: /*@C
110:   PetscLogHandlerGetType - Gets the `PetscLoagHandlerType` (as a string) from the `PetscLogHandler` object.

112:   Not collective

114:   Input Parameter:
115: . handler - the `PetscLogHandler`

117:   Output Parameter:
118: . name - The `PetscLogHandlerType` name

120:   Level: developer

122: .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerSetType()`
123: @*/
124: PetscErrorCode PetscLogHandlerGetType(PetscLogHandler handler, PetscLogHandlerType *name)
125: {
126:   PetscFunctionBegin;
128:   PetscAssertPointer(name, 2);
129:   PetscCall(PetscLogHandlerRegisterAll());
130:   PetscCall(PetscObjectGetType((PetscObject)handler, name));
131:   PetscFunctionReturn(PETSC_SUCCESS);
132: }

134: static PetscErrorCode PetscLogHandlerFinalizePackage(void)
135: {
136:   PetscFunctionBegin;
137:   PetscCall(PetscFunctionListDestroy(&PetscLogHandlerList));
138:   PetscLogHandlerRegisterAllCalled  = PETSC_FALSE;
139:   PetscLogHandlerPackageInitialized = PETSC_FALSE;
140:   PetscFunctionReturn(PETSC_SUCCESS);
141: }

143: PetscErrorCode PetscLogHandlerPackageInitialize(void)
144: {
145:   PetscFunctionBegin;
146:   if (PetscLogHandlerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
147:   PetscLogHandlerPackageInitialized = PETSC_TRUE;

149:   PetscCall(PetscClassIdRegister("Petsc Log Handler", &PETSCLOGHANDLER_CLASSID));
150:   PetscCall(PetscLogHandlerRegisterAll());
151:   PetscCall(PetscRegisterFinalize(PetscLogHandlerFinalizePackage));
152:   {
153:     const PetscClassId classids[] = {PETSCLOGHANDLER_CLASSID};

155:     PetscCall(PetscInfoProcessClass("loghandler", PETSC_STATIC_ARRAY_LENGTH(classids), classids));
156:   }
157:   PetscFunctionReturn(PETSC_SUCCESS);
158: }