/*! \brief Static init routine for pthread barrier * * \internal * * This is only used as a wrapper to enable static initialization * of posix thread types together with out abstraction layer for tMPI_Thread.h * * \param barrier Statically initialized barrier type * \param n Number of members in barrier * * \return status - 0 on success, or a standard error code. */ static int tMPI_Thread_barrier_init_once(tMPI_Thread_barrier_t *barrier, int n) { int ret; /* This is essentially a copy of the code from the one-time * initialization, but with a call to the cond init routine instead. * It might seem like overkill, but it will only be executed the first * time you call a static condition variable, and it is important to get * the memory barriers right. Trust me, you don't want a deadlock here... */ /* initialize the initializers */ tMPI_Init_initers(); /* Lock the common one-time init mutex so we can check carefully */ EnterCriticalSection( &barrier_init ); /* Do the actual (locked) check - system mutex is locked if we get here */ if (barrier->barrierp == NULL) { /* No need to keep the lock during execution - * Only one thread can do it anyway. */ ret=tMPI_Thread_barrier_init(barrier, n); } LeaveCriticalSection( &barrier_init ); return ret; }
static void tMPI_Global_init(struct tmpi_global *g, int Nthreads) { g->usertypes=NULL; g->N_usertypes=0; g->Nalloc_usertypes=0; tMPI_Thread_mutex_init(&(g->timer_mutex)); tMPI_Spinlock_init(&(g->datatype_lock)); tMPI_Thread_barrier_init( &(g->barrier), Nthreads); #if ! (defined( _WIN32 ) || defined( _WIN64 ) ) /* the time at initialization. */ gettimeofday( &(g->timer_init), NULL); #else /* the time at initialization. */ g->timer_init=GetTickCount(); #endif }