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
 23: #if PetscDefined(HAVE_HIP)
 24: PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_ROCTX(PetscLogHandler);
 25: #endif

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

 51: /*@C
 52:   PetscLogHandlerRegister - Register a new `PetscLogHandler`

 54:   Not Collective, No Fortran Support

 56:   Input Parameters:
 57: + sname    - The name of a new user-defined creation routine
 58: - function - The creation routine

 60:   Example Usage:
 61: .vb
 62:     PetscLogHandlerRegister("my_profiler", MyPetscLogHandlerCreate);
 63: .ve

 65:   Then, your `PetscLogHandler` type can be chosen with the procedural interface via
 66: .vb
 67:     PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *);
 68:     PetscLogHandlerSetType(PetscFE, "my_fe");
 69: .ve

 71:   Level: developer

 73: .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerSetType()`, `PetscLogHandlerGetType()`
 74: @*/
 75: PetscErrorCode PetscLogHandlerRegister(const char sname[], PetscErrorCode (*function)(PetscLogHandler))
 76: {
 77:   PetscFunctionBegin;
 78:   PetscCall(PetscFunctionListAdd(&PetscLogHandlerList, sname, function));
 79:   PetscFunctionReturn(PETSC_SUCCESS);
 80: }

 82: /*@C
 83:   PetscLogHandlerSetType - Set the type of a `PetscLogHandler`

 85:   Input Parameters:
 86: + handler - the `PetscLogHandler`
 87: - name    - The kind of log handler

 89:   Level: developer

 91: .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerGetType()`
 92: @*/
 93: PetscErrorCode PetscLogHandlerSetType(PetscLogHandler handler, PetscLogHandlerType name)
 94: {
 95:   PetscErrorCode (*r)(PetscLogHandler);
 96:   PetscBool match;

 98:   PetscFunctionBegin;
100:   PetscCall(PetscObjectTypeCompare((PetscObject)handler, name, &match));
101:   if (match) PetscFunctionReturn(PETSC_SUCCESS);

103:   PetscCall(PetscLogHandlerRegisterAll());
104:   PetscCall(PetscFunctionListFind(PetscLogHandlerList, name, &r));
105:   PetscCheck(r, PetscObjectComm((PetscObject)handler), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscLogHandler type: %s", name);

107:   PetscTryTypeMethod(handler, destroy);
108:   handler->ops->destroy = NULL;

110:   PetscCall((*r)(handler));
111:   PetscCall(PetscObjectChangeTypeName((PetscObject)handler, name));
112:   PetscFunctionReturn(PETSC_SUCCESS);
113: }

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

118:   Not collective

120:   Input Parameter:
121: . handler - the `PetscLogHandler`

123:   Output Parameter:
124: . name - The `PetscLogHandlerType` name

126:   Level: developer

128: .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerSetType()`
129: @*/
130: PetscErrorCode PetscLogHandlerGetType(PetscLogHandler handler, PetscLogHandlerType *name)
131: {
132:   PetscFunctionBegin;
134:   PetscAssertPointer(name, 2);
135:   PetscCall(PetscLogHandlerRegisterAll());
136:   PetscCall(PetscObjectGetType((PetscObject)handler, name));
137:   PetscFunctionReturn(PETSC_SUCCESS);
138: }

140: static PetscErrorCode PetscLogHandlerFinalizePackage(void)
141: {
142:   PetscFunctionBegin;
143:   PetscCall(PetscFunctionListDestroy(&PetscLogHandlerList));
144:   PetscLogHandlerRegisterAllCalled  = PETSC_FALSE;
145:   PetscLogHandlerPackageInitialized = PETSC_FALSE;
146:   PetscFunctionReturn(PETSC_SUCCESS);
147: }

149: PetscErrorCode PetscLogHandlerPackageInitialize(void)
150: {
151:   PetscFunctionBegin;
152:   if (PetscLogHandlerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
153:   PetscLogHandlerPackageInitialized = PETSC_TRUE;

155:   PetscCall(PetscClassIdRegister("PETSc Log Handler", &PETSCLOGHANDLER_CLASSID));
156:   PetscCall(PetscLogHandlerRegisterAll());
157:   PetscCall(PetscRegisterFinalize(PetscLogHandlerFinalizePackage));
158:   {
159:     const PetscClassId classids[] = {PETSCLOGHANDLER_CLASSID};

161:     PetscCall(PetscInfoProcessClass("loghandler", PETSC_STATIC_ARRAY_LENGTH(classids), classids));
162:   }
163:   PetscFunctionReturn(PETSC_SUCCESS);
164: }