summaryrefslogtreecommitdiffstats
path: root/userprog/process.c
diff options
context:
space:
mode:
authormanuel <manuel@mausz.at>2012-06-21 16:47:23 +0200
committermanuel <manuel@mausz.at>2012-06-21 16:47:23 +0200
commite11b2ef0c606ab516a4344aeea1dbba22cb1fe5d (patch)
treeb4973f4dca916113c82a4a172f6f729d41cf4430 /userprog/process.c
parente9e69def589375c3d0e51b532268b27d3d403bbf (diff)
downloadprogos-e11b2ef0c606ab516a4344aeea1dbba22cb1fe5d.tar.gz
progos-e11b2ef0c606ab516a4344aeea1dbba22cb1fe5d.tar.bz2
progos-e11b2ef0c606ab516a4344aeea1dbba22cb1fe5d.zip
initial implementation of memory mapped files
Diffstat (limited to 'userprog/process.c')
-rw-r--r--userprog/process.c18
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. */