goto post_threads;
marker = kmalloc(sizeof(struct thread), M_TEMP, M_WAITOK|M_ZERO);
+ marker->td_flags = TDF_MARKER;
error = 0;
for (n = 1; n <= ncpus; ++n) {
crit_enter();
TAILQ_INSERT_TAIL(&rgd->gd_tdallq, marker, td_allq);
- crit_exit();
while ((td = TAILQ_PREV(marker, lwkt_queue, td_allq)) != NULL) {
- crit_enter();
- if (td != TAILQ_PREV(marker, lwkt_queue, td_allq)) {
- crit_exit();
- continue;
- }
TAILQ_REMOVE(&rgd->gd_tdallq, marker, td_allq);
TAILQ_INSERT_BEFORE(td, marker, td_allq);
- lwkt_hold(td);
- crit_exit();
-
- if (td->td_flags & TDF_MARKER) {
- lwkt_rele(td);
+ if (td->td_flags & TDF_MARKER)
continue;
- }
- if (td->td_proc) {
- lwkt_rele(td);
+ if (td->td_proc)
continue;
- }
+
+ lwkt_hold(td);
+ crit_exit();
switch (oid) {
case KERN_PROC_PGRP:
break;
}
lwkt_rele(td);
+ crit_enter();
if (error)
break;
}
- crit_enter();
TAILQ_REMOVE(&rgd->gd_tdallq, marker, td_allq);
crit_exit();