#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/resource.h>

static void use_stack (size_t needed);

void (*use_stack_ptr) (size_t) = use_stack;

static void
use_stack (size_t needed)
{
  size_t sz = sysconf (_SC_PAGESIZE);
  char *buf = alloca (sz);
  memset (buf, '\0', sz);

  if (needed > sz)
    use_stack_ptr (needed  - sz);
}

static void
use_up_memory (void)
{
  struct rlimit rl;
  getrlimit (RLIMIT_AS, &rl);
  rl.rlim_cur = 10 * 1024 * 1024;
  setrlimit (RLIMIT_AS, &rl);

  char *c;
  int PAGESIZE = getpagesize ();
  while (1)
    {
      c = mmap (NULL, PAGESIZE, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0);
      if (c == MAP_FAILED)
	break;
    }
}

static void *
child (void *arg)
{
  sleep (1);
  return arg;
}

static int
do_test (void)
{
  int err;
  pthread_t tid;

  /* Allocate the memory needed for the stack.  */
  use_stack_ptr (PTHREAD_STACK_MIN);

  use_up_memory ();

  err = pthread_create (&tid, NULL, child, NULL);
  if (err != 0)
    {
      printf ("pthread_create returns %d: %s\n", err,
	      err == EAGAIN ? "OK" : "FAIL");
      return err != EAGAIN;
    }

  /* We did not fail to allocate memory despite the preparation.  Oh well.  */
  return 0;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
