1/* Compile with:
2 * i686-pc-linux-gnu-gcc hog.c -o hog
3 */
4
5#include <fcntl.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <unistd.h>
10#include <sys/stat.h>
11#include <sys/types.h>
12
13#define MEGA (1 << 20)
14#define CHUNK_SIZE MEGA                 /* one-megabyte chunks */
15#define MAX_CHUNKS 4096
16const int n_touches = CHUNK_SIZE >> 12;  /* average 1 per page */
17char *chunks[MAX_CHUNKS];
18
19
20long int estrtol(const char *s) {
21  char *end;
22  long int n;
23  n = strtol(s, &end, 10);
24  if (*end != '\0') {
25    fprintf(stderr, "hog: malformed integer %s\n", s);
26    exit(1);
27  }
28  return n;
29}
30
31
32int main(int ac, const char **av) {
33  int chunk;
34  int compression_factor = 3;
35  unsigned int i, c, x;
36  long int megabytes;
37  int random_fd = open("/dev/urandom", O_RDONLY);
38  char *fake_data = malloc(CHUNK_SIZE);
39  char *p;
40
41  if (ac != 2 && ac != 3) {
42    fprintf(stderr,
43            "usage: hog <megabytes> [<compression factor (default = 3)>]\n");
44    exit(1);
45  }
46
47  megabytes = estrtol(av[1]);
48
49  if (megabytes > MAX_CHUNKS) {
50    fprintf(stderr, "hog: too many megabytes (%ld, max = %d)\n",
51            megabytes, MAX_CHUNKS);
52  }
53
54  if (ac == 3) {
55     compression_factor = estrtol(av[2]);
56  }
57
58  /* Fill fake_data with fake data so that it compresses to roughly the desired
59   * compression factor.
60   */
61  read(random_fd, fake_data, CHUNK_SIZE / compression_factor);
62  /* Fill the rest of the fake data with ones (compresses well). */
63  memset(fake_data + CHUNK_SIZE / compression_factor, 1,
64         CHUNK_SIZE - (CHUNK_SIZE / compression_factor));
65
66  for (chunk = 0; chunk < megabytes; chunk++) {
67    /* Allocate */
68    p = malloc(CHUNK_SIZE);
69
70    if (p == NULL) {
71      printf("hog: out of memory at chunk %d\n", chunk);
72      break;
73    }
74
75    /* Fill allocated memory with fake data */
76    memcpy(p, fake_data, CHUNK_SIZE);
77
78    /* Remember allocated data. */
79    chunks[chunk] = p;
80  }
81
82  printf("hog: idling\n", chunk);
83  while (1)
84    sleep(10);
85}
86