-/* Creates a new kernel thread named NAME, which executes
- FUNCTION passing AUX as the argument, and adds it to the ready
- queue. If thread_start() has been called, then the new thread
- may be scheduled before thread_create() returns. Use a
- semaphore or some other form of synchronization if you need to
- ensure ordering. */
-struct thread *
-thread_create (const char *name, thread_func *function, void *aux)
+/* Called by the timer interrupt handler at each timer tick.
+ Thus, this function runs in an external interrupt context. */
+void
+thread_tick (void)
+{
+ struct thread *t = thread_current ();
+
+ /* Update statistics. */
+ if (t == idle_thread)
+ idle_ticks++;
+#ifdef USERPROG
+ else if (t->pagedir != NULL)
+ user_ticks++;
+#endif
+ else
+ kernel_ticks++;
+
+ /* Enforce preemption. */
+ if (++thread_ticks >= TIME_SLICE)
+ intr_yield_on_return ();
+}
+
+/* Prints thread statistics. */
+void
+thread_print_stats (void)
+{
+ printf ("Thread: %lld idle ticks, %lld kernel ticks, %lld user ticks\n",
+ idle_ticks, kernel_ticks, user_ticks);
+}
+
+/* Creates a new kernel thread named NAME with the given initial
+ PRIORITY, which executes FUNCTION passing AUX as the argument,
+ and adds it to the ready queue. Returns the thread identifier
+ for the new thread, or TID_ERROR if creation fails.
+
+ If thread_start() has been called, then the new thread may be
+ scheduled before thread_create() returns. It could even exit
+ before thread_create() returns. Contrariwise, the original
+ thread may run for any amount of time before the new thread is
+ scheduled. Use a semaphore or some other form of
+ synchronization if you need to ensure ordering.
+
+ The code provided sets the new thread's `priority' member to
+ PRIORITY, but no actual priority scheduling is implemented.
+ Priority scheduling is the goal of Problem 1-3. */
+tid_t
+thread_create (const char *name, int priority,
+ thread_func *function, void *aux)