/* * This procedure removes all dead lwps from the linked list of all lwps. * It also creates linked list of ids if necessary. */ static void list_refresh(list_t *list) { lwp_info_t *lwp, *lwp_next; if (!(list->l_type & LT_LWPS)) return; for (lwp = list->l_head; lwp != NULL; ) { if (lwp->li_flags & LWP_ALIVE) { /* * Process all live LWPs. * When we're done, mark them as dead. * They will be marked "alive" on the next * /proc scan if they still exist. */ lwp->li_key = list_getkeyval(list, lwp); if (opts.o_outpmode & OPT_USERS) list_update(&users, lwp); if (opts.o_outpmode & OPT_TASKS) list_update(&tasks, lwp); if (opts.o_outpmode & OPT_PROJECTS) list_update(&projects, lwp); if (opts.o_outpmode & OPT_ZONES) list_update(&zones, lwp); lwp->li_flags &= ~LWP_ALIVE; lwp = lwp->li_next; } else { lwp_next = lwp->li_next; list_remove_lwp(&lwps, lwp); lwp = lwp_next; } } }
static void list_preinsert(list_t *list, void *ptr) { ulong_t k1, k2; if (list->l_used < list->l_size) { /* just add */ list_insert(list, ptr); return; } k1 = list_getkeyval(list, list->l_ptrs[list->l_used - 1]); k2 = list_getkeyval(list, ptr); if (compare_keys(list, k1, k2) >= 0) /* skip insertion */ return; k1 = list_getkeyval(list, list->l_ptrs[0]); if (compare_keys(list, k2, k1) >= 0) { /* add at the head */ list_insert(list, ptr); return; } list_insert(list, ptr); }
static void list_insert(list_t *list, void *ptr) { int i, j; long k1, k2; for (i = 0; i < list->l_used; i++) { /* insert in the middle */ k1 = list_getkeyval(list, ptr); k2 = list_getkeyval(list, list->l_ptrs[i]); if (compare_keys(list, k1, k2) >= 0) { for (j = list->l_used - 1; j >= i; j--) list->l_ptrs[j+1] = list->l_ptrs[j]; list->l_ptrs[i] = ptr; if (list->l_used < list->l_size) list->l_used++; return; } } if (i + 1 <= list->l_size) { /* insert at the tail */ list->l_ptrs[list->l_used] = ptr; list->l_used++; } }