struct pbsnode *find_fitting_node( struct prop *needed) { struct pbsnode *pnode = NULL; login_node *ln; login_node *ordered_ln; int iter = -1; int ordered_iter; int index; resizable_array *ordered = initialize_resizable_array(logins.ra->num + 1); /* create a sorted list of the logins */ while ((ln = (login_node *)next_thing(logins.ra, &iter)) != NULL) { /* if ordered is empty just insert without attempting to sort */ if (ordered->num == 0) insert_thing(ordered, ln); else { ordered_iter = -1; index = ordered->slots[ALWAYS_EMPTY_INDEX].next; while ((ordered_ln = (login_node *)next_thing(ordered, &ordered_iter)) != NULL) { if (ln->times_used <= ordered_ln->times_used) { insert_thing_before(ordered, ln, index); break; } index = ordered_iter; } /* insert if it hasn't been inserted yet */ if (ordered_ln == NULL) insert_thing(ordered, ln); } } iter = -1; while ((ln = (login_node *)next_thing(ordered, &iter)) != NULL) { if ((pnode = check_node(ln, needed)) != NULL) { ln->times_used++; free_resizable_array(ordered); return(pnode); } } free_resizable_array(ordered); return(NULL); } /* END find_fitting_node() */
int insert_task_before( all_tasks *at, work_task *before, work_task *after) { int rc; int i; if (pthread_mutex_trylock(at->alltasks_mutex)) { pthread_mutex_unlock(after->wt_mutex); pthread_mutex_lock(at->alltasks_mutex); pthread_mutex_lock(after->wt_mutex); } if (after->wt_being_recycled == TRUE) { pthread_mutex_unlock(after->wt_mutex); pthread_mutex_unlock(at->alltasks_mutex); return(AFTER_IS_BEING_RECYCLED); } i = get_index(at->ra,after); if (i == THING_NOT_FOUND) { rc = i; } else { if ((rc = insert_thing_before(at->ra,before,i)) == -1) { rc = ENOMEM; log_err(rc, __func__, "Cannot allocate space to resize the array"); } else rc = PBSE_NONE; } pthread_mutex_unlock(at->alltasks_mutex); before->wt_tasklist = at; return(rc); } /* insert_task_before() */