double MPID_Wtick( void ) { MPIU_THREADSAFE_INIT_DECL(initTick); static double tickval = -1.0; double timediff; /* Keep compiler happy about timediff set before use*/ MPID_Time_t t1, t2; int cnt; int icnt; if (initTick) { MPIU_THREADSAFE_INIT_BLOCK_BEGIN(initTick); tickval = 1.0e6; for (icnt=0; icnt<10; icnt++) { cnt = 1000; MPID_Wtime( &t1 ); /* Make it abundently clear to the compiler that this block is executed at least once. */ do { MPID_Wtime( &t2 ); MPID_Wtime_diff( &t1, &t2, &timediff ); if (timediff > 0) break; } while (cnt--); if (cnt && timediff > 0.0 && timediff < tickval) { MPID_Wtime_diff( &t1, &t2, &tickval ); } } MPIU_THREADSAFE_INIT_CLEAR(initTick); MPIU_THREADSAFE_INIT_BLOCK_END(initTick); } return tickval; }
int MPIR_Datatype_init_names(void) { #ifdef HAVE_ERROR_CHECKING static const char FCNAME[] = "MPIR_Datatype_init_names"; #endif int mpi_errno = MPI_SUCCESS; int i; MPID_Datatype *datatype_ptr = NULL; MPIU_THREADSAFE_INIT_DECL(needsInit); if (needsInit) { MPIU_THREADSAFE_INIT_BLOCK_BEGIN(needsInit); /* Make sure that the basics have datatype structures allocated * and filled in for them. They are just integers prior to this * call. */ mpi_errno = MPIR_Datatype_builtin_fillin(); if (mpi_errno != MPI_SUCCESS) { MPIU_ERR_POPFATAL(mpi_errno); } /* For each predefined type, ensure that there is a corresponding object and that the object's name is set */ for (i=0; mpi_names[i].name != 0; i++) { /* The size-specific types may be DATATYPE_NULL, as might be those based on 'long long' and 'long double' if those types were disabled at configure time. */ if (mpi_names[i].dtype == MPI_DATATYPE_NULL) continue; MPID_Datatype_get_ptr(mpi_names[i].dtype, datatype_ptr); if (datatype_ptr < MPID_Datatype_builtin || datatype_ptr > MPID_Datatype_builtin + MPID_DATATYPE_N_BUILTIN) { MPIU_ERR_SETFATALANDJUMP1(mpi_errno,MPI_ERR_INTERN, "**typeinitbadmem","**typeinitbadmem %d", i); } if (!datatype_ptr) { MPIU_ERR_SETFATALANDJUMP1(mpi_errno,MPI_ERR_INTERN, "**typeinitfail", "**typeinitfail %d", i - 1); } MPIU_DBG_MSG_FMT(DATATYPE,VERBOSE,(MPIU_DBG_FDEST, "mpi_names[%d].name = %p", i, mpi_names[i].name)); MPIU_Strncpy(datatype_ptr->name, mpi_names[i].name, MPI_MAX_OBJECT_NAME); } /* Handle the minloc/maxloc types */ for (i=0; mpi_maxloc_names[i].name != 0; i++) { /* types based on 'long long' and 'long double' may be disabled at configure time, and their values set to MPI_DATATYPE_NULL. skip those types. */ if (mpi_maxloc_names[i].dtype == MPI_DATATYPE_NULL) continue; MPID_Datatype_get_ptr(mpi_maxloc_names[i].dtype, datatype_ptr); if (!datatype_ptr) { MPIU_ERR_SETFATALANDJUMP(mpi_errno,MPI_ERR_INTERN, "**typeinitminmaxloc"); } MPIU_Strncpy(datatype_ptr->name, mpi_maxloc_names[i].name, MPI_MAX_OBJECT_NAME); } MPIU_THREADSAFE_INIT_CLEAR(needsInit); fn_fail:; MPIU_THREADSAFE_INIT_BLOCK_END(needsInit); } return mpi_errno; }