#include #include #include #include #include #include #include #include #include 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"