diff options
Diffstat (limited to 'userprog/process.c')
| -rw-r--r-- | userprog/process.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/userprog/process.c b/userprog/process.c index 2771e76..f399038 100644 --- a/userprog/process.c +++ b/userprog/process.c | |||
| @@ -130,6 +130,8 @@ start_process (void *aux) | |||
| 130 | thread->process = process; | 130 | thread->process = process; |
| 131 | 131 | ||
| 132 | page_table_init (&thread->page_table); | 132 | page_table_init (&thread->page_table); |
| 133 | if (!mmap_table_init (&process->mmap_table)) | ||
| 134 | goto signal; | ||
| 133 | 135 | ||
| 134 | /* Initialize interrupt frame and load executable. */ | 136 | /* Initialize interrupt frame and load executable. */ |
| 135 | memset (&if_, 0, sizeof if_); | 137 | memset (&if_, 0, sizeof if_); |
| @@ -149,6 +151,14 @@ start_process (void *aux) | |||
| 149 | /* If process startup failed, quit. */ | 151 | /* If process startup failed, quit. */ |
| 150 | if (thread->process == NULL) { | 152 | if (thread->process == NULL) { |
| 151 | if (process != NULL) { | 153 | if (process != NULL) { |
| 154 | //TODO: free mmap table + page table? | ||
| 155 | |||
| 156 | /* close/free memory mapped files */ | ||
| 157 | //mmap_table_free (&process->mmap_table); | ||
| 158 | |||
| 159 | /* free page table */ | ||
| 160 | //page_table_free (&thread->page_table); | ||
| 161 | |||
| 152 | if (process->fd_table.fds != NULL) | 162 | if (process->fd_table.fds != NULL) |
| 153 | palloc_free_page (process->fd_table.fds); | 163 | palloc_free_page (process->fd_table.fds); |
| 154 | palloc_free_page (process); | 164 | palloc_free_page (process); |
| @@ -232,6 +242,9 @@ process_exit (void) | |||
| 232 | lock_release (&filesys_lock); | 242 | lock_release (&filesys_lock); |
| 233 | } | 243 | } |
| 234 | 244 | ||
| 245 | /* close/free memory mapped files */ | ||
| 246 | mmap_table_free (&proc->mmap_table); | ||
| 247 | |||
| 235 | int fd; | 248 | int fd; |
| 236 | for (fd = 2; fd <= proc->fd_table.fd_max; fd++) { | 249 | for (fd = 2; fd <= proc->fd_table.fd_max; fd++) { |
| 237 | process_close_file (fd); | 250 | process_close_file (fd); |
| @@ -254,6 +267,7 @@ process_exit (void) | |||
| 254 | pagedir_destroy (pd); | 267 | pagedir_destroy (pd); |
| 255 | } | 268 | } |
| 256 | 269 | ||
| 270 | /* free page table */ | ||
| 257 | page_table_free (&thread->page_table); | 271 | page_table_free (&thread->page_table); |
| 258 | 272 | ||
| 259 | /* Destroy the process structure if the parent is not alive | 273 | /* Destroy the process structure if the parent is not alive |
| @@ -560,8 +574,8 @@ load_segment (struct file *file, off_t ofs, uint8_t *upage, | |||
| 560 | size_t page_zero_bytes = PGSIZE - page_read_bytes; | 574 | size_t page_zero_bytes = PGSIZE - page_read_bytes; |
| 561 | 575 | ||
| 562 | /* add segment to page table for on demand loading */ | 576 | /* add segment to page table for on demand loading */ |
| 563 | if (!page_table_insert_segment (file, ofs, upage, page_read_bytes, | 577 | if (!page_table_insert_segment (&thread_current ()->page_table, file, ofs, |
| 564 | page_zero_bytes, writable)) | 578 | upage, page_read_bytes, writable)) |
| 565 | return false; | 579 | return false; |
| 566 | 580 | ||
| 567 | /* Advance. */ | 581 | /* Advance. */ |
