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: }