X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Fthread.c;h=560423b7de39dd9f3c6d92efda1b4e23ce811b72;hb=e66a310a95cd4706fb130ab415275f48def03b8d;hp=80c01fda86ef8496f7b188494e307364ae8d1085;hpb=c4b619c23029e05041fd35d523ec7f4bcd6d6e13;p=pintos-anon diff --git a/src/threads/thread.c b/src/threads/thread.c index 80c01fd..560423b 100644 --- a/src/threads/thread.c +++ b/src/threads/thread.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include "threads/flags.h" #include "threads/interrupt.h" @@ -11,7 +12,7 @@ #include "threads/switch.h" #include "threads/synch.h" #ifdef USERPROG -#include "userprog/gdt.h" +#include "userprog/process.h" #endif /* Random value for struct thread's `magic' member. @@ -45,7 +46,6 @@ static void kernel_thread (thread_func *, void *aux); static void idle (void *aux UNUSED); static struct thread *running_thread (void); static struct thread *next_thread_to_run (void); -static struct thread *new_thread (const char *name, int priority); static void init_thread (struct thread *, const char *name, int priority); static bool is_thread (struct thread *); static void *alloc_frame (struct thread *, size_t size); @@ -69,15 +69,13 @@ thread_init (void) ASSERT (intr_get_level () == INTR_OFF); lock_init (&tid_lock, "tid"); + list_init (&ready_list); /* Set up a thread structure for the running thread. */ initial_thread = running_thread (); init_thread (initial_thread, "main", PRI_DEFAULT); initial_thread->status = THREAD_RUNNING; initial_thread->tid = allocate_tid (); - - /* Initialize run queue. */ - list_init (&ready_list); } /* Starts preemptive thread scheduling by enabling interrupts. @@ -114,10 +112,14 @@ thread_create (const char *name, int priority, ASSERT (function != NULL); - t = new_thread (name, priority); + /* Allocate thread. */ + t = palloc_get (PAL_ZERO); if (t == NULL) return TID_ERROR; - tid = t->tid; + + /* Initialize thread. */ + init_thread (t, name, priority); + tid = t->tid = allocate_tid (); /* Stack frame for kernel_thread(). */ kf = alloc_frame (t, sizeof *kf); @@ -139,56 +141,6 @@ thread_create (const char *name, int priority, return tid; } -#ifdef USERPROG -/* Starts a new thread running a user program loaded from - FILENAME, and adds it to the ready queue. If thread_start() - has been called, then new thread may be scheduled before - thread_execute() returns.*/ -tid_t -thread_execute (const char *filename) -{ - struct thread *t; - struct intr_frame *if_; - struct switch_entry_frame *ef; - struct switch_threads_frame *sf; - void (*start) (void); - tid_t tid; - - ASSERT (filename != NULL); - - t = new_thread (filename, PRI_DEFAULT); - if (t == NULL) - return TID_ERROR; - tid = t->tid; - - if (!addrspace_load (t, filename, &start)) - PANIC ("%s: program load failed", filename); - - /* Interrupt frame. */ - if_ = alloc_frame (t, sizeof *if_); - if_->es = SEL_UDSEG; - if_->ds = SEL_UDSEG; - if_->eip = start; - if_->cs = SEL_UCSEG; - if_->eflags = FLAG_IF | FLAG_MBS; - if_->esp = PHYS_BASE; - if_->ss = SEL_UDSEG; - - /* Stack frame for switch_entry(). */ - ef = alloc_frame (t, sizeof *ef); - ef->eip = intr_exit; - - /* Stack frame for switch_threads(). */ - sf = alloc_frame (t, sizeof *sf); - sf->eip = switch_entry; - - /* Add to run queue. */ - thread_unblock (t); - - return tid; -} -#endif - /* Transitions a blocked thread T from its current state to the ready-to-run state. This is an error if T is not blocked. (Use thread_yield() to make the running thread ready.) */ @@ -337,22 +289,6 @@ is_thread (struct thread *t) return t != NULL && t->magic == THREAD_MAGIC; } -/* Creates a new thread named NAME as a child of the running - thread. Returns the new thread if successful or a null - pointer on failure. */ -static struct thread * -new_thread (const char *name, int priority) -{ - struct thread *t = palloc_get (PAL_ZERO); - if (t != NULL) - { - init_thread (t, name, priority); - t->tid = allocate_tid (); - } - - return t; -} - /* Does basic initialization of T as a blocked thread named NAME. */ static void @@ -397,17 +333,15 @@ next_thread_to_run (void) return list_entry (list_pop_front (&ready_list), struct thread, elem); } -/* Destroys T, which must be in the dying state and must not be - the running thread. */ +/* Destroys T, which must not be the running thread. */ static void destroy_thread (struct thread *t) { ASSERT (is_thread (t)); - ASSERT (t->status == THREAD_DYING); ASSERT (t != thread_current ()); #ifdef USERPROG - addrspace_destroy (t); + process_destroy (t); #endif if (t != initial_thread) palloc_free (t); @@ -437,7 +371,7 @@ schedule_tail (struct thread *prev) #ifdef USERPROG /* Activate the new address space. */ - addrspace_activate (cur); + process_activate (); #endif /* If the thread we switched from is dying, destroy it.