| #include <stdio.h> |
| #include <stdlib.h> |
| #include <stdint.h> |
| #include <string.h> |
| #include <pthread.h> |
| |
| #define CHUNK_SIZE 16000 /* same as findcmd.c's */ |
| #define BUF_SIZE (2 * CHUNK_SIZE) /* at least two chunks */ |
| #define NUMTH 8 |
| |
| int8_t int8_search_buf[100]; |
| int16_t int16_search_buf[100]; |
| int32_t int32_search_buf[100]; |
| int64_t int64_search_buf[100]; |
| |
| static char *search_buf; |
| static int search_buf_size; |
| |
| |
| int f2 (int a) |
| { |
| /* We use a `char[]' type below rather than the typical `char *' |
| to make sure that `str' gets allocated on the stack. Otherwise, |
| the compiler may place the "hello, testsuite" string inside |
| a read-only section, preventing us from over-writing it from GDB. */ |
| char str[] = "hello, testsuite"; |
| |
| puts (str); /* Break here. */ |
| |
| return ++a; |
| } |
| |
| int f1 (int a, int b) |
| { |
| return f2(a) + b; |
| } |
| |
| static void |
| init_bufs () |
| { |
| search_buf_size = BUF_SIZE; |
| search_buf = malloc (search_buf_size); |
| if (search_buf == NULL) |
| exit (1); |
| memset (search_buf, 'x', search_buf_size); |
| } |
| |
| static void * |
| thread (void *param) |
| { |
| pthread_barrier_t *barrier = (pthread_barrier_t *) param; |
| |
| pthread_barrier_wait (barrier); |
| |
| return param; |
| } |
| |
| static void |
| check_threads (pthread_barrier_t *barrier) |
| { |
| pthread_barrier_wait (barrier); |
| } |
| |
| extern int |
| test_threads (void) |
| { |
| pthread_t threads[NUMTH]; |
| pthread_barrier_t barrier; |
| int i; |
| |
| pthread_barrier_init (&barrier, NULL, NUMTH + 1); |
| |
| for (i = 0; i < NUMTH; ++i) |
| pthread_create (&threads[i], NULL, thread, &barrier); |
| |
| check_threads (&barrier); |
| |
| for (i = 0; i < NUMTH; ++i) |
| pthread_join (threads[i], NULL); |
| |
| pthread_barrier_destroy (&barrier); |
| |
| return 0; |
| } |
| |
| int main (int argc, char *argv[]) |
| { |
| test_threads (); |
| init_bufs (); |
| |
| return f1 (1, 2); |
| } |