exit_process() source code based on Contiki's source code
| Line# | Code |
| 123 | static void |
| 124 | exit_process(struct process *p, struct process *fromprocess) |
| 125 | { |
| 126 | register struct process *q; |
| 127 | struct process *old_current = process_current; |
| 128 | |
| 129 | PRINTF("process: exit_process '%s'\n", PROCESS_NAME_STRING(p)); |
| 130 | |
| 131 | /* Make sure the process is in the process list before we try to |
| 132 | exit it. */ |
| 133 | for(q = process_list; q != p && q != NULL; q = q->next); |
| 134 | if(q == NULL) { |
| 135 | return; |
| 136 | } |
| 137 | |
| 138 | if(process_is_running(p)) { |
| 139 | /* Process was running */ |
| 140 | p->state = PROCESS_STATE_NONE; |
| 141 | |
| 142 | /* |
| 143 | * Post a synchronous event to all processes to inform them that |
| 144 | * this process is about to exit. This will allow services to |
| 145 | * deallocate state associated with this process. |
| 146 | */ |
| 147 | for(q = process_list; q != NULL; q = q->next) { |
| 148 | if(p != q) { |
| 149 | call_process(q, PROCESS_EVENT_EXITED, (process_data_t)p); |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | if(p->thread != NULL && p != fromprocess) { |
| 154 | /* Post the exit event to the process that is about to exit. */ |
| 155 | process_current = p; |
| 156 | p->thread(&p->pt, PROCESS_EVENT_EXIT, NULL); |
| 157 | } |
| 158 | } |
| 159 | |
| 160 | if(p == process_list) { |
| 161 | process_list = process_list->next; |
| 162 | } else { |
| 163 | for(q = process_list; q != NULL; q = q->next) { |
| 164 | if(q->next == p) { |
| 165 | q->next = p->next; |
| 166 | break; |
| 167 | } |
| 168 | } |
| 169 | } |
| 170 | receiver->state = PROCESS_STATE_RUNNING; |
| 171 | process_current = old_current; |
| 172 | } |