Get rid of unnecessary barrier. Improve comment.
[pintos-anon] / grading / vm / posix-compat.c
index dc5b5ab668798ce05c01c0b7000950cb8acb0286..06254615ee106b5087a91be4e43f51b3bd8c3001 100644 (file)
@@ -1,4 +1,5 @@
 #include <dirent.h>
+#include <round.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -10,7 +11,7 @@
 #undef halt
 #undef exit
 #undef exec
-#undef join
+#undef wait
 #undef create
 #undef remove
 #undef open
@@ -67,7 +68,7 @@ pintos_exec (const char *cmd_line)
 }
 
 int
-pintos_join (pid_t child) 
+pintos_wait (pid_t child) 
 {
   int status = 0;
   waitpid (child, &status, 0);
@@ -100,10 +101,9 @@ pintos_open (const char *file)
 int
 pintos_filesize (int fd) 
 {
-  off_t old = lseek (fd, 0, SEEK_CUR);
-  off_t size = lseek (fd, 0, SEEK_END);
-  lseek (fd, old, SEEK_SET);
-  return size;
+  struct stat s;
+  fstat (fd, &s);
+  return s.st_size;
 }
 
 int
@@ -137,17 +137,24 @@ pintos_close (int fd)
   close (fd);
 }
 
-bool
-pintos_mmap (int fd, void *addr, unsigned length
+mapid_t
+pintos_mmap (int fd, void *addr) 
 {
-  return mmap (addr, length, PROT_READ | PROT_WRITE,
-               MAP_SHARED | MAP_FIXED, fd, 0) == addr;
+  size_t page_size = getpagesize ();
+  int length = pintos_filesize (fd);
+  uintptr_t ptr = (uintptr_t) mmap (addr, length, PROT_READ | PROT_WRITE,
+                                    MAP_SHARED | MAP_FIXED, fd, 0);
+  return ptr | DIV_ROUND_UP (size, page_size);
 }
 
 bool
 pintos_munmap (void *addr, unsigned length) 
 {
-  return munmap (addr, length) == 0;
+  size_t page_size = getpagesize ();
+  uintptr_t page_mask = page_size - 1;
+  void *base = (void *) ((uintptr_t) addr & ~page_mask);
+  size_t length = ((uintptr_t) addr & page_mask) * page_size;
+  return munmap (base, length);
 }
 
 bool