diff options
Diffstat (limited to 'libmudflap/testsuite/libmudflap.cth/pass37-frag.c')
-rw-r--r-- | libmudflap/testsuite/libmudflap.cth/pass37-frag.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/libmudflap/testsuite/libmudflap.cth/pass37-frag.c b/libmudflap/testsuite/libmudflap.cth/pass37-frag.c new file mode 100644 index 00000000000..bfa2c7c02ab --- /dev/null +++ b/libmudflap/testsuite/libmudflap.cth/pass37-frag.c @@ -0,0 +1,58 @@ +#include <stdlib.h> +#include <stdio.h> +#include <pthread.h> +#include <sched.h> + +static void * +func (void *p) +{ + int *counter = (int *) p; + unsigned i; + + for (i=0; i<100; i++) + { + (*counter) ++; + { + int array[17]; + unsigned x = i % (sizeof(array)/sizeof(array[0])); + /* VRP could prove that x is within [0,16], but until then, the + following access will ensure that array[] is registered to + libmudflap. */ + array[x] = i; + } + sched_yield (); /* sleep (1); */ + } + + return (NULL); +} + + +int main () +{ + int rc; + unsigned i; + enum foo { NT=10 }; + pthread_t threads[NT]; + int counts[NT]; + + + for (i=0; i<NT; i++) + { + counts[i] = 0; + rc = pthread_create (& threads[i], NULL, func, (void *) & counts[i]); + if (rc) abort(); + } + + for (i=0; i<NT; i++) + { + rc = pthread_join (threads[i], NULL); + if (rc) abort(); + printf ("%d%s", counts[i], (i==NT-1) ? "\n" : " "); + } + + return 0; +} + +/* { dg-output "100 100 100 100 100 100 100 100 100 100" } */ +/* { dg-repetitions 20 } */ +/* { dg-timeout 3 } */ |