Add a mmap destroy function to cleanup all mmap hash table entries upon thread exit

This commit is contained in:
sBubshait
2024-12-04 15:14:02 +00:00
parent 1ce09a49a1
commit a2f46f3b72
3 changed files with 22 additions and 0 deletions

View File

@@ -397,6 +397,8 @@ thread_exit (void)
process_exit (); process_exit ();
#endif #endif
mmap_destroy ();
/* Remove thread from all threads list, set our status to dying, /* Remove thread from all threads list, set our status to dying,
and schedule another process. That process will destroy us and schedule another process. That process will destroy us
when it calls thread_schedule_tail(). */ when it calls thread_schedule_tail(). */

View File

@@ -33,3 +33,21 @@ mmap_less (const struct hash_elem *a_, const struct hash_elem *b_,
return a->mapping < b->mapping; return a->mapping < b->mapping;
} }
/* Cleans up the mmap table for the current thread. Frees the memory allocated
for the mmap entry. */
static void
mmap_cleanup (struct hash_elem *e, void *aux UNUSED)
{
struct mmap_entry *mmap = hash_entry (e, struct mmap_entry, elem);
file_close (mmap->file);
free (mmap);
}
/* Destroys the mmap table for the current thread. Frees all the memory
allocated for the mmap entries. */
void
mmap_destroy (void)
{
hash_destroy (&thread_current ()->mmap_files, mmap_cleanup);
}

View File

@@ -3,6 +3,7 @@
#include <hash.h> #include <hash.h>
#include "threads/thread.h" #include "threads/thread.h"
#include "filesys/file.h"
/* A mapping identifier type. */ /* A mapping identifier type. */
typedef unsigned mapid_t; typedef unsigned mapid_t;
@@ -17,5 +18,6 @@ struct mmap_entry {
}; };
bool mmap_init (void); bool mmap_init (void);
void mmap_destroy (void);
#endif /* vm/mmap.h */ #endif /* vm/mmap.h */