Fixes when we add a new proc to the pidhash
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 17 Aug 2010 18:09:51 +0000 (11:09 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:51 +0000 (17:35 -0700)
Not all code paths use proc_create(), etc.

kern/include/process.h
kern/src/process.c
kern/src/syscall.c

index d125b1f..3a40339 100644 (file)
@@ -71,6 +71,7 @@ void proc_init_procinfo(struct proc *p);
 
 /* Process management: */
 error_t proc_alloc(struct proc **pp, struct proc *parent);
+void __proc_ready(struct proc *p);
 struct proc *proc_create(struct file *prog, char **argv, char **envp);
 int __proc_set_state(struct proc *p, uint32_t state) WRITES(p->state);
 struct proc *pid2proc(pid_t pid);
index 0e0100f..d7624e4 100644 (file)
@@ -290,7 +290,7 @@ error_t proc_alloc(struct proc **pp, struct proc *parent)
        spinlock_init(&p->proc_lock);
        p->exitcode = 0;
        p->ppid = parent ? parent->pid : 0;
-       p->state = PROC_CREATED; // shouldn't go through state machine for init
+       p->state = PROC_CREATED; /* shouldn't go through state machine for init */
        p->env_flags = 0;
        p->env_entry = 0; // cheating.  this really gets set later
        p->procinfo->heap_bottom = (void*)UTEXT;
@@ -340,16 +340,25 @@ error_t proc_alloc(struct proc **pp, struct proc *parent)
        for (int i = 0; i < 3; i++)
                SET_BITMASK_BIT(p->open_files.open_fds->fds_bits, i);
 
-       *pp = p;
        atomic_inc(&num_envs);
-
        frontend_proc_init(p);
-
        printd("[%08x] new process %08x\n", current ? current->pid : 0, p->pid);
        } // INIT_STRUCT
+       *pp = p;
        return 0;
 }
 
+/* We have a bunch of different ways to make processes.  Call this once the
+ * process is ready to be used by the rest of the system.  For now, this just
+ * means when it is ready to be named via the pidhash.  In the future, we might
+ * push setting the state to CREATED into here. */
+void __proc_ready(struct proc *p)
+{
+       spin_lock(&pid_hash_lock);
+       hashtable_insert(pid_hash, (void*)p->pid, p);
+       spin_unlock(&pid_hash_lock);
+}
+
 /* Creates a process from the specified file, argvs, and envps.  Tempted to get
  * rid of proc_alloc's style, but it is so quaint... */
 struct proc *proc_create(struct file *prog, char **argv, char **envp)
@@ -360,11 +369,7 @@ struct proc *proc_create(struct file *prog, char **argv, char **envp)
                panic("proc_create: %e", r);    /* one of 3 quaint usages of %e */
        procinfo_pack_args(p->procinfo, argv, envp);
        assert(load_elf(p, prog) == 0);
-       
-       // only insert into the global hashtable after all thei initialization is done
-       spin_lock(&pid_hash_lock);
-       hashtable_insert(pid_hash, (void*)p->pid, p);
-       spin_unlock(&pid_hash_lock);
+       __proc_ready(p);
        return p;
 }
 
index 8acfa8e..194252e 100644 (file)
@@ -230,6 +230,7 @@ static int sys_proc_create(struct proc *p, char *path, size_t path_l,
        if (load_elf(new_p, program))
                goto late_error;
        kref_put(&program->f_kref);
+       __proc_ready(new_p);
        pid = new_p->pid;
        kref_put(&new_p->kref); /* give up the reference created in proc_create() */
        return pid;
@@ -372,6 +373,7 @@ static ssize_t sys_fork(env_t* e)
                return -1;
        }
        clone_files(&e->open_files, &env->open_files);
+       __proc_ready(env);
        __proc_set_state(env, PROC_RUNNABLE_S);
        schedule_proc(env);