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); 12*b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(PetscLogHandler); 1378f1b9b4SToby Isaac 1419ef957cSToby Isaac static PetscErrorCode PetscLogHandlerRegisterAll(void) 1519ef957cSToby Isaac { 1619ef957cSToby Isaac PetscFunctionBegin; 1719ef957cSToby Isaac if (PetscLogHandlerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 1819ef957cSToby Isaac PetscLogHandlerRegisterAllCalled = PETSC_TRUE; 1978f1b9b4SToby Isaac PetscCall(PetscLogHandlerRegister(PETSC_LOG_HANDLER_DEFAULT, PetscLogHandlerCreate_Default)); 20*b9321188SToby Isaac PetscCall(PetscLogHandlerRegister(PETSC_LOG_HANDLER_NESTED, PetscLogHandlerCreate_Nested)); 2119ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 2219ef957cSToby Isaac } 2319ef957cSToby Isaac 2419ef957cSToby Isaac /*@C 2519ef957cSToby Isaac PetscLogHandlerRegister - Register a new `PetscLogHandler` 2619ef957cSToby Isaac 2719ef957cSToby Isaac Not collective 2819ef957cSToby Isaac 2919ef957cSToby Isaac Input Parameters: 3019ef957cSToby Isaac + sname - The name of a new user-defined creation routine 3119ef957cSToby Isaac - function - The creation routine 3219ef957cSToby Isaac 3319ef957cSToby Isaac Example Usage: 3419ef957cSToby Isaac .vb 3519ef957cSToby Isaac PetscLogHandlerRegister("my_profiler", MyPetscLogHandlerCreate); 3619ef957cSToby Isaac .ve 3719ef957cSToby Isaac 3819ef957cSToby Isaac Then, your `PetscLogHandler` type can be chosen with the procedural interface via 3919ef957cSToby Isaac .vb 4019ef957cSToby Isaac PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *); 4119ef957cSToby Isaac PetscLogHandlerSetType(PetscFE, "my_fe"); 4219ef957cSToby Isaac .ve 4319ef957cSToby Isaac 4419ef957cSToby Isaac Level: developer 4519ef957cSToby Isaac 4619ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerSetType()`, `PetscLogHandlerGetType()` 4719ef957cSToby Isaac @*/ 4819ef957cSToby Isaac PetscErrorCode PetscLogHandlerRegister(const char sname[], PetscErrorCode (*function)(PetscLogHandler)) 4919ef957cSToby Isaac { 5019ef957cSToby Isaac PetscFunctionBegin; 5119ef957cSToby Isaac PetscCall(PetscFunctionListAdd(&PetscLogHandlerList, sname, function)); 5219ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 5319ef957cSToby Isaac } 5419ef957cSToby Isaac 5519ef957cSToby Isaac /*@C 5619ef957cSToby Isaac PetscLogHandlerSetType - Set the type of a `PetscLogHandler` 5719ef957cSToby Isaac 5819ef957cSToby Isaac Input Parameters: 5919ef957cSToby Isaac + handler - the `PetscLogHandler` 6019ef957cSToby Isaac - name - The kind of log handler 6119ef957cSToby Isaac 6219ef957cSToby Isaac Level: developer 6319ef957cSToby Isaac 6419ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerGetType()` 6519ef957cSToby Isaac @*/ 6619ef957cSToby Isaac PetscErrorCode PetscLogHandlerSetType(PetscLogHandler handler, PetscLogHandlerType name) 6719ef957cSToby Isaac { 6819ef957cSToby Isaac PetscErrorCode (*r)(PetscLogHandler); 6919ef957cSToby Isaac PetscBool match; 7019ef957cSToby Isaac 7119ef957cSToby Isaac PetscFunctionBegin; 7219ef957cSToby Isaac PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1); 7319ef957cSToby Isaac PetscCall(PetscObjectTypeCompare((PetscObject)handler, name, &match)); 7419ef957cSToby Isaac if (match) PetscFunctionReturn(PETSC_SUCCESS); 7519ef957cSToby Isaac 7619ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll()); 7719ef957cSToby Isaac PetscCall(PetscFunctionListFind(PetscLogHandlerList, name, &r)); 7819ef957cSToby Isaac PetscCheck(r, PetscObjectComm((PetscObject)handler), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscLogHandler type: %s", name); 7919ef957cSToby Isaac 8019ef957cSToby Isaac PetscTryTypeMethod(handler, destroy); 8119ef957cSToby Isaac handler->ops->destroy = NULL; 8219ef957cSToby Isaac 8319ef957cSToby Isaac PetscCall((*r)(handler)); 8419ef957cSToby Isaac PetscCall(PetscObjectChangeTypeName((PetscObject)handler, name)); 8519ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 8619ef957cSToby Isaac } 8719ef957cSToby Isaac 8819ef957cSToby Isaac /*@C 8919ef957cSToby Isaac PetscLogHandlerGetType - Gets the `PetscLoagHandlerType` (as a string) from the `PetscLogHandler` object. 9019ef957cSToby Isaac 9119ef957cSToby Isaac Not collective 9219ef957cSToby Isaac 9319ef957cSToby Isaac Input Parameter: 9419ef957cSToby Isaac . handler - the `PetscLogHandler` 9519ef957cSToby Isaac 9619ef957cSToby Isaac Output Parameter: 9719ef957cSToby Isaac . name - The `PetscLogHandlerType` name 9819ef957cSToby Isaac 9919ef957cSToby Isaac Level: developer 10019ef957cSToby Isaac 10119ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerSetType()` 10219ef957cSToby Isaac @*/ 10319ef957cSToby Isaac PetscErrorCode PetscLogHandlerGetType(PetscLogHandler handler, PetscLogHandlerType *name) 10419ef957cSToby Isaac { 10519ef957cSToby Isaac PetscFunctionBegin; 10619ef957cSToby Isaac PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1); 10719ef957cSToby Isaac PetscAssertPointer(name, 2); 10819ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll()); 10919ef957cSToby Isaac PetscCall(PetscObjectGetType((PetscObject)handler, name)); 11019ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 11119ef957cSToby Isaac } 11219ef957cSToby Isaac 11319ef957cSToby Isaac static PetscErrorCode PetscLogHandlerFinalizePackage(void) 11419ef957cSToby Isaac { 11519ef957cSToby Isaac PetscFunctionBegin; 11619ef957cSToby Isaac PetscCall(PetscFunctionListDestroy(&PetscLogHandlerList)); 11719ef957cSToby Isaac PetscLogHandlerRegisterAllCalled = PETSC_FALSE; 11819ef957cSToby Isaac PetscLogHandlerPackageInitialized = PETSC_FALSE; 11919ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 12019ef957cSToby Isaac } 12119ef957cSToby Isaac 12219ef957cSToby Isaac PetscErrorCode PetscLogHandlerPackageInitialize(void) 12319ef957cSToby Isaac { 12419ef957cSToby Isaac PetscFunctionBegin; 12519ef957cSToby Isaac if (PetscLogHandlerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 12619ef957cSToby Isaac PetscLogHandlerPackageInitialized = PETSC_TRUE; 12719ef957cSToby Isaac 12819ef957cSToby Isaac PetscCall(PetscClassIdRegister("Petsc Log Handler", &PETSCLOGHANDLER_CLASSID)); 12919ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll()); 13019ef957cSToby Isaac PetscCall(PetscRegisterFinalize(PetscLogHandlerFinalizePackage)); 13119ef957cSToby Isaac { 13219ef957cSToby Isaac const PetscClassId classids[] = {PETSCLOGHANDLER_CLASSID}; 13319ef957cSToby Isaac 13419ef957cSToby Isaac PetscCall(PetscInfoProcessClass("loghandler", PETSC_STATIC_ARRAY_LENGTH(classids), classids)); 13519ef957cSToby Isaac } 13619ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 13719ef957cSToby Isaac } 138