#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h> // APPLE LOCAL: must incl sys/time.h before resource.h
#include <sys/resource.h>
#include <stdio.h> // APPLE LOCAL: to output the pid
#define printf do not use
const char digit[] = "0123456789abcdefghijklmnopqrstuvwxyz";
static void
print_char (char c)
{
write (1, &c, sizeof (c));
}
static void
print_unsigned (unsigned long u)
{
if (u >= 10)
print_unsigned (u / 10);
print_char (digit[u % 10]);
}
static void
print_hex (unsigned long u)
{
if (u >= 16)
print_hex (u / 16);
print_char (digit[u % 16]);
}
static void
print_string (const char *s)
{
for (; (*s) != '\0'; s++)
print_char ((*s));
}
static void
print_address (const void *a)
{
print_string ("0x");
print_hex ((unsigned long) a);
}
static void
print_rlimit (int resource)
{
struct rlimit rl;
getrlimit (resource, &rl);
print_string ("cur=0x");
print_hex (rl.rlim_cur);
print_string (" max=0x");
print_hex (rl.rlim_max);
}
static void
maximize_rlimit (int resource, const char *prefix)
{
struct rlimit rl;
print_string (" ");
print_string (prefix);
print_string (": ");
print_rlimit (resource);
getrlimit (resource, &rl);
rl.rlim_cur = rl.rlim_max;
setrlimit (resource, &rl);
print_string (" -> ");
print_rlimit (resource);
print_string ("\n");
}
struct list
{
struct list *next;
struct list *prev;
size_t size;
};
static struct list dummy;
static struct list heap = { &dummy, &dummy };
int
main ()
{
size_t max_chunk_size;
fprintf (stdout, "PID: %d\n", getpid());
fflush (stdout);
print_string ("Maximize resource limits ...\n");
#ifdef RLIMIT_CORE
maximize_rlimit (RLIMIT_CORE, "core");
#endif
#ifdef RLIMIT_DATA
maximize_rlimit (RLIMIT_DATA, "data");
#endif
#ifdef RLIMIT_STACK
maximize_rlimit (RLIMIT_STACK, "stack");
#endif
#ifdef RLIMIT_AS
maximize_rlimit (RLIMIT_AS, "stack");
#endif
{
size_t tmp;
for (tmp = 1; tmp > 0; tmp <<= 1)
max_chunk_size = tmp;
}
print_string ("Alocating the entire heap ...\n");
{
size_t chunk_size;
long bytes_allocated = 0;
long chunks_allocated = 0;
for (chunk_size = max_chunk_size;
chunk_size >= sizeof (struct list);
chunk_size >>= 1)
{
unsigned long count = 0;
print_string (" ");
print_unsigned (chunk_size);
print_string (" bytes ... ");
while (1)
{
struct list *chunk = malloc (chunk_size);
if (chunk == NULL)
break;
chunk->size = chunk_size;
chunk->next = NULL;
chunk->prev = heap.prev;
heap.prev->next = chunk;
heap.prev = chunk;
count++;
}
print_unsigned (count);
print_string (" chunks\n");
chunks_allocated += count;
bytes_allocated += chunk_size * count;
}
print_string ("Total of ");
print_unsigned (bytes_allocated);
print_string (" bytes ");
print_unsigned (chunks_allocated);
print_string (" chunks\n");
}
print_string ("Dump core ....\n");
*(char*)0 = 0;
}