File: pthread_barrier.cpp

package info (click to toggle)
magma-rocm 2.9.0%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 83,540 kB
  • sloc: cpp: 709,115; fortran: 121,916; ansic: 32,343; python: 25,603; f90: 15,208; makefile: 945; xml: 253; csh: 232; sh: 203; perl: 104
file content (56 lines) | stat: -rw-r--r-- 1,645 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// MacOS doesn't provide pthread_barrier
// magma_winthread.c doesn't provide pthread_barrier
#if (defined( _WIN32 ) || defined( _WIN64 ) || defined( __APPLE__ )) && ! defined( __MINGW32__ )

#include <errno.h>

#include "pthread_barrier.h"

// from http://stackoverflow.com/questions/3640853/performance-test-sem-t-v-s-dispatch-semaphore-t-and-pthread-once-t-v-s-dispat

// *sigh* OSX does not have pthread_barrier
int pthread_barrier_init( pthread_barrier_t *barrier,
                          const pthread_barrierattr_t *attr, unsigned int count )
{
    if ( count == 0 ) {
        errno = EINVAL;
        return -1;
    }
    if ( pthread_mutex_init( &barrier->mutex, 0 ) < 0 ) {
        return -1;
    }
    if ( pthread_cond_init( &barrier->cond, 0 ) < 0 ) {
        pthread_mutex_destroy( &barrier->mutex );
        return -1;
    }
    barrier->tripCount = count;
    barrier->count = 0;

    return 0;
}

int pthread_barrier_destroy( pthread_barrier_t *barrier )
{
    pthread_cond_destroy( &barrier->cond );
    pthread_mutex_destroy( &barrier->mutex );
    return 0;
}

int pthread_barrier_wait( pthread_barrier_t *barrier )
{
    pthread_mutex_lock( &barrier->mutex );
    ++(barrier->count);
    if ( barrier->count >= barrier->tripCount ) {
        barrier->count = 0;
        pthread_cond_broadcast( &barrier->cond );
        pthread_mutex_unlock( &barrier->mutex );
        return PTHREAD_BARRIER_SERIAL_THREAD;
    }
    else {
        pthread_cond_wait( &barrier->cond, &(barrier->mutex) );
        pthread_mutex_unlock( &barrier->mutex );
        return 0;
    }
}

#endif // (_WIN32 || _WIN64 || __APPLE__) && ! __MINGW32__