119ef957cSToby Isaac #include <petsc/private/petscimpl.h>
219ef957cSToby Isaac #include <petsc/private/loghandlerimpl.h>
319ef957cSToby Isaac
419ef957cSToby Isaac PetscClassId PETSCLOGHANDLER_CLASSID = 0;
519ef957cSToby Isaac
619ef957cSToby Isaac PetscFunctionList PetscLogHandlerList = NULL;
719ef957cSToby Isaac PetscBool PetscLogHandlerRegisterAllCalled = PETSC_FALSE;
819ef957cSToby Isaac PetscBool PetscLogHandlerPackageInitialized = PETSC_FALSE;
919ef957cSToby Isaac
1078f1b9b4SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Default(PetscLogHandler);
11b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(PetscLogHandler);
126467efc9SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Trace(PetscLogHandler);
13856bee69SToby Isaac #if PetscDefined(HAVE_MPE)
14856bee69SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_MPE(PetscLogHandler);
15856bee69SToby Isaac #endif
16ccf0b5c1SToby Isaac #if PetscDefined(HAVE_TAU_PERFSTUBS)
17ccf0b5c1SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Perfstubs(PetscLogHandler);
18ccf0b5c1SToby Isaac #endif
190970d93fSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Legacy(PetscLogHandler);
2061cc7448SToby Isaac #if PetscDefined(HAVE_CUDA)
2161cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler);
2261cc7448SToby Isaac #endif
23*56a72328SZach Atkins #if PetscDefined(HAVE_HIP)
24*56a72328SZach Atkins PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_ROCTX(PetscLogHandler);
25*56a72328SZach Atkins #endif
2678f1b9b4SToby Isaac
PetscLogHandlerRegisterAll(void)2719ef957cSToby Isaac static PetscErrorCode PetscLogHandlerRegisterAll(void)
2819ef957cSToby Isaac {
2919ef957cSToby Isaac PetscFunctionBegin;
3019ef957cSToby Isaac if (PetscLogHandlerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
3119ef957cSToby Isaac PetscLogHandlerRegisterAllCalled = PETSC_TRUE;
32294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERDEFAULT, PetscLogHandlerCreate_Default));
33294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNESTED, PetscLogHandlerCreate_Nested));
34294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERTRACE, PetscLogHandlerCreate_Trace));
35856bee69SToby Isaac #if PetscDefined(HAVE_MPE)
36294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERMPE, PetscLogHandlerCreate_MPE));
37856bee69SToby Isaac #endif
38ccf0b5c1SToby Isaac #if PetscDefined(HAVE_TAU_PERFSTUBS)
39294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERPERFSTUBS, PetscLogHandlerCreate_Perfstubs));
40ccf0b5c1SToby Isaac #endif
41294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERLEGACY, PetscLogHandlerCreate_Legacy));
4261cc7448SToby Isaac #if PetscDefined(HAVE_CUDA)
4361cc7448SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNVTX, PetscLogHandlerCreate_NVTX));
4461cc7448SToby Isaac #endif
45*56a72328SZach Atkins #if PetscDefined(HAVE_ROCTX)
46*56a72328SZach Atkins PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERROCTX, PetscLogHandlerCreate_ROCTX));
47*56a72328SZach Atkins #endif
4819ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS);
4919ef957cSToby Isaac }
5019ef957cSToby Isaac
5119ef957cSToby Isaac /*@C
5219ef957cSToby Isaac PetscLogHandlerRegister - Register a new `PetscLogHandler`
5319ef957cSToby Isaac
54cc4c1da9SBarry Smith Not Collective, No Fortran Support
5519ef957cSToby Isaac
5619ef957cSToby Isaac Input Parameters:
5719ef957cSToby Isaac + sname - The name of a new user-defined creation routine
5819ef957cSToby Isaac - function - The creation routine
5919ef957cSToby Isaac
6019ef957cSToby Isaac Example Usage:
6119ef957cSToby Isaac .vb
6219ef957cSToby Isaac PetscLogHandlerRegister("my_profiler", MyPetscLogHandlerCreate);
6319ef957cSToby Isaac .ve
6419ef957cSToby Isaac
6519ef957cSToby Isaac Then, your `PetscLogHandler` type can be chosen with the procedural interface via
6619ef957cSToby Isaac .vb
6719ef957cSToby Isaac PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *);
6819ef957cSToby Isaac PetscLogHandlerSetType(PetscFE, "my_fe");
6919ef957cSToby Isaac .ve
7019ef957cSToby Isaac
7119ef957cSToby Isaac Level: developer
7219ef957cSToby Isaac
7319ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerSetType()`, `PetscLogHandlerGetType()`
7419ef957cSToby Isaac @*/
PetscLogHandlerRegister(const char sname[],PetscErrorCode (* function)(PetscLogHandler))7519ef957cSToby Isaac PetscErrorCode PetscLogHandlerRegister(const char sname[], PetscErrorCode (*function)(PetscLogHandler))
7619ef957cSToby Isaac {
7719ef957cSToby Isaac PetscFunctionBegin;
7819ef957cSToby Isaac PetscCall(PetscFunctionListAdd(&PetscLogHandlerList, sname, function));
7919ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS);
8019ef957cSToby Isaac }
8119ef957cSToby Isaac
8219ef957cSToby Isaac /*@C
8319ef957cSToby Isaac PetscLogHandlerSetType - Set the type of a `PetscLogHandler`
8419ef957cSToby Isaac
8519ef957cSToby Isaac Input Parameters:
8619ef957cSToby Isaac + handler - the `PetscLogHandler`
8719ef957cSToby Isaac - name - The kind of log handler
8819ef957cSToby Isaac
8919ef957cSToby Isaac Level: developer
9019ef957cSToby Isaac
9119ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerGetType()`
9219ef957cSToby Isaac @*/
PetscLogHandlerSetType(PetscLogHandler handler,PetscLogHandlerType name)9319ef957cSToby Isaac PetscErrorCode PetscLogHandlerSetType(PetscLogHandler handler, PetscLogHandlerType name)
9419ef957cSToby Isaac {
9519ef957cSToby Isaac PetscErrorCode (*r)(PetscLogHandler);
9619ef957cSToby Isaac PetscBool match;
9719ef957cSToby Isaac
9819ef957cSToby Isaac PetscFunctionBegin;
9919ef957cSToby Isaac PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1);
10019ef957cSToby Isaac PetscCall(PetscObjectTypeCompare((PetscObject)handler, name, &match));
10119ef957cSToby Isaac if (match) PetscFunctionReturn(PETSC_SUCCESS);
10219ef957cSToby Isaac
10319ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll());
10419ef957cSToby Isaac PetscCall(PetscFunctionListFind(PetscLogHandlerList, name, &r));
10519ef957cSToby Isaac PetscCheck(r, PetscObjectComm((PetscObject)handler), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscLogHandler type: %s", name);
10619ef957cSToby Isaac
10719ef957cSToby Isaac PetscTryTypeMethod(handler, destroy);
10819ef957cSToby Isaac handler->ops->destroy = NULL;
10919ef957cSToby Isaac
11019ef957cSToby Isaac PetscCall((*r)(handler));
11119ef957cSToby Isaac PetscCall(PetscObjectChangeTypeName((PetscObject)handler, name));
11219ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS);
11319ef957cSToby Isaac }
11419ef957cSToby Isaac
11519ef957cSToby Isaac /*@C
11619ef957cSToby Isaac PetscLogHandlerGetType - Gets the `PetscLoagHandlerType` (as a string) from the `PetscLogHandler` object.
11719ef957cSToby Isaac
11819ef957cSToby Isaac Not collective
11919ef957cSToby Isaac
12019ef957cSToby Isaac Input Parameter:
12119ef957cSToby Isaac . handler - the `PetscLogHandler`
12219ef957cSToby Isaac
12319ef957cSToby Isaac Output Parameter:
12419ef957cSToby Isaac . name - The `PetscLogHandlerType` name
12519ef957cSToby Isaac
12619ef957cSToby Isaac Level: developer
12719ef957cSToby Isaac
12819ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerSetType()`
12919ef957cSToby Isaac @*/
PetscLogHandlerGetType(PetscLogHandler handler,PetscLogHandlerType * name)13019ef957cSToby Isaac PetscErrorCode PetscLogHandlerGetType(PetscLogHandler handler, PetscLogHandlerType *name)
13119ef957cSToby Isaac {
13219ef957cSToby Isaac PetscFunctionBegin;
13319ef957cSToby Isaac PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1);
13419ef957cSToby Isaac PetscAssertPointer(name, 2);
13519ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll());
13619ef957cSToby Isaac PetscCall(PetscObjectGetType((PetscObject)handler, name));
13719ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS);
13819ef957cSToby Isaac }
13919ef957cSToby Isaac
PetscLogHandlerFinalizePackage(void)14019ef957cSToby Isaac static PetscErrorCode PetscLogHandlerFinalizePackage(void)
14119ef957cSToby Isaac {
14219ef957cSToby Isaac PetscFunctionBegin;
14319ef957cSToby Isaac PetscCall(PetscFunctionListDestroy(&PetscLogHandlerList));
14419ef957cSToby Isaac PetscLogHandlerRegisterAllCalled = PETSC_FALSE;
14519ef957cSToby Isaac PetscLogHandlerPackageInitialized = PETSC_FALSE;
14619ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS);
14719ef957cSToby Isaac }
14819ef957cSToby Isaac
PetscLogHandlerPackageInitialize(void)14919ef957cSToby Isaac PetscErrorCode PetscLogHandlerPackageInitialize(void)
15019ef957cSToby Isaac {
15119ef957cSToby Isaac PetscFunctionBegin;
15219ef957cSToby Isaac if (PetscLogHandlerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
15319ef957cSToby Isaac PetscLogHandlerPackageInitialized = PETSC_TRUE;
15419ef957cSToby Isaac
155f0b74427SPierre Jolivet PetscCall(PetscClassIdRegister("PETSc Log Handler", &PETSCLOGHANDLER_CLASSID));
15619ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll());
15719ef957cSToby Isaac PetscCall(PetscRegisterFinalize(PetscLogHandlerFinalizePackage));
15819ef957cSToby Isaac {
15919ef957cSToby Isaac const PetscClassId classids[] = {PETSCLOGHANDLER_CLASSID};
16019ef957cSToby Isaac
16119ef957cSToby Isaac PetscCall(PetscInfoProcessClass("loghandler", PETSC_STATIC_ARRAY_LENGTH(classids), classids));
16219ef957cSToby Isaac }
16319ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS);
16419ef957cSToby Isaac }
165