Randomize the bits that bitmap_scan() returns, to make student errors
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 18 May 2006 19:02:35 +0000 (19:02 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 18 May 2006 19:02:35 +0000 (19:02 +0000)
that assume contiguous memory allocation show up.

TODO
src/lib/kernel/bitmap.c
src/threads/init.c

diff --git a/TODO b/TODO
index a4e3e31c080d3a2d5f0a004ec08f10e1d05bc540..c493bce93f5fa9031f818c8f82cfa77b0afe573a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -7,11 +7,6 @@ that span multiple pages, where some are mapped and some are not.
 An implementation that only checks the first page, rather than all pages 
 that can be touched during a call to read()/write() passes all tests.
 
-- In Project 2, we're missing a test that would fail if they assumed
-that contiguous user-virtual addresses are laid out contiguously 
-in memory.  The loading code should ensure that non-contiguous 
-physical pages are allocated for the data segment (at least.)
-
 - Need some tests that test that illegal accesses lead to process
 termination. I have written some, will add them. In P2, obviously, 
 this would require that the students break this functionality since 
index d323b8982e552c1dcc7ab385de78786b661aa36a..77edf2270b35435538fbbb5adeec52096403f50b 100644 (file)
@@ -1,6 +1,7 @@
 #include "bitmap.h"
 #include <debug.h>
 #include <limits.h>
+#include <random.h>
 #include <round.h>
 #include <stdio.h>
 #include "threads/malloc.h"
@@ -289,7 +290,7 @@ bitmap_all (const struct bitmap *b, size_t start, size_t cnt)
 \f
 /* Finding set or unset bits. */
 
-/* Finds and returns the starting index of the first group of CNT
+/* Finds and returns the starting index of a group of CNT
    consecutive bits in B at or after START that are all set to
    VALUE.
    If there is no such group, returns BITMAP_ERROR. */
@@ -302,15 +303,20 @@ bitmap_scan (const struct bitmap *b, size_t start, size_t cnt, bool value)
   if (cnt <= b->bit_cnt) 
     {
       size_t last = b->bit_cnt - cnt;
-      size_t i;
-      for (i = start; i <= last; i++)
-        if (!bitmap_contains (b, i, cnt, !value))
-          return i; 
+      size_t middle = start + random_ulong () % (last - start + 1); 
+      size_t i = middle;
+      do
+        {
+          if (!bitmap_contains (b, i, cnt, !value))
+            return i; 
+          i = i != last ? i + 1 : start;
+        }
+      while (i != middle);
     }
   return BITMAP_ERROR;
 }
 
-/* Finds the first group of CNT consecutive bits in B at or after
+/* Finds a group of CNT consecutive bits in B at or after
    START that are all set to VALUE, flips them all to !VALUE,
    and returns the index of the first bit in the group.
    If there is no such group, returns BITMAP_ERROR.
index 57797be7dbdd023a351b04798ad6eebe7acf481a..ef82cb192083e398f1c859a2faaf403a8c35ff8e 100644 (file)
@@ -90,6 +90,9 @@ main (void)
   argv = read_command_line ();
   argv = parse_options (argv);
 
+  /* Set random seed if parse_options() didn't. */
+  random_init (0);
+
   /* Initialize memory system. */
   palloc_init ();
   malloc_init ();
@@ -101,9 +104,6 @@ main (void)
   gdt_init ();
 #endif
 
-  /* Set random seed if parse_options() didn't. */
-  random_init (0);
-
   /* Initialize interrupt handlers. */
   intr_init ();
   timer_init ();