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