int tMPI_Thread_barrier_wait(tMPI_Thread_barrier_t * barrier) { int cycle; int rc; /* check whether the barrier is initialized */ if (tMPI_Atomic_get( &(barrier->initialized) ) == 0) { tMPI_Thread_barrier_init_once(barrier); } rc = pthread_mutex_lock(&barrier->barrierp->mutex); if(rc != 0) return EBUSY; cycle = barrier->cycle; /* Decrement the count atomically and check if it is zero. * This will only be true for the last thread calling us. */ if( --barrier->count <= 0 ) { barrier->cycle = !barrier->cycle; barrier->count = barrier->threshold; rc = pthread_cond_broadcast(&barrier->barrierp->cv); if(rc == 0) rc = -1; } else { while(cycle == barrier->cycle) { rc = pthread_cond_wait(&barrier->barrierp->cv, &barrier->barrierp->mutex); if(rc != 0) break; } } pthread_mutex_unlock(&barrier->barrierp->mutex); return rc; }
int tMPI_Thread_barrier_wait(tMPI_Thread_barrier_t *barrier) { int cycle; BOOL rc=FALSE; int ret=0; /*tMPI_Thread_pthread_barrier_t *p;*/ /* check whether the barrier is initialized */ if (tMPI_Atomic_get( &(barrier->initialized) ) == 0) { tMPI_Thread_barrier_init_once(barrier,barrier->threshold); } #if 0 EnterCriticalSection( &(barrier->barrierp->cs) ); #else tMPI_Thread_mutex_lock( &(barrier->barrierp->cs) ); #endif cycle = barrier->cycle; /* Decrement the count atomically and check if it is zero. * This will only be true for the last thread calling us. */ if( --(barrier->count) <= 0 ) { barrier->cycle = !barrier->cycle; barrier->count = barrier->threshold; #if 0 WakeAllConditionVariable( &(barrier->barrierp->cv) ); #else tMPI_Thread_cond_broadcast( &(barrier->barrierp->cv) ); #endif } else { while(cycle == barrier->cycle) { #if 0 rc=SleepConditionVariableCS (&(barrier->barrierp->cv), &(barrier->barrierp->cs), INFINITE); if(!rc) { ret=-1; break; } #else rc = tMPI_Thread_cond_wait(&barrier->barrierp->cv, &barrier->barrierp->cs); if(rc != 0) break; #endif } } #if 0 LeaveCriticalSection( &(barrier->barrierp->cs) ); #else tMPI_Thread_mutex_unlock( &(barrier->barrierp->cs) ); #endif return ret; }