Yes, it is a school assignment.
I found the following, which I believe must be close to what's required but I don't fully understand what the following piece of code does. I don't know what's missing there. I don't understand where the sychronization should take place and how. If you can give me a brief explanation I'd really appreciate it. Thank you.
http://www.koders.com/java/fid22FAD8...%3asemap*.java
Code:
package nachos.threads;
import nachos.machine.*;
/**
* Uses the hardware timer to provide preemption, and to allow threads to sleep
* until a certain time.
*/
public class Alarm {
/**
* Allocate a new Alarm. Set the machine's timer interrupt handler to this
* alarm's callback.
*
* <p><b>Note</b>: Nachos will not function correctly with more than one
* alarm.
*/
public Alarm() {
Machine.timer().setInterruptHandler(new Runnable() {
public void run() { timerInterrupt(); }
});
}
/**
* The timer interrupt handler. This is called by the machine's timer
* periodically (approximately every 500 clock ticks). Causes the current
* thread to yield, forcing a context switch if there is another thread
* that should be run.
*/
public void timerInterrupt() {
KThread.currentThread().yield();
}
/**
* Put the current thread to sleep for at least <i>x</i> ticks,
* waking it up in the timer interrupt handler. The thread must be
* woken up (placed in the scheduler ready set) during the first timer
* interrupt where
*
* <p><blockquote>
* (current time) >= (WaitUntil called time)+(x)
* </blockquote>
*
* @param x the minimum number of clock ticks to wait.
*
* @see nachos.machine.Timer#getTime()
*/
public void waitUntil(long x) {
// for now, cheat just to get something working (busy waiting is bad)
long wakeTime = Machine.timer().getTime() + x;
while (wakeTime > Machine.timer().getTime())
KThread.yield();
}
}
Bookmarks