projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
random: Fix behavior of kernel option "-rs".
[pintos-anon]
/
src
/
threads
/
thread.c
diff --git
a/src/threads/thread.c
b/src/threads/thread.c
index 2532463bdbbf5d8f2544cba0b590ae070d2d07e1..87f22b80607b4faba8ae2b1e9f93dc5d6659d8cc 100644
(file)
--- a/
src/threads/thread.c
+++ b/
src/threads/thread.c
@@
-68,7
+68,7
@@
static void init_thread (struct thread *, const char *name, int priority);
static bool is_thread (struct thread *) UNUSED;
static void *alloc_frame (struct thread *, size_t size);
static void schedule (void);
static bool is_thread (struct thread *) UNUSED;
static void *alloc_frame (struct thread *, size_t size);
static void schedule (void);
-void schedule_tail (struct thread *prev);
+void
thread_
schedule_tail (struct thread *prev);
static tid_t allocate_tid (void);
/* Initializes the threading system by transforming the code
static tid_t allocate_tid (void);
/* Initializes the threading system by transforming the code
@@
-171,7
+171,6
@@
thread_create (const char *name, int priority,
struct switch_entry_frame *ef;
struct switch_threads_frame *sf;
tid_t tid;
struct switch_entry_frame *ef;
struct switch_threads_frame *sf;
tid_t tid;
- enum intr_level old_level;
ASSERT (function != NULL);
ASSERT (function != NULL);
@@
-184,11
+183,6
@@
thread_create (const char *name, int priority,
init_thread (t, name, priority);
tid = t->tid = allocate_tid ();
init_thread (t, name, priority);
tid = t->tid = allocate_tid ();
- /* Prepare thread for first run by initializing its stack.
- Do this atomically so intermediate values for the 'stack'
- member cannot be observed. */
- old_level = intr_disable ();
-
/* Stack frame for kernel_thread(). */
kf = alloc_frame (t, sizeof *kf);
kf->eip = NULL;
/* Stack frame for kernel_thread(). */
kf = alloc_frame (t, sizeof *kf);
kf->eip = NULL;
@@
-204,8
+198,6
@@
thread_create (const char *name, int priority,
sf->eip = switch_entry;
sf->ebp = 0;
sf->eip = switch_entry;
sf->ebp = 0;
- intr_set_level (old_level);
-
/* Add to run queue. */
thread_unblock (t);
/* Add to run queue. */
thread_unblock (t);
@@
-296,7
+288,7
@@
thread_exit (void)
/* Remove thread from all threads list, set our status to dying,
and schedule another process. That process will destroy us
/* Remove thread from all threads list, set our status to dying,
and schedule another process. That process will destroy us
- when it call
schedule_tail(). */
+ when it call
s thread_
schedule_tail(). */
intr_disable ();
list_remove (&thread_current()->allelem);
thread_current ()->status = THREAD_DYING;
intr_disable ();
list_remove (&thread_current()->allelem);
thread_current ()->status = THREAD_DYING;
@@
-459,6
+451,8
@@
is_thread (struct thread *t)
static void
init_thread (struct thread *t, const char *name, int priority)
{
static void
init_thread (struct thread *t, const char *name, int priority)
{
+ enum intr_level old_level;
+
ASSERT (t != NULL);
ASSERT (PRI_MIN <= priority && priority <= PRI_MAX);
ASSERT (name != NULL);
ASSERT (t != NULL);
ASSERT (PRI_MIN <= priority && priority <= PRI_MAX);
ASSERT (name != NULL);
@@
-469,7
+463,10
@@
init_thread (struct thread *t, const char *name, int priority)
t->stack = (uint8_t *) t + PGSIZE;
t->priority = priority;
t->magic = THREAD_MAGIC;
t->stack = (uint8_t *) t + PGSIZE;
t->priority = priority;
t->magic = THREAD_MAGIC;
+
+ old_level = intr_disable ();
list_push_back (&all_list, &t->allelem);
list_push_back (&all_list, &t->allelem);
+ intr_set_level (old_level);
}
/* Allocates a SIZE-byte frame at the top of thread T's stack and
}
/* Allocates a SIZE-byte frame at the top of thread T's stack and
@@
-516,7
+513,7
@@
next_thread_to_run (void)
After this function and its caller returns, the thread switch
is complete. */
void
After this function and its caller returns, the thread switch
is complete. */
void
-schedule_tail (struct thread *prev)
+thread_schedule_tail (struct thread *prev)
{
struct thread *cur = running_thread ();
{
struct thread *cur = running_thread ();
@@
-550,8
+547,8
@@
schedule_tail (struct thread *prev)
running to some other state. This function finds another
thread to run and switches to it.
running to some other state. This function finds another
thread to run and switches to it.
- It's not safe to call printf() until
schedule_tail() has
- completed. */
+ It's not safe to call printf() until
thread_schedule_tail()
+
has
completed. */
static void
schedule (void)
{
static void
schedule (void)
{
@@
-565,7
+562,7
@@
schedule (void)
if (cur != next)
prev = switch_threads (cur, next);
if (cur != next)
prev = switch_threads (cur, next);
- schedule_tail (prev);
+ thread_schedule_tail (prev);
}
/* Returns a tid to use for a new thread. */
}
/* Returns a tid to use for a new thread. */