Process state work, initial steps
[akaros.git] / kern / src / process.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  */
6
7 #include <process.h>
8 #include <atomic.h>
9 #include <assert.h>
10
11 /*
12  * While this could be done with just an assignment, this gives us the
13  * opportunity to check for bad transitions.  Might compile these out later, so
14  * we shouldn't rely on them for sanity checking from userspace.
15  */
16 int proc_set_state(struct proc *p, proc_state_t state)
17 {
18         proc_state_t curstate = p->state;
19         /* Valid transitions:
20          * C   -> RBS
21          * RBS -> RGS
22          * RGS -> RBS
23          * RGS -> W
24          * W   -> RBS
25          * RGS -> RBM
26          * RBM -> RGM
27          * RGM -> RBM
28          * RGM -> RBS
29          * RGS -> D
30          * RGM -> D
31          * 
32          * These ought to be implemented later
33          * RBS -> D
34          * RBM -> D
35          */
36         #if 1 // some sort of correctness flag
37         switch (curstate) {
38                 case PROC_CREATED:
39                         if (state != PROC_RUNNABLE_S)
40                                 panic("Invalid State Transition! PROC_CREATED to %d", state);
41                         break;
42                 case PROC_RUNNABLE_S:
43                         if (state != PROC_RUNNING_S && state != PROC_DYING)
44                                 panic("Invalid State Transition! PROC_RUNNABLE_S to %d", state);
45                         break;
46                 case PROC_RUNNING_S:
47                         if (state != PROC_RUNNABLE_S && state != PROC_RUNNABLE_M &&
48                             state != PROC_WAITING && state != PROC_DYING)
49                                 panic("Invalid State Transition! PROC_RUNNING_S to %d", state);
50                         break;
51                 case PROC_WAITING:
52                         if (state != PROC_RUNNABLE_S)
53                                 panic("Invalid State Transition! PROC_WAITING to %d", state);
54                         break;
55                 case PROC_DYING:
56                         if (state != PROC_CREATED) // when it is reused
57                                 panic("Invalid State Transition! PROC_DYING to %d", state);
58                         break;
59                 case PROC_RUNNABLE_M:
60                         if (state != PROC_RUNNING_M && state != PROC_DYING)
61                                 panic("Invalid State Transition! PROC_RUNNABLE_M to %d", state);
62                         break;
63                 case PROC_RUNNING_M:
64                         if (state != PROC_RUNNABLE_S && state != PROC_RUNNABLE_M &&
65                             state != PROC_DYING)
66                                 panic("Invalid State Transition! PROC_RUNNING_M to %d", state);
67                         break;
68         }
69         #endif
70         p->state = state;
71         return 0;
72 }
73
74 /* Change this when we aren't using an array */
75 struct proc *get_proc(unsigned pid)
76 {
77         // should have some error checking when we do this for real
78         return &envs[ENVX(pid)];
79 }
80
81 /* Whether or not actor can control target */
82 bool proc_controls(struct proc *actor, struct proc *target)
83 {
84         return target->env_parent_id == actor->env_id;
85 }