root/user/uw-testbin/vm-mix1/vm-mix1.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. write_data
  2. read_data
  3. print_data
  4. do_work
  5. 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 

/* [<][>][^][v][top][bottom][index][help] */