| #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); | |
| } |