Fix Bug: Free all entries in the fd hashtable when the process exits, w/ E
This commit is contained in:
@@ -325,6 +325,11 @@ process_exit (void)
|
|||||||
uint32_t *pd;
|
uint32_t *pd;
|
||||||
|
|
||||||
printf ("%s: exit(%d)\n", cur->name, cur->exit_status);
|
printf ("%s: exit(%d)\n", cur->name, cur->exit_status);
|
||||||
|
|
||||||
|
/* Clean up all open files */
|
||||||
|
hash_destroy (&cur->open_files, fd_cleanup);
|
||||||
|
|
||||||
|
/* Close the executable file. */
|
||||||
if (cur->exec_file != NULL)
|
if (cur->exec_file != NULL)
|
||||||
{
|
{
|
||||||
lock_acquire (&filesys_lock);
|
lock_acquire (&filesys_lock);
|
||||||
|
|||||||
@@ -381,6 +381,20 @@ fd_less (const struct hash_elem *a_, const struct hash_elem *b_,
|
|||||||
return a->fd < b->fd;
|
return a->fd < b->fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Function to clean up an open file entry. Closes the file and frees the
|
||||||
|
associated memory. */
|
||||||
|
void
|
||||||
|
fd_cleanup (struct hash_elem *e, void *aux UNUSED)
|
||||||
|
{
|
||||||
|
struct open_file *file_info = hash_entry (e, struct open_file, elem);
|
||||||
|
|
||||||
|
lock_acquire (&filesys_lock);
|
||||||
|
file_close (file_info->file);
|
||||||
|
lock_release (&filesys_lock);
|
||||||
|
|
||||||
|
free (file_info);
|
||||||
|
}
|
||||||
|
|
||||||
/* Gets a file from its descriptor (FD number). If there is no file with the fd
|
/* Gets a file from its descriptor (FD number). If there is no file with the fd
|
||||||
FD it returns NULL. */
|
FD it returns NULL. */
|
||||||
static struct open_file *
|
static struct open_file *
|
||||||
|
|||||||
@@ -14,5 +14,6 @@ void syscall_init (void);
|
|||||||
|
|
||||||
unsigned fd_hash (const struct hash_elem *element, void *aux);
|
unsigned fd_hash (const struct hash_elem *element, void *aux);
|
||||||
bool fd_less (const struct hash_elem *a, const struct hash_elem *b, void *aux);
|
bool fd_less (const struct hash_elem *a, const struct hash_elem *b, void *aux);
|
||||||
|
void fd_cleanup (struct hash_elem *e, void *aux);
|
||||||
|
|
||||||
#endif /* userprog/syscall.h */
|
#endif /* userprog/syscall.h */
|
||||||
|
|||||||
Reference in New Issue
Block a user