1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Test program that triggers pthread_barrier_wait() where each 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * pthread_barrier_wait() call is invoked by another thread. This is the only 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * test program that triggers the code guarded by if (q->thread_finished) in 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DRD_(barrier_pre_wait)(). 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define _GNU_SOURCE 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <assert.h> 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <pthread.h> 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <stdio.h> 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <stdlib.h> 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <unistd.h> 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pthread_barrier_t* s_barrier; 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void* thread(void* arg) 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver write(STDOUT_FILENO, ".", 1); 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pthread_barrier_wait(s_barrier); 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverint main(int argc, char** argv) 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pthread_t *tid; 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int barriers = argc > 1 ? atoi(argv[1]) : 20; 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int barrier_participants = 2; 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int thread_count = barriers * barrier_participants; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int res, i; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s_barrier = malloc(sizeof(*s_barrier)); 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver res = pthread_barrier_init(s_barrier, NULL, barrier_participants); 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assert(res == 0); 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tid = malloc(thread_count * sizeof(*tid)); 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assert(tid); 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < thread_count; i++) { 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver res = pthread_create(&tid[i], NULL, thread, NULL); 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assert(res == 0); 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < thread_count; i++) { 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver res = pthread_join(tid[i], NULL); 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assert(res == 0); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver free(tid); 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver res = pthread_barrier_destroy(s_barrier); 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assert(res == 0); 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver free(s_barrier); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s_barrier = NULL; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver write(STDOUT_FILENO, "\n", 1); 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fprintf(stderr, "Done.\n"); 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver