Multi-core Hash Joins
Main-memory hash join implementations for multi-core CPUs
barrier.h
Go to the documentation of this file.
1
13#ifndef BARRIER_H
14#define BARRIER_H
15
16#include <pthread.h> /* pthread_* */
17#include "../config.h" /* HAVE_PTHREAD_BARRIER_WAIT */
18
19#ifndef HAVE_PTHREAD_BARRIER_WAIT /* If POSIX BARRIERS are not supported */
20
21#define pthread_barrier_t barrier_t
22#define pthread_barrier_attr_t barrier_attr_t
23#define pthread_barrier_init(b,a,n) barrier_init(b,n)
24#define pthread_barrier_destroy(b) barrier_destroy(b)
25#define pthread_barrier_wait(b) barrier_wait(b)
26
27#define PTHREAD_BARRIER_SERIAL_THREAD 1
29#define BARRIER_ARRIVE(B,RV) \
30 RV = pthread_barrier_wait(B); \
31 if(RV !=0 && RV != PTHREAD_BARRIER_SERIAL_THREAD){ \
32 printf("Couldn't wait on barrier\n"); \
33 exit(EXIT_FAILURE); \
34 }
35
36typedef struct {
37 int needed;
38 int called;
39 pthread_mutex_t mutex;
40 pthread_cond_t cond;
41} barrier_t;
42
43static int barrier_init(barrier_t *barrier,int needed);
44static int barrier_destroy(barrier_t *barrier);
45static int barrier_wait(barrier_t *barrier);
46
47int
48barrier_init(barrier_t *barrier,int needed)
49{
50 barrier->needed = needed;
51 barrier->called = 0;
52 pthread_mutex_init(&barrier->mutex,NULL);
53 pthread_cond_init(&barrier->cond,NULL);
54
55 return 0;
56}
57
58int
59barrier_destroy(barrier_t *barrier)
60{
61 pthread_mutex_destroy(&barrier->mutex);
62 pthread_cond_destroy(&barrier->cond);
63
64 return 0;
65}
66
67int
68barrier_wait(barrier_t *barrier)
69{
70 pthread_mutex_lock(&barrier->mutex);
71 barrier->called++;
72
73 if (barrier->called == barrier->needed) {
74 barrier->called = 0;
75 pthread_cond_broadcast(&barrier->cond);
76 } else {
77 pthread_cond_wait(&barrier->cond,&barrier->mutex);
78 }
79
80 pthread_mutex_unlock(&barrier->mutex);
81
82 return 0;
83}
84
85#endif
86
87#endif /* BARRIER_H */