Thanks to Godmar Back for pointing out that it could be better named.
#include "threads/thread.h"
#include "threads/vaddr.h"
- static thread_func execute_thread NO_RETURN;
+ static thread_func start_process NO_RETURN;
-static bool load (const char *cmdline, void (**eip) (void), void **esp);
+static bool load (const char *cmd_line, void (**eip) (void), void **esp);
+
+/* Data structure shared between process_execute() in the
-+ invoking thread and execute_thread() in the newly invoked
++ invoking thread and start_process() in the newly invoked
+ thread. */
+struct exec_info
+ {
+ sema_init (&exec.load_done, 0);
/* Create a new thread to execute FILE_NAME. */
-- tid = thread_create (file_name, PRI_DEFAULT, execute_thread, fn_copy);
+- tid = thread_create (file_name, PRI_DEFAULT, start_process, fn_copy);
- if (tid == TID_ERROR)
- palloc_free_page (fn_copy);
+ strlcpy (thread_name, file_name, sizeof thread_name);
+ strtok_r (thread_name, " ", &save_ptr);
-+ tid = thread_create (thread_name, PRI_DEFAULT, execute_thread, &exec);
++ tid = thread_create (thread_name, PRI_DEFAULT, start_process, &exec);
+ if (tid != TID_ERROR)
+ {
+ sema_down (&exec.load_done);
/* A thread function that loads a user process and starts it
running. */
static void
--execute_thread (void *file_name_)
-+execute_thread (void *exec_)
+-start_process (void *file_name_)
++start_process (void *exec_)
{
- char *file_name = file_name_;
+ struct exec_info *exec = exec_;
struct intr_frame if_;
bool success;
-@@ -58,10 +78,29 @@ execute_thread (void *file_name_)
+@@ -58,10 +78,29 @@ start_process (void *file_name_)
if_.gs = if_.fs = if_.es = if_.ds = if_.ss = SEL_UDSEG;
if_.cs = SEL_UCSEG;
if_.eflags = FLAG_IF | FLAG_MBS;
if (!success)
thread_exit ();
-@@ -75,18 +113,47 @@ execute_thread (void *file_name_)
+@@ -75,18 +113,47 @@ start_process (void *file_name_)
NOT_REACHED ();
}
+#include "vm/page.h"
+#include "vm/frame.h"
- static thread_func execute_thread NO_RETURN;
+ static thread_func start_process NO_RETURN;
-static bool load (const char *cmdline, void (**eip) (void), void **esp);
+static bool load (const char *cmd_line, void (**eip) (void), void **esp);
+
+/* Data structure shared between process_execute() in the
-+ invoking thread and execute_thread() in the newly invoked
++ invoking thread and start_process() in the newly invoked
+ thread. */
+struct exec_info
+ {
+ sema_init (&exec.load_done, 0);
/* Create a new thread to execute FILE_NAME. */
-- tid = thread_create (file_name, PRI_DEFAULT, execute_thread, fn_copy);
+- tid = thread_create (file_name, PRI_DEFAULT, start_process, fn_copy);
- if (tid == TID_ERROR)
- palloc_free_page (fn_copy);
+ strlcpy (thread_name, file_name, sizeof thread_name);
+ strtok_r (thread_name, " ", &save_ptr);
-+ tid = thread_create (thread_name, PRI_DEFAULT, execute_thread, &exec);
++ tid = thread_create (thread_name, PRI_DEFAULT, start_process, &exec);
+ if (tid != TID_ERROR)
+ {
+ sema_down (&exec.load_done);
/* A thread function that loads a user process and starts it
running. */
static void
--execute_thread (void *file_name_)
-+execute_thread (void *exec_)
+-start_process (void *file_name_)
++start_process (void *exec_)
{
- char *file_name = file_name_;
+ struct exec_info *exec = exec_;
struct intr_frame if_;
bool success;
-@@ -59,10 +81,28 @@ execute_thread (void *file_name_)
+@@ -59,10 +81,28 @@ start_process (void *file_name_)
if_.gs = if_.fs = if_.es = if_.ds = if_.ss = SEL_UDSEG;
if_.cs = SEL_UCSEG;
if_.eflags = FLAG_IF | FLAG_MBS;
if (!success)
thread_exit ();
-@@ -76,18 +116,47 @@ execute_thread (void *file_name_)
+@@ -76,18 +116,47 @@ start_process (void *file_name_)
NOT_REACHED ();
}
+#include "vm/page.h"
+#include "vm/frame.h"
- static thread_func execute_thread NO_RETURN;
+ static thread_func start_process NO_RETURN;
-static bool load (const char *cmdline, void (**eip) (void), void **esp);
+static bool load (const char *cmd_line, void (**eip) (void), void **esp);
+
+/* Data structure shared between process_execute() in the
-+ invoking thread and execute_thread() in the newly invoked
++ invoking thread and start_process() in the newly invoked
+ thread. */
+struct exec_info
+ {
+ sema_init (&exec.load_done, 0);
/* Create a new thread to execute FILE_NAME. */
-- tid = thread_create (file_name, PRI_DEFAULT, execute_thread, fn_copy);
+- tid = thread_create (file_name, PRI_DEFAULT, start_process, fn_copy);
- if (tid == TID_ERROR)
- palloc_free_page (fn_copy);
+ strlcpy (thread_name, file_name, sizeof thread_name);
+ strtok_r (thread_name, " ", &save_ptr);
-+ tid = thread_create (thread_name, PRI_DEFAULT, execute_thread, &exec);
++ tid = thread_create (thread_name, PRI_DEFAULT, start_process, &exec);
+ if (tid != TID_ERROR)
+ {
+ sema_down (&exec.load_done);
/* A thread function that loads a user process and starts it
running. */
static void
--execute_thread (void *file_name_)
-+execute_thread (void *exec_)
+-start_process (void *file_name_)
++start_process (void *exec_)
{
- char *file_name = file_name_;
+ struct exec_info *exec = exec_;
if (!success)
thread_exit ();
-@@ -76,18 +128,47 @@ execute_thread (void *file_name_)
+@@ -76,18 +128,47 @@ start_process (void *file_name_)
NOT_REACHED ();
}
stack, and returns to the caller.
This is a separate function because it is called directly when
- we launch a new user process (see execute_thread() in
+ we launch a new user process (see start_process() in
userprog/process.c). */
.globl intr_exit
.func intr_exit
#include "threads/thread.h"
#include "threads/vaddr.h"
-static thread_func execute_thread NO_RETURN;
+static thread_func start_process NO_RETURN;
static bool load (const char *cmdline, void (**eip) (void), void **esp);
/* Starts a new thread running a user program loaded from
strlcpy (fn_copy, file_name, PGSIZE);
/* Create a new thread to execute FILE_NAME. */
- tid = thread_create (file_name, PRI_DEFAULT, execute_thread, fn_copy);
+ tid = thread_create (file_name, PRI_DEFAULT, start_process, fn_copy);
if (tid == TID_ERROR)
palloc_free_page (fn_copy);
return tid;
/* A thread function that loads a user process and starts it
running. */
static void
-execute_thread (void *file_name_)
+start_process (void *file_name_)
{
char *file_name = file_name_;
struct intr_frame if_;
solution's structure:
/* Data structure shared between process_execute() in the
- invoking thread and execute_thread() in the newly invoked
+ invoking thread and start_process() in the newly invoked
thread. */
struct exec_info
{