ae2559e5010321d1d8ac0ffc959ef7405189e94e
[pintos-anon] / grading / vm / page-shuffle.c
1 #include <stdbool.h>
2 #include <stdio.h>
3 #include "../lib/arc4.h"
4 #include "../lib/cksum.h"
5
6 #define SIZE (128 * 1024)
7
8 static char buf[SIZE];
9
10 static struct arc4 *
11 get_key (void) 
12 {
13   static struct arc4 arc4;
14   static bool inited = false;
15   if (!inited) 
16     {
17       arc4_init (&arc4, "quux", 4);
18       inited = true; 
19     }
20   return &arc4;
21 }
22
23 static unsigned long
24 random_ulong (void) 
25 {
26   static unsigned long x;
27   arc4_crypt (get_key (), &x, sizeof x);
28   return x;
29 }
30
31 static void
32 shuffle (void) 
33 {
34   size_t i;
35
36   for (i = 0; i < sizeof buf; i++)
37     {
38       size_t j = i + random_ulong () % (sizeof buf - i);
39       char t = buf[i];
40       buf[i] = buf[j];
41       buf[j] = t;
42     }
43 }
44
45 int
46 main (void) 
47 {
48   size_t i;
49
50   printf ("(page-shuffle) begin\n");
51
52   /* Initialize. */
53   for (i = 0; i < sizeof buf; i++)
54     buf[i] = i * 257;
55   printf ("(page-shuffle) init: cksum=%lu\n", cksum (buf, sizeof buf));
56     
57   /* Shuffle repeatedly. */
58   for (i = 0; i < 10; i++)
59     {
60       shuffle ();
61       printf ("(page-shuffle) shuffle %zu: cksum=%lu\n",
62               i, cksum (buf, sizeof buf));
63     }
64   
65   /* Done. */
66   printf ("(page-shuffle) end\n");
67
68   return 0;
69 }