예제 #1
0
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() */
예제 #2
0
파일: svr_task.c 프로젝트: gto11520/torque
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() */