{
struct thread *t;
struct thread_root_frame *rf;
- struct switch_thunk_frame *tf;
- struct switch_frame *sf;
+ struct switch_entry_frame *ef;
+ struct switch_threads_frame *sf;
ASSERT (function != NULL);
rf->function = function;
rf->aux = aux;
- /* Stack frame for switch_thunk(). */
- tf = alloc_frame (t, sizeof *tf);
- tf->eip = (void (*) (void)) thread_root;
+ /* Stack frame for switch_entry(). */
+ ef = alloc_frame (t, sizeof *ef);
+ ef->eip = (void (*) (void)) thread_root;
/* Stack frame for thread_switch(). */
sf = alloc_frame (t, sizeof *sf);
- sf->eip = (void (*) (void)) switch_thunk;
+ sf->eip = switch_entry;
/* Add to run queue. */
thread_ready (t);
{
struct thread *t;
struct intr_frame *if_;
- struct switch_thunk_frame *tf;
- struct switch_frame *sf;
+ struct switch_entry_frame *ef;
+ struct switch_threads_frame *sf;
void (*start) (void);
ASSERT (filename != NULL);
if_->eflags = FLAG_IF | 2;
if_->esp = PHYS_BASE;
if_->ss = SEL_UDSEG;
-
- /* Stack frame for switch_thunk(). */
- tf = alloc_frame (t, sizeof *tf);
- tf->eip = (void (*) (void)) intr_exit;
+
+ /* Stack frame for switch_entry(). */
+ ef = alloc_frame (t, sizeof *ef);
+ ef->eip = intr_exit;
/* Stack frame for thread_switch(). */
sf = alloc_frame (t, sizeof *sf);
- sf->eip = (void (*) (void)) switch_thunk;
+ sf->eip = switch_entry;
/* Add to run queue. */
thread_ready (t);
palloc_free (t);
}
+void schedule_tail (struct thread *prev);
+
+void
+schedule_tail (struct thread *prev)
+{
+ struct thread *cur = thread_current ();
+
+#ifdef USERPROG
+ addrspace_activate (&cur->addrspace);
+#endif
+
+ if (prev != NULL && prev->status == THREAD_DYING)
+ thread_destroy (prev);
+
+ intr_enable ();
+}
+
void
thread_schedule (void)
{
idle ();
next->status = THREAD_RUNNING;
- prev = switch_threads (cur, next);
-
- /* Prevent GCC from reordering anything around the thread
- switch. */
- asm volatile ("" : : : "memory");
-
-#ifdef USERPROG
- addrspace_activate (&cur->addrspace);
-#endif
+ if (cur != next)
+ {
+ prev = switch_threads (cur, next);
- if (prev != NULL && prev->status == THREAD_DYING)
- thread_destroy (prev);
+ /* Prevent GCC from reordering anything around the thread
+ switch. */
+ asm volatile ("" : : : "memory");
- intr_enable ();
+ schedule_tail (prev);
+ }
}
void
intr_disable ();
thread_current ()->status = THREAD_DYING;
thread_schedule ();
+ NOT_REACHED ();
}
void