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