| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | #include <errno.h>#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <limits.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 voiduse_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 voiduse_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 intdo_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"
 |