#include "threads/flags.h"
#include "threads/interrupt.h"
#include "threads/intr-stubs.h"
-#include "threads/mmu.h"
#include "threads/palloc.h"
#include "threads/switch.h"
#include "threads/synch.h"
+#include "threads/vaddr.h"
#ifdef USERPROG
#include "userprog/process.h"
#endif
void
thread_start (void)
{
- thread_create ("idle", PRI_MAX, idle, NULL);
+ thread_create ("idle", PRI_MIN, idle, NULL);
intr_enable ();
}
/* If the thread we switched from is dying, destroy its struct
thread. This must happen late so that thread_exit() doesn't
- pull out the rug under itself. */
- if (prev != NULL && prev->status == THREAD_DYING)
+ pull out the rug under itself. (We don't free
+ initial_thread because its memory was not obtained via
+ palloc().) */
+ if (prev != NULL && prev->status == THREAD_DYING && prev != initial_thread)
{
ASSERT (prev != cur);
- if (prev != initial_thread)
- palloc_free_page (prev);
+ palloc_free_page (prev);
}
}