Skip to content
Permalink
3eb0e1c6d6
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
74 lines (61 sloc) 1.33 KB
#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"