/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- write_data
- read_data
- print_data
- do_work
- main
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5
6 /* This is creating a program that has
7 * a few more text pages than the average
8 * program we usually have.
9 */
10
11 // #define DEBUG
12
13 extern void call_all();
14 void write_data(unsigned int array[], unsigned int start);
15 void read_data(unsigned int array[], unsigned int start, const char *array_name);
16 void print_data(unsigned int array[]);
17 void do_work(unsigned int start);
18
19 #define PAGE_SIZE (4096)
20 #define DATA_BYTES (3 * 1024 * 1024)
21 #define PAGES (DATA_BYTES / PAGE_SIZE)
22 #define ELEM_SIZE (sizeof(unsigned int))
23 #define ELEMS ((PAGE_SIZE * PAGES / sizeof(unsigned int)) / 2)
24 #define ELEMS_PER_PAGE (PAGE_SIZE / ELEM_SIZE)
25 #define NUM_REFS (2)
26
27 #define STACK_PAGES_USED (9)
28 #define STACK_ARRAY_ELEMS (PAGE_SIZE * STACK_PAGES_USED / sizeof(unsigned int))
29
30 unsigned int init[] = {
31 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
32 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
33 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
34 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
35 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
36 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
37 };
38
39 #define INIT_ARRAY_ELEMS (sizeof(init) / sizeof(int))
40
41 unsigned int array1[ELEMS];
42 unsigned int array2[ELEMS];
43
44 void
45 write_data(unsigned int array[], unsigned int start)
46 {
47 unsigned int ref = 0;
48 unsigned int i = 0;
49
50 for (ref = 0; ref < NUM_REFS-1; ref++) {
51 for (i=0; i<ELEMS; i++) {
52 array[i] = start + (i / ELEMS_PER_PAGE);
53 }
54 }
55 }
56
57 void
58 read_data(unsigned int array[], unsigned int start, const char *array_name)
59 {
60 unsigned int ref = 0;
61 unsigned int i = 0;
62
63 for (ref = 0; ref < NUM_REFS-1; ref++) {
64 for (i=0; i<ELEMS; i++) {
65 if (array[i] != (start + (i / ELEMS_PER_PAGE))) {
66 printf("FAILED in file %s at line %d %s[%d] = %u != %u ref = %d\n",
67 __FILE__, __LINE__, array_name, i, array[i], i, ref+1);
68 exit(1);
69 }
70 }
71 }
72 }
73
74 void
75 print_data(unsigned int array[])
76 {
77 unsigned int i = 0;
78 unsigned int count = 0;
79
80 for (i=0; i<ELEMS; i+= (ELEMS_PER_PAGE)) {
81 printf("[%10u] = %10u ", i, array[i]);
82 if (((count+1) % 4) == 0) {
83 printf("\n");
84 }
85 count++;
86 }
87 printf("\n");
88 }
89
90 void
91 do_work(unsigned int start)
92 {
93 unsigned int stack_array[STACK_ARRAY_ELEMS];
94 unsigned int i = 0;
95 unsigned int array1_start = start;
96 unsigned int array2_start = start + (ELEMS / (ELEMS_PER_PAGE)) + 10;
97
98 printf("Checking uninitialized array1\n");
99 /* check the uninitialized array1 before initialization */
100 for (i=0; i<ELEMS; i++) {
101 if (array1[i] != 0) {
102 printf("FAILED in file %s at line %d: array1[%d] = %u != %d\n", __FILE__, __LINE__, i, array1[i], 0);
103 exit(1);
104 }
105 }
106
107 printf("Checking uninitialized array2\n");
108 /* check the uninitialized array2 before initialization */
109 for (i=0; i<ELEMS; i++) {
110 if (array2[i] != 0) {
111 printf("FAILED in file %s at line %d: array2[%d] = %u != %d\n", __FILE__, __LINE__, i, array2[i], 0);
112 exit(1);
113 }
114 }
115
116 for (i=0; i<STACK_ARRAY_ELEMS; i++) {
117 stack_array[i] = i * 1000;
118 }
119
120 for (i=0; i<2; i++) {
121 call_all();
122 write_data(array1, array1_start);
123 call_all();
124 printf("Checking initialized array1\n");
125 read_data(array1, array1_start, "array1");
126 }
127
128 /* check the uninitialized array2 again before initialization */
129 printf("Checking initialized array2 again\n");
130 for (i=0; i<ELEMS; i++) {
131 if (array2[i] != 0) {
132 printf("FAILED in file %s at line %d: array2[%d] = %u != %d\n", __FILE__, __LINE__, i, array2[i], 0);
133 exit(1);
134 }
135 }
136
137 printf("Checking initialized stack_array\n");
138 for (i=0; i<STACK_ARRAY_ELEMS; i++) {
139 if (stack_array[i] != i * 1000) {
140 printf("FAILED in file %s at line %d: stack_array[%d] = %u != %d\n", __FILE__, __LINE__, i, stack_array[i], i);
141 exit(1);
142 }
143 }
144
145 printf("Checking initialized init\n");
146 /* check the initialized array */
147 for (i=0; i<INIT_ARRAY_ELEMS; i++) {
148 if (init[i] != i) {
149 printf("FAILED in file %s at line %d: init[%d] = %u != %d\n", __FILE__, __LINE__, i, init[i], i);
150 exit(1);
151 }
152 }
153
154 for (i=0; i<2; i++) {
155 call_all();
156 write_data(array2, array2_start);
157 call_all();
158 printf("Checking initialized array2\n");
159 read_data(array2, array2_start, "array2");
160 }
161
162 printf("Checking initialized stack_array\n");
163 for (i=0; i<STACK_ARRAY_ELEMS; i++) {
164 if (stack_array[i] != i * 1000) {
165 printf("FAILED in file %s at line %d: stack_array[%d] = %u != %d\n", __FILE__, __LINE__, i, stack_array[i], i);
166 exit(1);
167 }
168 }
169
170 /* check the initialized array */
171 printf("Checking initialized init\n");
172 for (i=0; i<INIT_ARRAY_ELEMS; i++) {
173 if (init[i] != i) {
174 printf("FAILED in file %s at line %d: init[%d] = %u != %d\n", __FILE__, __LINE__, i, init[i], i);
175 exit(1);
176 }
177 }
178
179
180 printf("Checking initialized array1 for the last time\n");
181 read_data(array1, array1_start, "array1");
182 printf("Checking initialized array2 for the last time\n");
183 read_data(array2, array2_start, "array2");
184
185
186 printf("SUCCEEDED\n");
187 }
188
189 int
190 main()
191 {
192
193 #ifdef DEBUG
194 printf("PAGE_SIZE = %d\n", PAGE_SIZE);
195 printf("DATA_BYTES = %d\n", DATA_BYTES);
196 printf("ELEMS = %d\n", ELEMS);
197 printf("ELEMS_PER_PAGE = %d\n", ELEMS_PER_PAGE);
198 printf("PAGES = %d\n", PAGES);
199 printf("Array elements = %d\n", ELEMS);
200 printf("Pages per array = %d\n", ((ELEMS * sizeof(unsigned int)) / PAGE_SIZE));
201 #endif
202
203 do_work(1);
204 #ifdef DEBUG
205 printf("array 1\n");
206 print_data(array1);
207 printf("array 2\n");
208 print_data(array2);
209 #endif
210 exit(0);
211 }
212