| /* Test program that triggers several happens-before usage errors. */ |
| |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <pthread.h> |
| #include "unified_annotations.h" |
| |
| |
| int main(int argc, char** argv) |
| { |
| pthread_mutex_t m; |
| pthread_cond_t cv; |
| int i[64]; |
| |
| pthread_mutex_init(&m, NULL); |
| pthread_cond_init(&cv, NULL); |
| |
| /* happens-after without preceding happens-before. */ |
| U_ANNOTATE_HAPPENS_AFTER(&i); |
| |
| /* happens-after on a mutex. */ |
| U_ANNOTATE_HAPPENS_BEFORE(&m); |
| |
| /* happens-after on a condition variable. */ |
| U_ANNOTATE_HAPPENS_BEFORE(&cv); |
| |
| /* condition variable operation on a h.b. annotated object. */ |
| U_ANNOTATE_HAPPENS_BEFORE(&i); |
| pthread_cond_init((pthread_cond_t*)&i, NULL); |
| |
| /* The sequence below is fine. */ |
| U_ANNOTATE_NEW_MEMORY(&i, sizeof(i)); |
| U_ANNOTATE_HAPPENS_BEFORE(&i); |
| U_ANNOTATE_HAPPENS_AFTER(&i); |
| U_ANNOTATE_NEW_MEMORY(&i, sizeof(i)); |
| U_ANNOTATE_HAPPENS_BEFORE(&i); |
| U_ANNOTATE_NEW_MEMORY(&i, sizeof(i)); |
| |
| /* happens-before after happens-after. */ |
| U_ANNOTATE_HAPPENS_BEFORE(&i); |
| U_ANNOTATE_HAPPENS_AFTER(&i); |
| U_ANNOTATE_HAPPENS_BEFORE(&i); |
| |
| fprintf(stderr, "Done.\n"); |
| return 0; |
| } |