Change sys_sleep to sys_nsleep and related rejiggering

上级 72c2fe95
......@@ -8,10 +8,11 @@ int
main(int ac, char *av[])
{
if (ac != 2) {
fprintf(1, "Usage: %s ticks\n", av[0]);
fprintf(1, "Usage: %s seconds\n", av[0]);
exit();
}
sleep(atoi(av[1]));
u64 x = atoi(av[1])*1000000000ull;
nsleep(x);
exit();
}
......@@ -1372,7 +1372,7 @@ sbrktest(void)
sbrk((632 * 1024) - (uptr)sbrk(0));
write(fds[1], "x", 1);
// sit around until killed
for(;;) sleep(1000);
for(;;) nsleep(1000000000ull);
}
if(pids[i] != -1)
read(fds[0], &scratch, 1);
......@@ -1416,8 +1416,8 @@ validatetest(void)
fprintf(stdout, "validatetest failed (pipe succeeded)\n");
exit();
}
sleep(0);
sleep(0);
nsleep(0);
nsleep(0);
kill(pid);
wait();
......
......@@ -35,7 +35,7 @@ long sys_openat(int, const char*, int);
long sys_pipe(int*);
long sys_read(int, char*, int);
long sys_sbrk(int);
long sys_sleep(int);
long sys_nsleep(u64);
long sys_unlink(const char*);
long sys_wait(void);
long sys_write(int, char*, int);
......
......@@ -51,15 +51,13 @@ void bwrite(struct buf*);
void cgaputc(int c);
// condvar.c
extern u64 ticks;
extern struct spinlock tickslock;
extern struct condvar cv_ticks;
void initcondvar(struct condvar *, const char *);
void destroycondvar(struct condvar *);
void cv_sleep(struct condvar *cv, struct spinlock*);
void cv_sleepto(struct condvar *cv, struct spinlock*, u64);
void cv_wakeup(struct condvar *cv);
void cv_tick(void);
void timerintr(void);
u64 nsectime(void);
// console.c
void cprintf(const char*, ...) __attribute__((format(printf, 1, 2)));
......@@ -106,7 +104,6 @@ void dir_flush(struct inode *dp);
// hz.c
void microdelay(u64);
u64 nsectime(void);
void inithz(void);
// ide.c
......
......@@ -18,7 +18,7 @@
#define SYS_dup 17
#define SYS_getpid 18
#define SYS_sbrk 19
#define SYS_sleep 20
#define SYS_nsleep 20
#define SYS_uptime 21
#define SYS_map 22
#define SYS_unmap 23
......
......@@ -25,7 +25,7 @@ int chdir(const char*);
int dup(int);
int getpid(void);
char* sbrk(int);
int sleep(int);
int nsleep(u64);
int uptime(void);
int map(void *addr, int len);
int unmap(void *addr, int len);
......
......@@ -45,7 +45,7 @@ long (*syscalls[])(u64, u64, u64, u64, u64) = {
SYSCALL(pipe),
SYSCALL(read),
SYSCALL(sbrk),
SYSCALL(sleep),
SYSCALL(nsleep),
SYSCALL(unlink),
SYSCALL(wait),
SYSCALL(write),
......
......@@ -8,9 +8,7 @@
#include "proc.hh"
#include "cpu.hh"
struct spinlock tickslock __mpalign__;
struct condvar cv_ticks __mpalign__;
u64 ticks __mpalign__;
static u64 ticks __mpalign__;
LIST_HEAD(sleepers, proc) sleepers __mpalign__;
struct spinlock sleepers_lock;
......@@ -23,18 +21,22 @@ wakeup(struct proc *p)
addrun(p);
}
u64
nsectime(void)
{
u64 msec = ticks*QUANTUM;
return msec*1000000;
}
void
cv_tick(void)
timerintr(void)
{
struct proc *p, *tmp;
struct condvar *cv;
int again;
u64 now;
acquire(&tickslock);
ticks++;
cv_wakeup(&cv_ticks);
release(&tickslock);
now = nsectime();
again = 0;
......
......@@ -26,13 +26,6 @@ microdelay(u64 delay)
nop_pause();
}
u64
nsectime(void)
{
u64 msec = ticks*QUANTUM;
return msec*1000000;
}
void
inithz(void)
{
......
#include "crange_arch.hh"
#include "types.h"
#include "amd64.h"
#include "cpu.hh"
#include "rnd.hh"
struct seed {
......@@ -10,7 +12,7 @@ u64
rnd(void)
{
if (seeds[mycpu()->id].v == 0) {
seeds[mycpu()->id].v = ticks;
seeds[mycpu()->id].v = rdtsc();
}
seeds[mycpu()->id].v =
seeds[mycpu()->id].v * 6364136223846793005 + 1442695040888963407;
......
......@@ -55,20 +55,28 @@ sys_sbrk(int n)
}
long
sys_sleep(int n)
sys_nsleep(u64 nsec)
{
u32 ticks0;
acquire(&tickslock);
ticks0 = ticks;
while(ticks - ticks0 < n){
if(myproc()->killed){
release(&tickslock);
struct spinlock lock;
struct condvar cv;
u64 nsecto;
initlock(&lock, "sleep_lock", 0);
initcondvar(&cv, "sleep_cv");
acquire(&lock);
auto cleanup = scoped_cleanup([&lock, &cv]() {
release(&lock);
destroycondvar(&cv);
destroylock(&lock);
});
nsecto = nsectime()+nsec;
while (nsecto > nsectime()) {
if (myproc()->killed)
return -1;
}
cv_sleep(&cv_ticks, &tickslock);
cv_sleepto(&cv, &lock, nsecto);
}
release(&tickslock);
return 0;
}
......@@ -77,12 +85,7 @@ sys_sleep(int n)
long
sys_uptime(void)
{
u64 xticks;
acquire(&tickslock);
xticks = ticks;
release(&tickslock);
return xticks;
return nsectime();
}
long
......
......@@ -127,7 +127,7 @@ trap(struct trapframe *tf)
mycpu()->timer_printpc = 0;
}
if (mycpu()->id == 0)
cv_tick();
timerintr();
lapiceoi();
break;
case T_IRQ0 + IRQ_IDE:
......
......@@ -35,7 +35,7 @@ SYSCALL(chdir)
SYSCALL(dup)
SYSCALL(getpid)
SYSCALL(sbrk)
SYSCALL(sleep)
SYSCALL(nsleep)
SYSCALL(uptime)
SYSCALL(map)
SYSCALL(unmap)
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论