/* Tests that cond_signal() wakes up the highest-priority thread
waiting in cond_wait(). */
#include
#include “tests/threads/tests.h”
#include “threads/init.h”
#include “threads/malloc.h”
#include “threads/condvar.h”
#include “threads/lock.h”
#include “threads/thread.h”
#include “devices/timer.h”
static thread_func priority_condvar_thread;
static struct lock lock;
static struct condvar condvar;
void
test_priority_condvar(void)
{
int i;
/* This test does not work with the MLFQS. */
ASSERT(!thread_mlfqs);
lock_init(&lock);
condvar_init(&condvar);
thread_set_priority(PRI_MIN);
for (i = 0; i < 10; i++) {
int priority = PRI_DEFAULT - (i + 7) % 10 - 1;
char name[16];
snprintf(name, sizeof name, "priority %d", priority);
thread_create(name, priority, priority_condvar_thread, NULL);
}
for (i = 0; i < 10; i++) {
lock_acquire(&lock);
msg("Signaling...");
condvar_signal(&condvar, &lock);
lock_release(&lock);
}
}
static void
priority_condvar_thread(void *aux UNUSED)
{
msg("Thread %s starting.", thread_name());
lock_acquire(&lock);
condvar_wait(&condvar, &lock);
msg("Thread %s woke up.", thread_name());
lock_release(&lock);
}