1 /* The main thread acquires a lock. Then it creates two
2 higher-priority threads that block acquiring the lock, causing
3 them to donate their priorities to the main thread. When the
4 main thread releases the lock, the other threads should
5 acquire it in priority order.
7 Based on a test originally submitted for Stanford's CS 140 in
8 winter 1999 by Matt Franklin <startled@leland.stanford.edu>,
9 Greg Hutchins <gmh@leland.stanford.edu>, Yu Ping Hu
10 <yph@cs.stanford.edu>. Modified by arens. */
13 #include "tests/threads/tests.h"
14 #include "threads/init.h"
15 #include "threads/synch.h"
16 #include "threads/thread.h"
18 static thread_func acquire1_thread_func;
19 static thread_func acquire2_thread_func;
22 test_priority_donate_one (void)
26 /* This test does not work with the MLFQS. */
27 ASSERT (!enable_mlfqs);
29 /* Make sure our priority is the default. */
30 ASSERT (thread_get_priority () == PRI_DEFAULT);
34 thread_create ("acquire1", PRI_DEFAULT + 1, acquire1_thread_func, &lock);
35 msg ("This thread should have priority %d. Actual priority: %d.",
36 PRI_DEFAULT + 1, thread_get_priority ());
37 thread_create ("acquire2", PRI_DEFAULT + 2, acquire2_thread_func, &lock);
38 msg ("This thread should have priority %d. Actual priority: %d.",
39 PRI_DEFAULT + 2, thread_get_priority ());
41 msg ("acquire2, acquire1 must already have finished, in that order.");
42 msg ("This should be the last line before finishing this test.");
46 acquire1_thread_func (void *lock_)
48 struct lock *lock = lock_;
51 msg ("acquire1: got the lock");
53 msg ("acquire1: done");
57 acquire2_thread_func (void *lock_)
59 struct lock *lock = lock_;
62 msg ("acquire2: got the lock");
64 msg ("acquire2: done");