1: #include <petsc-private/threadcommimpl.h> 3: static PetscBool PetscThreadCommPackageInitialized = PETSC_FALSE; 7: /*@C 8: PetscThreadCommFinalizePackage - Finalize PetscThreadComm package, called from PetscFinalize() 10: Logically collective 12: Level: developer 14: .seealso: PetscThreadCommInitializePackage() 15: @*/ 16: PetscErrorCode PetscThreadCommFinalizePackage(void) 17: { 19: MPI_Comm comm; 22: PetscThreadCommRegisterDestroy(); 24: comm = PETSC_COMM_WORLD; /* Release double-reference from PetscThreadCommInitialize */ 25: PetscCommDestroy(&comm); 27: comm = PETSC_COMM_SELF; /* Release double-reference from PetscThreadCommInitialize */ 28: PetscCommDestroy(&comm); 30: MPI_Keyval_free(&Petsc_ThreadComm_keyval); 31: PetscThreadCommPackageInitialized = PETSC_FALSE; 32: return(0); 33: } 37: /*@C 38: PetscThreadCommInitializePackage - Initializes ThreadComm package 40: Logically collective 42: Input Parameter: 43: . path - The dynamic library path, or PETSC_NULL 45: Level: developer 47: .seealso: PetscThreadCommFinalizePackage() 48: @*/ 49: PetscErrorCode PetscThreadCommInitializePackage(const char *path) 50: { 54: if(PetscThreadCommPackageInitialized) return(0); 55: PetscThreadCommInitialize(); 56: PetscThreadCommPackageInitialized = PETSC_TRUE; 57: PetscRegisterFinalize(PetscThreadCommFinalizePackage); 58: return(0); 59: }