Compare commits
2 Commits
vm/pagedir
...
bad-synch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0084d12fb1 | ||
|
|
6943c77630 |
@@ -6,6 +6,7 @@
|
||||
#include "threads/init.h"
|
||||
#include "threads/pte.h"
|
||||
#include "threads/palloc.h"
|
||||
#include "threads/synch.h"
|
||||
#include "vm/frame.h"
|
||||
#include "vm/page.h"
|
||||
|
||||
@@ -35,6 +36,7 @@ pagedir_destroy (uint32_t *pd)
|
||||
return;
|
||||
|
||||
ASSERT (pd != init_page_dir);
|
||||
lock_acquire (&lru_lock);
|
||||
for (pde = pd; pde < pd + pd_no (PHYS_BASE); pde++)
|
||||
if (*pde & PTE_P)
|
||||
{
|
||||
@@ -53,6 +55,7 @@ pagedir_destroy (uint32_t *pd)
|
||||
palloc_free_page (pt);
|
||||
}
|
||||
palloc_free_page (pd);
|
||||
lock_release (&lru_lock);
|
||||
}
|
||||
|
||||
/* Returns the address of the page table entry for virtual
|
||||
|
||||
@@ -209,8 +209,13 @@ frame_free (void *frame)
|
||||
"but this address is not allocated!\n",
|
||||
frame);
|
||||
|
||||
bool lock_held = lock_held_by_current_thread (&lru_lock);
|
||||
|
||||
free_owners (&frame_metadata->owners);
|
||||
lock_acquire (&lru_lock);
|
||||
|
||||
if (!lock_held)
|
||||
lock_acquire (&lru_lock);
|
||||
|
||||
hash_delete (&frame_table, &frame_metadata->hash_elem);
|
||||
list_remove (&frame_metadata->list_elem);
|
||||
|
||||
@@ -224,7 +229,9 @@ frame_free (void *frame)
|
||||
else
|
||||
next_victim = lru_next (next_victim);
|
||||
}
|
||||
lock_release (&lru_lock);
|
||||
|
||||
if (!lock_held)
|
||||
lock_release (&lru_lock);
|
||||
|
||||
free (frame_metadata);
|
||||
palloc_free_page (frame);
|
||||
|
||||
@@ -183,7 +183,6 @@ page_load_file (struct page_entry *page)
|
||||
panics as this should not happen if eviction is working correctly. */
|
||||
struct thread *t = thread_current ();
|
||||
bool shareable = !page->writable && file_compare (page->file, t->exec_file);
|
||||
shareable = false;
|
||||
if (shareable)
|
||||
{
|
||||
lock_acquire (&shared_file_pages_lock);
|
||||
|
||||
Reference in New Issue
Block a user