1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Test program that triggers several happens-before usage errors. */ 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <pthread.h> 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "unified_annotations.h" 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char** argv) 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_t m; 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_cond_t cv; 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i[64]; 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_mutex_init(&m, NULL); 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_cond_init(&cv, NULL); 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* happens-after without preceding happens-before. */ 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_AFTER(&i); 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* happens-after on a mutex. */ 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&m); 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* happens-after on a condition variable. */ 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&cv); 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* condition variable operation on a h.b. annotated object. */ 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&i); 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pthread_cond_init((pthread_cond_t*)&i, NULL); 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The sequence below is fine. */ 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_NEW_MEMORY(&i, sizeof(i)); 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&i); 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_AFTER(&i); 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_NEW_MEMORY(&i, sizeof(i)); 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&i); 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_NEW_MEMORY(&i, sizeof(i)); 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* happens-before after happens-after. */ 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&i); 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_AFTER(&i); 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown U_ANNOTATE_HAPPENS_BEFORE(&i); 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Done.\n"); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Local variables: 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * c-basic-offset: 2 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * End: 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 54