Exemple #1
0
void		add_by_address_list(t_chunk *chunk, t_chunk **list, t_chunk **tail)
{
  t_chunk	*tmp;
  int		flag;

  tmp = ((chunk - (*list)) > ((*tail) - chunk)) ? (*tail) : (*list);
  flag = ((chunk - (*list)) > ((*tail) - chunk)) ? 1 : 0;
  if (!tmp || (*tail) < chunk)
      return (add_tail_list(chunk, list, tail));
  while (tmp)
    {
      if (chunk < tmp
	  && (!tmp->prev || (tmp->prev) < chunk))
	{
	  chunk->next = tmp;
	  chunk->prev = tmp->prev;
	  if (tmp->prev)
	    (tmp->prev)->next = chunk;
	  tmp->prev = chunk;
	  if (!chunk->prev)
	      (*list) = chunk;
	  return;
	}
      tmp = (!flag) ? tmp->next : tmp->prev;
    }
  return (add_tail_list(chunk, list, tail));
}
Exemple #2
0
static void
olock_free(resource *r)
{
  struct object_lock *q, *l = (struct object_lock *) r;
  node *n;

  DBG("olock: Freeing %p\n", l);
  switch (l->state)
    {
    case OLOCK_STATE_FREE:
      break;
    case OLOCK_STATE_LOCKED:
    case OLOCK_STATE_EVENT:
      rem_node(&l->n);
      n = HEAD(l->waiters);
      if (n->next)
	{
	  DBG("olock: -> %p becomes locked\n", n);
	  q = SKIP_BACK(struct object_lock, n, n);
	  rem_node(n);
	  add_tail_list(&q->waiters, &l->waiters);
	  q->state = OLOCK_STATE_EVENT;
	  add_head(&olock_list, n);
	  ev_schedule(olock_event);
	}
      break;
    case OLOCK_STATE_WAITING:
      rem_node(&l->n);
      break;
    default:
      ASSERT(0);
    }
Exemple #3
0
/**
 * ev_run_list - run an event list
 * @l: an event list
 *
 * This function calls ev_run() for all events enqueued in the list @l.
 */
int
ev_run_list(event_list *l)
{
  node *n;
  list tmp_list;

  init_list(&tmp_list);
  add_tail_list(&tmp_list, l);
  init_list(l);
  WALK_LIST_FIRST(n, tmp_list)
    {
      event *e = SKIP_BACK(event, n, n);
      ev_run(e);
    }