Compare commits
7 Commits
vm/pagedir
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad4eda5385 | ||
|
|
8d1b4c4994 | ||
|
|
07c0219058 | ||
|
|
5fbabdcec9 | ||
|
|
5e8bdc68e7 | ||
|
|
d039b59b7c | ||
|
|
29c0b93711 |
@@ -241,6 +241,7 @@ frame_owner_insert (void *frame, struct thread *owner)
|
|||||||
struct frame_owner *frame_owner = malloc (sizeof (struct frame_owner));
|
struct frame_owner *frame_owner = malloc (sizeof (struct frame_owner));
|
||||||
if (frame_owner == NULL)
|
if (frame_owner == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
frame_owner->owner = owner;
|
frame_owner->owner = owner;
|
||||||
list_push_back (&frame_metadata->owners, &frame_owner->elem);
|
list_push_back (&frame_metadata->owners, &frame_owner->elem);
|
||||||
return true;
|
return true;
|
||||||
@@ -263,6 +264,7 @@ frame_owner_remove (void *frame, struct thread *owner)
|
|||||||
{
|
{
|
||||||
struct frame_owner *frame_owner
|
struct frame_owner *frame_owner
|
||||||
= list_entry (oe, struct frame_owner, elem);
|
= list_entry (oe, struct frame_owner, elem);
|
||||||
|
|
||||||
oe = list_next (oe);
|
oe = list_next (oe);
|
||||||
if (frame_owner->owner == owner)
|
if (frame_owner->owner == owner)
|
||||||
{
|
{
|
||||||
@@ -284,6 +286,7 @@ frame_metadata_find (void *frame)
|
|||||||
struct hash_elem *e = hash_find (&frame_table, &key_metadata.hash_elem);
|
struct hash_elem *e = hash_find (&frame_table, &key_metadata.hash_elem);
|
||||||
if (e == NULL)
|
if (e == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return hash_entry (e, struct frame_metadata, hash_elem);
|
return hash_entry (e, struct frame_metadata, hash_elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ mmap_unmap (struct mmap_entry *mmap)
|
|||||||
hash_delete (&thread_current ()->pages, &page->elem);
|
hash_delete (&thread_current ()->pages, &page->elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Close the file and free the mmap entry. */
|
||||||
file_close (mmap->file);
|
file_close (mmap->file);
|
||||||
free (mmap);
|
free (mmap);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -195,6 +195,7 @@ page_load_file (struct page_entry *page)
|
|||||||
lock_acquire (&shared_file_pages_lock);
|
lock_acquire (&shared_file_pages_lock);
|
||||||
struct shared_file_page *sfp
|
struct shared_file_page *sfp
|
||||||
= shared_file_page_get (page->file, page->upage);
|
= shared_file_page_get (page->file, page->upage);
|
||||||
|
|
||||||
if (sfp != NULL)
|
if (sfp != NULL)
|
||||||
{
|
{
|
||||||
/* Frame exists, just install it. */
|
/* Frame exists, just install it. */
|
||||||
@@ -207,7 +208,8 @@ page_load_file (struct page_entry *page)
|
|||||||
}
|
}
|
||||||
frame_owner_insert (sfp->frame, t);
|
frame_owner_insert (sfp->frame, t);
|
||||||
}
|
}
|
||||||
/* Shared page is in swap. Load it. */
|
|
||||||
|
/* Otherwise, shared page is in swap. Load it. */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
void *frame = frame_alloc (PAL_USER, page->upage, t);
|
void *frame = frame_alloc (PAL_USER, page->upage, t);
|
||||||
@@ -223,6 +225,7 @@ page_load_file (struct page_entry *page)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
page_flag_shared (t, page->upage, true);
|
page_flag_shared (t, page->upage, true);
|
||||||
if (page->type != PAGE_SHARED)
|
if (page->type != PAGE_SHARED)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user