#include "sched.h"
#include "proc_struct.h"
#include <alarm.h>
#include <asm.h>
#include <enums.h>
#include <stddef.h>
static void wake_up(struct alarm_struct *alarm)
{
int intr;
struct proc_struct *proc;
disable_intr(intr);
proc = (void *)alarm - offsetof(struct proc_struct, alarm);
proc->state = PS_RUNNING;
proc->unslept = 0;
sched_add(proc);
restore_intr(intr);
}
void sleep_init(struct proc_struct *proc)
{
alarm_init(&proc->alarm, wake_up);
}
unsigned long sleep(unsigned long milliseconds)
{
int retval;
int intr;
disable_intr(intr);
sched_remove(current);
current->state = PS_SLEEPING;
alarm_set(¤t->alarm, milliseconds);
schedule();
retval = current->unslept;
restore_intr(intr);
return retval;
}
void sleep_interrupt(struct proc_struct *proc)
{
int intr;
unsigned long unslept;
disable_intr(intr);
unslept = alarm_unset(&proc->alarm);
proc->state = PS_RUNNING;
proc->unslept = unslept;
sched_add(proc);
restore_intr(intr);
}