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