xref: /petsc/src/sys/logging/handler/interface/lhreg.c (revision 61cc744836451fb4d1d6f02ab6992be430960ed1)
119ef957cSToby Isaac 
219ef957cSToby Isaac #include <petsc/private/petscimpl.h>
319ef957cSToby Isaac #include <petsc/private/loghandlerimpl.h>
419ef957cSToby Isaac 
519ef957cSToby Isaac PetscClassId PETSCLOGHANDLER_CLASSID = 0;
619ef957cSToby Isaac 
719ef957cSToby Isaac PetscFunctionList PetscLogHandlerList               = NULL;
819ef957cSToby Isaac PetscBool         PetscLogHandlerRegisterAllCalled  = PETSC_FALSE;
919ef957cSToby Isaac PetscBool         PetscLogHandlerPackageInitialized = PETSC_FALSE;
1019ef957cSToby Isaac 
1178f1b9b4SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Default(PetscLogHandler);
12b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(PetscLogHandler);
136467efc9SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Trace(PetscLogHandler);
14856bee69SToby Isaac #if PetscDefined(HAVE_MPE)
15856bee69SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_MPE(PetscLogHandler);
16856bee69SToby Isaac #endif
17ccf0b5c1SToby Isaac #if PetscDefined(HAVE_TAU_PERFSTUBS)
18ccf0b5c1SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Perfstubs(PetscLogHandler);
19ccf0b5c1SToby Isaac #endif
200970d93fSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Legacy(PetscLogHandler);
21*61cc7448SToby Isaac #if PetscDefined(HAVE_CUDA)
22*61cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler);
23*61cc7448SToby Isaac #endif
2478f1b9b4SToby Isaac 
2519ef957cSToby Isaac static PetscErrorCode PetscLogHandlerRegisterAll(void)
2619ef957cSToby Isaac {
2719ef957cSToby Isaac   PetscFunctionBegin;
2819ef957cSToby Isaac   if (PetscLogHandlerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
2919ef957cSToby Isaac   PetscLogHandlerRegisterAllCalled = PETSC_TRUE;
30294de794SToby Isaac   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERDEFAULT, PetscLogHandlerCreate_Default));
31294de794SToby Isaac   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNESTED, PetscLogHandlerCreate_Nested));
32294de794SToby Isaac   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERTRACE, PetscLogHandlerCreate_Trace));
33856bee69SToby Isaac #if PetscDefined(HAVE_MPE)
34294de794SToby Isaac   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERMPE, PetscLogHandlerCreate_MPE));
35856bee69SToby Isaac #endif
36ccf0b5c1SToby Isaac #if PetscDefined(HAVE_TAU_PERFSTUBS)
37294de794SToby Isaac   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERPERFSTUBS, PetscLogHandlerCreate_Perfstubs));
38ccf0b5c1SToby Isaac #endif
39294de794SToby Isaac   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERLEGACY, PetscLogHandlerCreate_Legacy));
40*61cc7448SToby Isaac #if PetscDefined(HAVE_CUDA)
41*61cc7448SToby Isaac   PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNVTX, PetscLogHandlerCreate_NVTX));
42*61cc7448SToby Isaac #endif
4319ef957cSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
4419ef957cSToby Isaac }
4519ef957cSToby Isaac 
4619ef957cSToby Isaac /*@C
4719ef957cSToby Isaac   PetscLogHandlerRegister - Register a new `PetscLogHandler`
4819ef957cSToby Isaac 
4919ef957cSToby Isaac   Not collective
5019ef957cSToby Isaac 
5119ef957cSToby Isaac   Input Parameters:
5219ef957cSToby Isaac + sname    - The name of a new user-defined creation routine
5319ef957cSToby Isaac - function - The creation routine
5419ef957cSToby Isaac 
5519ef957cSToby Isaac   Example Usage:
5619ef957cSToby Isaac .vb
5719ef957cSToby Isaac     PetscLogHandlerRegister("my_profiler", MyPetscLogHandlerCreate);
5819ef957cSToby Isaac .ve
5919ef957cSToby Isaac 
6019ef957cSToby Isaac   Then, your `PetscLogHandler` type can be chosen with the procedural interface via
6119ef957cSToby Isaac .vb
6219ef957cSToby Isaac     PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *);
6319ef957cSToby Isaac     PetscLogHandlerSetType(PetscFE, "my_fe");
6419ef957cSToby Isaac .ve
6519ef957cSToby Isaac 
6619ef957cSToby Isaac   Level: developer
6719ef957cSToby Isaac 
6819ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerSetType()`, `PetscLogHandlerGetType()`
6919ef957cSToby Isaac @*/
7019ef957cSToby Isaac PetscErrorCode PetscLogHandlerRegister(const char sname[], PetscErrorCode (*function)(PetscLogHandler))
7119ef957cSToby Isaac {
7219ef957cSToby Isaac   PetscFunctionBegin;
7319ef957cSToby Isaac   PetscCall(PetscFunctionListAdd(&PetscLogHandlerList, sname, function));
7419ef957cSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
7519ef957cSToby Isaac }
7619ef957cSToby Isaac 
7719ef957cSToby Isaac /*@C
7819ef957cSToby Isaac   PetscLogHandlerSetType - Set the type of a `PetscLogHandler`
7919ef957cSToby Isaac 
8019ef957cSToby Isaac   Input Parameters:
8119ef957cSToby Isaac + handler - the `PetscLogHandler`
8219ef957cSToby Isaac - name    - The kind of log handler
8319ef957cSToby Isaac 
8419ef957cSToby Isaac   Level: developer
8519ef957cSToby Isaac 
8619ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerGetType()`
8719ef957cSToby Isaac @*/
8819ef957cSToby Isaac PetscErrorCode PetscLogHandlerSetType(PetscLogHandler handler, PetscLogHandlerType name)
8919ef957cSToby Isaac {
9019ef957cSToby Isaac   PetscErrorCode (*r)(PetscLogHandler);
9119ef957cSToby Isaac   PetscBool match;
9219ef957cSToby Isaac 
9319ef957cSToby Isaac   PetscFunctionBegin;
9419ef957cSToby Isaac   PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1);
9519ef957cSToby Isaac   PetscCall(PetscObjectTypeCompare((PetscObject)handler, name, &match));
9619ef957cSToby Isaac   if (match) PetscFunctionReturn(PETSC_SUCCESS);
9719ef957cSToby Isaac 
9819ef957cSToby Isaac   PetscCall(PetscLogHandlerRegisterAll());
9919ef957cSToby Isaac   PetscCall(PetscFunctionListFind(PetscLogHandlerList, name, &r));
10019ef957cSToby Isaac   PetscCheck(r, PetscObjectComm((PetscObject)handler), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscLogHandler type: %s", name);
10119ef957cSToby Isaac 
10219ef957cSToby Isaac   PetscTryTypeMethod(handler, destroy);
10319ef957cSToby Isaac   handler->ops->destroy = NULL;
10419ef957cSToby Isaac 
10519ef957cSToby Isaac   PetscCall((*r)(handler));
10619ef957cSToby Isaac   PetscCall(PetscObjectChangeTypeName((PetscObject)handler, name));
10719ef957cSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
10819ef957cSToby Isaac }
10919ef957cSToby Isaac 
11019ef957cSToby Isaac /*@C
11119ef957cSToby Isaac   PetscLogHandlerGetType - Gets the `PetscLoagHandlerType` (as a string) from the `PetscLogHandler` object.
11219ef957cSToby Isaac 
11319ef957cSToby Isaac   Not collective
11419ef957cSToby Isaac 
11519ef957cSToby Isaac   Input Parameter:
11619ef957cSToby Isaac . handler - the `PetscLogHandler`
11719ef957cSToby Isaac 
11819ef957cSToby Isaac   Output Parameter:
11919ef957cSToby Isaac . name - The `PetscLogHandlerType` name
12019ef957cSToby Isaac 
12119ef957cSToby Isaac   Level: developer
12219ef957cSToby Isaac 
12319ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerSetType()`
12419ef957cSToby Isaac @*/
12519ef957cSToby Isaac PetscErrorCode PetscLogHandlerGetType(PetscLogHandler handler, PetscLogHandlerType *name)
12619ef957cSToby Isaac {
12719ef957cSToby Isaac   PetscFunctionBegin;
12819ef957cSToby Isaac   PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1);
12919ef957cSToby Isaac   PetscAssertPointer(name, 2);
13019ef957cSToby Isaac   PetscCall(PetscLogHandlerRegisterAll());
13119ef957cSToby Isaac   PetscCall(PetscObjectGetType((PetscObject)handler, name));
13219ef957cSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
13319ef957cSToby Isaac }
13419ef957cSToby Isaac 
13519ef957cSToby Isaac static PetscErrorCode PetscLogHandlerFinalizePackage(void)
13619ef957cSToby Isaac {
13719ef957cSToby Isaac   PetscFunctionBegin;
13819ef957cSToby Isaac   PetscCall(PetscFunctionListDestroy(&PetscLogHandlerList));
13919ef957cSToby Isaac   PetscLogHandlerRegisterAllCalled  = PETSC_FALSE;
14019ef957cSToby Isaac   PetscLogHandlerPackageInitialized = PETSC_FALSE;
14119ef957cSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
14219ef957cSToby Isaac }
14319ef957cSToby Isaac 
14419ef957cSToby Isaac PetscErrorCode PetscLogHandlerPackageInitialize(void)
14519ef957cSToby Isaac {
14619ef957cSToby Isaac   PetscFunctionBegin;
14719ef957cSToby Isaac   if (PetscLogHandlerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
14819ef957cSToby Isaac   PetscLogHandlerPackageInitialized = PETSC_TRUE;
14919ef957cSToby Isaac 
15019ef957cSToby Isaac   PetscCall(PetscClassIdRegister("Petsc Log Handler", &PETSCLOGHANDLER_CLASSID));
15119ef957cSToby Isaac   PetscCall(PetscLogHandlerRegisterAll());
15219ef957cSToby Isaac   PetscCall(PetscRegisterFinalize(PetscLogHandlerFinalizePackage));
15319ef957cSToby Isaac   {
15419ef957cSToby Isaac     const PetscClassId classids[] = {PETSCLOGHANDLER_CLASSID};
15519ef957cSToby Isaac 
15619ef957cSToby Isaac     PetscCall(PetscInfoProcessClass("loghandler", PETSC_STATIC_ARRAY_LENGTH(classids), classids));
15719ef957cSToby Isaac   }
15819ef957cSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
15919ef957cSToby Isaac }
160