#include <u.h>
#include <libc.h>
int mysyscall(int which);
#define TEMP "/n/temp"
struct info {
uvlong now;
int bytes;
};
struct info info [1048576];
char data[1048576];
void reader(int fd)
{
int i = 0, j;
int amt;
int pid = fork();
if (pid < 0)
sysfatal("fork: %r");
if (pid)
return;
while((amt = read(fd, data, sizeof data)) > 1) {
cycles(&info[i].now);
info[i].bytes = amt;
i++;
}
// for(j = 0; j < i; j++)
// print("%d %lld %d\n", j, info[j].now, info[j].bytes);
}
void usage(void)
{
sysfatal("usage: testwrite [-f]");
}
static char area[512];
void
main(int argc, char *argv[])
{
char *cmd, *f;
int fd0, fd1, ctl;
int res;
int i = 0, j;
int usefast = 0;
ARGBEGIN{
case 'f':
f = ARGF();
usefast = f ? atoi(f) : 512;
break;
default:
usage();
}ARGEND
print("argc %d\n", argc);
if(argc)
usage();
if(bind("#|", TEMP, MREPL) < 0)
sysfatal("bind pipe %s: %r", TEMP);
ctl = open(TEMP "/ctl", ORDWR);
if(ctl < 0)
sysfatal("open %s: %r", TEMP "/ctl");
fd0 = open(TEMP "/data", ORDWR);
if(fd0 < 0)
sysfatal("open %s: %r", TEMP "/data0");
fd1 = open(TEMP "/data1", ORDWR);
if(fd1 < 0)
sysfatal("open %s: %r", TEMP "/data1");
/* fork the kid, and let it sit there counting data */
reader(fd1);
cmd = smprint("fastwrite 256 %d 0x%p %d", fd0, area, sizeof(area));
print("%s\n", cmd);
res = write(ctl, cmd, strlen(cmd));
if (res < 0)
sysfatal("cmd %s: %r", cmd);
print("OK\n");
for(i = 0; i < 512; i++) {
write(fd0, data, 512);
cycles(&info[i].now);
info[i].bytes = 512;
}
for(; (i < 2*512) && usefast; i++) {
res = mysyscall(256);
if (res < 512)
sysfatal("cmd %s: %r", cmd);
cycles(&info[i].now);
info[i].bytes = 512;
}
write(fd0, data, 1);
print("Res is %d\n", res);
unmount(nil, TEMP);
for(j = 1; j < i; j++)
print("%d %lld %d\n", j, info[j].now - info[j-1].now, info[j].bytes);
exits(nil);
}
|