Actual source code: dlregisthreadcomm.c
petsc-3.4.5 2014-06-29
1: #include <petsc-private/threadcommimpl.h>
3: static PetscBool PetscThreadCommPackageInitialized = PETSC_FALSE;
5: extern PetscErrorCode PetscThreadCommDetach(MPI_Comm);
6: extern PetscBool PetscThreadCommRegisterAllCalled;
10: /*@C
11: PetscThreadCommFinalizePackage - Finalize PetscThreadComm package, called from PetscFinalize()
13: Logically collective
15: Level: developer
17: .seealso: PetscThreadCommInitializePackage()
18: @*/
19: PetscErrorCode PetscThreadCommFinalizePackage(void)
20: {
24: PetscFunctionListDestroy(&PetscThreadCommList);
25: MPI_Keyval_free(&Petsc_ThreadComm_keyval);
26: PetscThreadCommPackageInitialized = PETSC_FALSE;
27: PetscThreadCommRegisterAllCalled = PETSC_FALSE;
28: return(0);
29: }
33: /*
34: This frees the thread communicator attached to MPI_Comm
36: This is called by MPI, not by users. This is called when MPI_Comm_free() is called on the communicator.
38: Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
39: */
40: PETSC_EXTERN PetscMPIInt MPIAPI Petsc_CopyThreadComm(MPI_Comm comm,PetscMPIInt keyval,void *extra_state,void *attr_in,void *attr_out,int *flag)
41: {
42: PetscErrorCode ierr;
43: PetscThreadComm tcomm = (PetscThreadComm)attr_in;
46: tcomm->refct++;
47: *(void**)attr_out = tcomm;
49: *flag = 1;
50: PetscInfo1(0,"Copying thread communicator data in an MPI_Comm %ld\n",(long)comm);
51: if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
52: return(0);
53: }
57: /*
58: This frees the thread communicator attached to MPI_Comm
60: This is called by MPI, not by users. This is called when MPI_Comm_free() is called on the communicator.
62: Note: this is declared extern "C" because it is passed to MPI_Keyval_create()
63: */
64: PETSC_EXTERN PetscMPIInt MPIAPI Petsc_DelThreadComm(MPI_Comm comm,PetscMPIInt keyval,void *attr,void *extra_state)
65: {
69: PetscThreadCommDestroy((PetscThreadComm*)&attr);
70: PetscInfo1(0,"Deleting thread communicator data in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
71: return(0);
72: }
76: /*@C
77: PetscThreadCommInitializePackage - Initializes ThreadComm package
79: Logically collective
81: Level: developer
83: .seealso: PetscThreadCommFinalizePackage()
84: @*/
85: PetscErrorCode PetscThreadCommInitializePackage(void)
86: {
90: if (PetscThreadCommPackageInitialized) return(0);
92: if (Petsc_ThreadComm_keyval == MPI_KEYVAL_INVALID) {
93: MPI_Keyval_create(Petsc_CopyThreadComm,Petsc_DelThreadComm,&Petsc_ThreadComm_keyval,(void*)0);
94: }
96: PetscGetNCores(NULL);
98: PetscLogEventRegister("ThreadCommRunKer", 0, &ThreadComm_RunKernel);
99: PetscLogEventRegister("ThreadCommBarrie", 0, &ThreadComm_Barrier);
101: PetscThreadCommPackageInitialized = PETSC_TRUE;
103: PetscRegisterFinalize(PetscThreadCommFinalizePackage);
104: return(0);
105: }