11 #define CHUNK_SIZE (63 * 1024) /* Max file size. */
12 #define CHUNK_CNT 16 /* Number of chunks. */
13 #define DATA_SIZE (CHUNK_CNT * CHUNK_SIZE) /* Buffer size. */
15 unsigned char buf1[DATA_SIZE], buf2[DATA_SIZE];
16 size_t histogram[256];
18 /* Initialize buf1 with random data,
19 then count the number of instances of each value within it. */
26 printf ("page-merge-seq) init\n");
28 arc4_init (&arc4, "foobar", 6);
29 arc4_crypt (&arc4, buf1, sizeof buf1);
30 for (i = 0; i < sizeof buf1; i++)
34 /* Sort each chunk of buf1 using a subprocess. */
41 create ("buffer", CHUNK_SIZE);
43 for (i = 0; i < CHUNK_CNT; i++)
47 printf ("(page-merge-seq) sort chunk %zu\n", i);
49 /* Write this chunk to a file. */
53 fd = open ("buffer", O_WRONLY | O_CREAT, 0660);
57 printf ("(page-merge-seq) open() failed\n");
60 write (fd, buf1 + CHUNK_SIZE * i, CHUNK_SIZE);
63 /* Sort with subprocess. */
65 pid_t child = exec ("child-sort");
68 printf ("(page-merge-seq) exec() failed\n");
71 if (join (child) != 0x123)
73 printf ("(page-merge-seq) join(exec()) returned bad value\n");
77 system ("./child-sort");
80 /* Read chunk back from file. */
84 fd = open ("buffer", O_RDONLY);
88 printf ("(page-merge-seq) open() failed\n");
91 read (fd, buf1 + CHUNK_SIZE * i, CHUNK_SIZE);
96 /* Merge the sorted chunks in buf1 into a fully sorted buf2. */
100 unsigned char *mp[CHUNK_CNT];
105 printf ("(page-merge-seq) merge\n");
107 /* Initialize merge pointers. */
109 for (i = 0; i < CHUNK_CNT; i++)
110 mp[i] = buf1 + CHUNK_SIZE * i;
116 /* Find smallest value. */
118 for (i = 1; i < mp_left; i++)
119 if (*mp[i] < *mp[min])
122 /* Append value to buf2. */
125 /* Advance merge pointer.
126 Delete this chunk from the set if it's emptied. */
127 if ((++mp[min] - buf1) % CHUNK_SIZE == 0)
128 mp[min] = mp[--mp_left];
138 printf ("(page-merge-seq) verify\n");
141 for (hist_idx = 0; hist_idx < sizeof histogram / sizeof *histogram;
144 while (histogram[hist_idx]-- > 0)
146 if (buf2[buf_idx] != hist_idx)
148 printf ("(page-merge-seq) bad value %d in byte %zu\n",
149 buf2[buf_idx], buf_idx);
156 printf ("(page-merge-seq) success, buf_idx=%zu\n", buf_idx);
162 printf ("(page-merge-seq) begin\n");
167 printf ("(page-merge-seq) end\n");