Change sys_sleep to sys_nsleep and related rejiggering

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