intr_set_level (old_level);
}
-@@ -200,6 +218,23 @@ lock_acquire (struct lock *lock)
+@@ -200,8 +218,29 @@ lock_acquire (struct lock *lock)
+ lock_acquire (struct lock *lock)
+ {
++ enum intr_level old_level;
++
+ ASSERT (lock != NULL);
+ ASSERT (!intr_context ());
ASSERT (!lock_held_by_current_thread (lock));
- old_level = intr_disable ();
++ old_level = intr_disable ();
+
+ if (lock->holder != NULL)
+ {
+
sema_down (&lock->semaphore);
lock->holder = thread_current ();
- intr_set_level (old_level);
-@@ -238,13 +273,37 @@ void
++ intr_set_level (old_level);
+@@ -238,9 +273,37 @@ void
lock_release (struct lock *lock)
{
- enum intr_level old_level;
++ enum intr_level old_level;
+ struct thread *t = thread_current ();
+ struct list_elem *e;
-
++
ASSERT (lock != NULL);
ASSERT (lock_held_by_current_thread (lock));
- old_level = intr_disable ();
++ old_level = intr_disable ();
+
+ /* Return donations to threads that want this lock. */
+ for (e = list_begin (&t->donors); e != list_end (&t->donors); )
+ thread_recompute_priority (t);
+ thread_yield_to_higher_priority ();
+
- intr_set_level (old_level);
++ intr_set_level (old_level);
}
@@ -264,6 +323,7 @@ struct semaphore_elem