| 3299 | } |
| 3300 | |
| 3301 | void |
| 3302 | resume_all_proc(void) |
| 3303 | { |
| 3304 | struct proc *cp, *p; |
| 3305 | |
| 3306 | cp = curproc; |
| 3307 | sx_xlock(&allproc_lock); |
| 3308 | again: |
| 3309 | LIST_REMOVE(cp, p_list); |
| 3310 | LIST_INSERT_HEAD(&allproc, cp, p_list); |
| 3311 | for (;;) { |
| 3312 | p = LIST_NEXT(cp, p_list); |
| 3313 | if (p == NULL) |
| 3314 | break; |
| 3315 | LIST_REMOVE(cp, p_list); |
| 3316 | LIST_INSERT_AFTER(p, cp, p_list); |
| 3317 | PROC_LOCK(p); |
| 3318 | if ((p->p_flag & P_TOTAL_STOP) != 0) { |
| 3319 | sx_xunlock(&allproc_lock); |
| 3320 | _PHOLD(p); |
| 3321 | thread_single_end(p, SINGLE_ALLPROC); |
| 3322 | _PRELE(p); |
| 3323 | PROC_UNLOCK(p); |
| 3324 | sx_xlock(&allproc_lock); |
| 3325 | } else { |
| 3326 | PROC_UNLOCK(p); |
| 3327 | } |
| 3328 | } |
| 3329 | /* Did the loop above missed any stopped process ? */ |
| 3330 | FOREACH_PROC_IN_SYSTEM(p) { |
| 3331 | /* No need for proc lock. */ |
| 3332 | if ((p->p_flag & P_TOTAL_STOP) != 0) |
| 3333 | goto again; |
| 3334 | } |
| 3335 | sx_xunlock(&allproc_lock); |
| 3336 | } |
| 3337 | |
| 3338 | /* #define TOTAL_STOP_DEBUG 1 */ |
| 3339 | #ifdef TOTAL_STOP_DEBUG |
no test coverage detected