Random proc.cc clean up..

上级 d3427f08
...@@ -173,7 +173,6 @@ void finishproc(struct proc*); ...@@ -173,7 +173,6 @@ void finishproc(struct proc*);
void exit(void); void exit(void);
int fork(int); int fork(int);
int growproc(int); int growproc(int);
int kill(int);
void pinit(void); void pinit(void);
void procdumpall(void); void procdumpall(void);
void scheduler(void) __noret__; void scheduler(void) __noret__;
......
...@@ -41,7 +41,13 @@ struct mtrace_stacks { ...@@ -41,7 +41,13 @@ struct mtrace_stacks {
}; };
#endif #endif
enum procstate { EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE }; typedef enum procstate {
EMBRYO,
SLEEPING,
RUNNABLE,
RUNNING,
ZOMBIE
} procstate_t;;
// Per-process state // Per-process state
struct proc : public rcu_freed { struct proc : public rcu_freed {
...@@ -80,12 +86,14 @@ struct proc : public rcu_freed { ...@@ -80,12 +86,14 @@ struct proc : public rcu_freed {
LIST_ENTRY(proc) cv_sleep; // Linked list of processes sleeping on a cv LIST_ENTRY(proc) cv_sleep; // Linked list of processes sleeping on a cv
u64 user_fs_; u64 user_fs_;
virtual void do_gc(void) { delete this; }
void set_state(enum procstate s);
enum procstate get_state(void) const { return state_; }
int set_cpu_pin(int cpu);
static proc* alloc(); static proc* alloc();
void set_state(procstate_t s);
procstate_t get_state(void) const { return state_; }
int set_cpu_pin(int cpu);
static int kill(int pid);
int kill();
virtual void do_gc(void) { delete this; }
private: private:
proc(int npid); proc(int npid);
...@@ -94,5 +102,5 @@ private: ...@@ -94,5 +102,5 @@ private:
proc(const proc& x); proc(const proc& x);
NEW_DELETE_OPS(proc); NEW_DELETE_OPS(proc);
enum procstate state_; // Process state procstate_t state_; // Process state
}; };
...@@ -264,18 +264,11 @@ initproc(void) ...@@ -264,18 +264,11 @@ initproc(void)
// Process won't exit until it returns // Process won't exit until it returns
// to user space (see trap in trap.c). // to user space (see trap in trap.c).
int int
kill(int pid) proc::kill(void)
{ {
struct proc *p; acquire(&lock);
killed = 1;
p = xnspid->lookup(pid); if(get_state() == SLEEPING) {
if (p == 0) {
panic("kill");
return -1;
}
acquire(&p->lock);
p->killed = 1;
if(p->get_state() == SLEEPING){
// XXX // XXX
// we need to wake p up if it is cv_sleep()ing. // we need to wake p up if it is cv_sleep()ing.
// can't change p from SLEEPING to RUNNABLE since that // can't change p from SLEEPING to RUNNABLE since that
...@@ -287,10 +280,23 @@ kill(int pid) ...@@ -287,10 +280,23 @@ kill(int pid)
// cv might be deallocated while we're using it // cv might be deallocated while we're using it
// (pipes dynamically allocate condvars). // (pipes dynamically allocate condvars).
} }
release(&p->lock); release(&lock);
return 0; return 0;
} }
int
proc::kill(int pid)
{
struct proc *p;
p = xnspid->lookup(pid);
if (p == 0) {
panic("kill");
return -1;
}
return p->kill();
}
// Print a process listing to console. For debugging. // Print a process listing to console. For debugging.
// Runs when user types ^P on console. // Runs when user types ^P on console.
// No lock to avoid wedging a stuck machine further. // No lock to avoid wedging a stuck machine further.
......
...@@ -33,7 +33,7 @@ sys_wait(void) ...@@ -33,7 +33,7 @@ sys_wait(void)
long long
sys_kill(int pid) sys_kill(int pid)
{ {
return kill(pid); return proc::kill(pid);
} }
long long
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论