Use a single exit_status instead of two

This commit is contained in:
2024-11-15 17:20:51 +00:00
parent e76712d3fd
commit 8567434231
4 changed files with 12 additions and 21 deletions

View File

@@ -673,7 +673,7 @@ init_process_result (struct thread *t)
{ {
struct process_result *result = malloc (sizeof (struct process_result)); struct process_result *result = malloc (sizeof (struct process_result));
result->tid = t->tid; result->tid = t->tid;
result->exit_status = t->exit_status; result->exit_status = -1;
lock_init (&result->lock); lock_init (&result->lock);
sema_init (&result->sema, 0); sema_init (&result->sema, 0);
t->result = result; t->result = result;
@@ -707,8 +707,6 @@ init_thread (struct thread *t, const char *name, int nice, int priority,
t->recent_cpu = recent_cpu; t->recent_cpu = recent_cpu;
t->priority = t->base_priority; t->priority = t->base_priority;
t->exit_status = -1;
old_level = intr_disable (); old_level = intr_disable ();
list_push_back (&all_list, &t->allelem); list_push_back (&all_list, &t->allelem);
intr_set_level (old_level); intr_set_level (old_level);

View File

@@ -135,8 +135,6 @@ struct thread
/* Shared between thread.c and synch.c. */ /* Shared between thread.c and synch.c. */
struct list_elem elem; /* List element. */ struct list_elem elem; /* List element. */
int exit_status; /* Exit Status: 0 = successful exit. */
#ifdef USERPROG #ifdef USERPROG
/* Owned by userprog/process.c. */ /* Owned by userprog/process.c. */
uint32_t *pagedir; /* Page directory. */ uint32_t *pagedir; /* Page directory. */

View File

@@ -56,7 +56,7 @@ struct process_start_data
}; };
static thread_func start_process NO_RETURN; static thread_func start_process NO_RETURN;
static void destruct_process_result (struct hash_elem *e, void *aux); static void destruct_process_result (struct hash_elem *e, void *aux UNUSED);
static bool load (const char *cmdline, void (**eip) (void), void **esp); static bool load (const char *cmdline, void (**eip) (void), void **esp);
/* Starts a new thread running a user program executed via /* Starts a new thread running a user program executed via
@@ -355,8 +355,6 @@ process_exit (void)
struct thread *cur = thread_current (); struct thread *cur = thread_current ();
uint32_t *pd; uint32_t *pd;
printf ("%s: exit(%d)\n", cur->name, cur->exit_status);
/* Clean up all open files */ /* Clean up all open files */
hash_destroy (&cur->open_files, fd_cleanup); hash_destroy (&cur->open_files, fd_cleanup);
@@ -369,9 +367,12 @@ process_exit (void)
lock_release (&filesys_lock); lock_release (&filesys_lock);
} }
/* Update own process result. */
if (cur->result != NULL) if (cur->result != NULL)
destruct_process_result (&cur->result->elem, cur); {
printf ("%s: exit(%d)\n", cur->name, cur->result->exit_status);
/* Update own process result. */
destruct_process_result (&cur->result->elem, cur);
}
/* Free child process results or signal parent's death. */ /* Free child process results or signal parent's death. */
hash_destroy (&cur->child_results, destruct_process_result); hash_destroy (&cur->child_results, destruct_process_result);
@@ -394,16 +395,12 @@ process_exit (void)
} }
} }
/* Destruct a process_result, with multi-thread awareness. Takes the /* Destruct a process_result, with multi-thread awareness.
process_result->elem and current thread.
If the other thread is running, simply signals death. Otherwise If the other thread is running, simply signals death. Otherwise
frees the result. frees the result. */
Also set's process_result->exit_status if the process result is FOR
the current thread. */
static void static void
destruct_process_result (struct hash_elem *e, void *cur_) destruct_process_result (struct hash_elem *e, void *aux UNUSED)
{ {
struct thread *cur = cur_;
struct process_result *result = hash_entry (e, struct process_result, elem); struct process_result *result = hash_entry (e, struct process_result, elem);
lock_acquire (&result->lock); lock_acquire (&result->lock);
/* Other thread has died (and was not waited for). Free the result. */ /* Other thread has died (and was not waited for). Free the result. */
@@ -415,8 +412,6 @@ destruct_process_result (struct hash_elem *e, void *cur_)
/* Other thread is still alive, signal via sema that parent has died. */ /* Other thread is still alive, signal via sema that parent has died. */
else else
{ {
if (cur->tid == result->tid)
result->exit_status = cur->exit_status;
sema_up (&result->sema); sema_up (&result->sema);
lock_release (&result->lock); lock_release (&result->lock);
} }

View File

@@ -131,7 +131,7 @@ syscall_exit (int status)
{ {
/* Sets exit_status of the thread to status. thread_exit () will call /* Sets exit_status of the thread to status. thread_exit () will call
process_exit () if user programs are allowed. */ process_exit () if user programs are allowed. */
thread_current ()->exit_status = status; thread_current ()->result->exit_status = status;
thread_exit (); thread_exit ();
} }
@@ -271,7 +271,7 @@ syscall_read (int fd, void *buffer, unsigned size)
{ {
/* Reading from the console. */ /* Reading from the console. */
char *write_buffer = buffer; char *write_buffer = buffer;
for (int i = 0; i < size; i++) for (unsigned i = 0; i < size; i++)
write_buffer[i] = input_getc (); write_buffer[i] = input_getc ();
/* In case of console, read is always (eventually) successful. So return /* In case of console, read is always (eventually) successful. So return