提交 df025c79 创建 作者: Robert Morris's avatar Robert Morris

start at a shell that will someday run stuff intelligently in parallel

上级 fb099945
...@@ -24,6 +24,7 @@ UPROGS= \ ...@@ -24,6 +24,7 @@ UPROGS= \
scripttest \ scripttest \
ftest \ ftest \
wqsh \ wqsh \
cp \
perf \ perf \
xls xls
# pdu # pdu
......
#include "types.h"
#include "user.h"
#include "fcntl.h"
int
main(int argc, char *argv[])
{
if(argc != 3){
printf("Usage: cp fromfile tofile\n");
exit();
}
int fd1 = open(argv[1], 0);
if(fd1 < 0){
printf("cp: cannot open %s\n", argv[1]);
exit();
}
int fd2 = open(argv[2], O_CREATE|O_WRONLY);
if(fd2 < 0){
printf("cp: cannot create %s\n", argv[2]);
exit();
}
int n;
char buf[512];
while((n = read(fd1, buf, sizeof(buf))) > 0){
if(write(fd2, buf, n) != n){
printf("cp: write failed\n");
exit();
}
}
exit();
}
#include "types.h" #include "types.h"
#include "user.h" #include "user.h"
#include "fcntl.h" #include "fcntl.h"
#include "wq.hh"
class thing { class thing {
protected:
int done;
public: public:
static void * operator new(unsigned long n){ static void * operator new(unsigned long n){
return malloc(n); return malloc(n);
...@@ -10,38 +13,45 @@ public: ...@@ -10,38 +13,45 @@ public:
static void operator delete(void *p){ static void operator delete(void *p){
free(p); free(p);
} }
virtual void print(); thing() { done = 0; }
virtual ~thing();
virtual void print() = 0;
virtual void run() = 0;
int checkdone() { return done; }
}; };
class cmd : public thing { class cmd : public thing {
public: private:
cmd();
virtual ~cmd();
int argc; int argc;
char *argv[20]; char *argv[20];
public:
cmd() { argc = 0; }
void print(); void print();
void run();
static cmd *parse(); static cmd *parse();
}; };
class sequence : public thing { class sequence : public thing {
public: private:
sequence();
virtual ~sequence();
int n; int n;
class cmd *a[20]; class cmd *a[20];
public:
sequence() { n = 0; }
void print(); void print();
void run();
static sequence *parse(); static sequence *parse();
}; };
cmd::cmd() thing::~thing()
{ {
argc = 0;
} }
cmd::~cmd() int
isspace(char c)
{ {
return c == ' ' || c == '\t' || c == '\n' || c == '\r';
} }
cmd * cmd *
...@@ -55,7 +65,7 @@ cmd::parse() ...@@ -55,7 +65,7 @@ cmd::parse()
cmd *c = new cmd(); cmd *c = new cmd();
for(int i = 0; buf[i]; ){ for(int i = 0; buf[i]; ){
int j; int j;
for(j = i; buf[j] && buf[j] != ' '; j++) for(j = i; buf[j] && !isspace(buf[j]); j++)
; ;
char *p = (char *) malloc(j - i + 1); char *p = (char *) malloc(j - i + 1);
...@@ -65,7 +75,7 @@ cmd::parse() ...@@ -65,7 +75,7 @@ cmd::parse()
assert(c->argc < 20); assert(c->argc < 20);
c->argv[c->argc++] = p; c->argv[c->argc++] = p;
while(buf[j] == ' ') while(isspace(buf[j]))
j++; j++;
i = j; i = j;
} }
...@@ -73,6 +83,25 @@ cmd::parse() ...@@ -73,6 +83,25 @@ cmd::parse()
} }
void void
cmd::run()
{
int pid = fork(0);
if(pid < 0){
printf("fork failed\n");
exit();
}
if(pid == 0){
argv[argc] = 0;
exec(argv[0], (const char **) argv);
printf("exec failed\n");
exit();
} else {
wait();
done = 1;
}
}
void
cmd::print() cmd::print()
{ {
for(int i = 0; i < argc; i++) for(int i = 0; i < argc; i++)
...@@ -80,15 +109,6 @@ cmd::print() ...@@ -80,15 +109,6 @@ cmd::print()
printf("\n"); printf("\n");
} }
sequence::sequence()
{
n = 0;
}
sequence::~sequence()
{
}
sequence * sequence *
sequence::parse() sequence::parse()
{ {
...@@ -103,6 +123,36 @@ sequence::parse() ...@@ -103,6 +123,36 @@ sequence::parse()
} }
void void
blah(void *x)
{
thing *t = (thing *) x;
t->run();
}
void
sequence::run()
{
for(int i = 0; i < n; i++){
cwork *w = new cwork();
w->rip = (void*) blah;
w->arg0 = a[i];
wq_push(w);
}
while(1){
int do_more = 0;
for(int i = 0; i < n; i++){
if(a[i]->checkdone() == 0){
do_more += 1;
}
}
if(do_more == 0)
break;
wq_trywork();
}
done = 1;
}
void
sequence::print() sequence::print()
{ {
for(int i = 0; i < n; i++) for(int i = 0; i < n; i++)
...@@ -112,8 +162,9 @@ sequence::print() ...@@ -112,8 +162,9 @@ sequence::print()
int int
main(void) main(void)
{ {
initwq();
sequence *s = sequence::parse(); sequence *s = sequence::parse();
if(s){ if(s){
s->print(); s->run();
} }
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论