示例#1
0
static void
process_references (struct ipa_ref_list *list,
		    symtab_node *first,
		    bool before_inlining_p,
		    struct pointer_set_t *reachable)
{
  int i;
  struct ipa_ref *ref;
  for (i = 0; ipa_ref_list_reference_iterate (list, i, ref); i++)
    {
      if (is_a <cgraph_node> (ref->referred))
	{
	  struct cgraph_node *node = ipa_ref_node (ref);

	  if (node->analyzed
	      && (!DECL_EXTERNAL (node->symbol.decl)
		  || node->alias
	          || before_inlining_p))
	    pointer_set_insert (reachable, node);
	  enqueue_node ((symtab_node) node, first, reachable);
	}
      else
	{
	  struct varpool_node *node = ipa_ref_varpool_node (ref);

	  if (node->analyzed
	      && (!DECL_EXTERNAL (node->symbol.decl)
		  || node->alias
		  || before_inlining_p))
	    pointer_set_insert (reachable, node);
	  enqueue_node ((symtab_node) node, first, reachable);
	}
    }
}
strict_fibonacci_node* pq_insert( strict_fibonacci_heap *queue, item_type item,
                                  key_type key )
{
    strict_fibonacci_node* wrapper = pq_alloc_node( queue->map,
                                     STRICT_NODE_FIB );
    ITEM_ASSIGN( wrapper->item, item );
    wrapper->key = key;
    wrapper->right = wrapper;
    wrapper->left = wrapper;
    wrapper->q_next = wrapper;
    wrapper->q_prev = wrapper;

    strict_fibonacci_node *parent, *child;
    if( queue->root == NULL )
        queue->root = wrapper;
    else
    {
        choose_order_pair( wrapper, queue->root, &parent, &child );
        link( queue, parent, child );
        queue->root = parent;
        enqueue_node( queue, child );

        post_meld_reduction( queue );
    }

    queue->size++;
    garbage_collection( queue );

    return wrapper;
}
strict_fibonacci_heap* pq_meld( strict_fibonacci_heap *a,
                                strict_fibonacci_heap *b )
{
    strict_fibonacci_heap *new_heap = pq_create( a->map );
    strict_fibonacci_heap *big, *small;

    strict_fibonacci_node *big_head, *big_tail, *small_head, *small_tail;
    strict_fibonacci_node *parent, *child;

    // pick which heap to preserve
    if( a->size < b->size )
    {
        big = b;
        small = a;
    }
    else
    {
        big = a;
        small = b;
    }

    // set heap fields
    new_heap->size = big->size + small->size;
    new_heap->q_head = big->q_head;
    new_heap->active = big->active;
    new_heap->rank_list = big->rank_list;
    new_heap->fix_list[0] = big->fix_list[0];
    new_heap->fix_list[1] = big->fix_list[1];

    if( small->active != NULL )
        small->active->flag = 0;

    // merge the queues
    big_head = big->q_head;
    big_tail = big_head->q_prev;
    small_head = small->q_head;
    small_tail = small_head->q_prev;

    big_head->q_prev = small_tail;
    small_tail->q_next = big_head;
    small_head->q_prev = big_tail;
    big_tail->q_next = small_head;

    // actually link the two trees
    choose_order_pair( big->root, small->root, &parent, &child );
    link( new_heap, parent, child );
    new_heap->root = parent;
    enqueue_node( new_heap, child );

    // take care of some garbage collection
    release_to_garbage_collector( new_heap, small );
    free( small );
    free( big );
    garbage_collection( new_heap );

    return new_heap;
}
void pq_decrease_key( strict_fibonacci_heap *queue, strict_fibonacci_node *node,
                      key_type new_key )
{
    strict_fibonacci_node *old_parent = node->parent;

    node->key = new_key;

    if( old_parent == NULL || node->key > old_parent->key)
        return;

    strict_fibonacci_node *parent, *child;
    choose_order_pair( node, queue->root, &parent, &child );

    link( queue, parent, child );
    queue->root = parent;
    queue->root->parent = NULL;

    if( parent == node )
    {
        dequeue_node( queue, parent );
        enqueue_node( queue, child );
    }

    if( is_active( queue, node ) )
    {
        if( is_active( queue, old_parent ) )
            decrease_rank( queue, old_parent );
        if( node->type != STRICT_TYPE_ROOT )
            convert_active_to_root( queue, node );
    }
    if( is_active( queue, old_parent ) && old_parent->type != STRICT_TYPE_ROOT )
        increase_loss( queue, old_parent );

    post_decrease_key_reduction( queue );
    garbage_collection( queue );
}
示例#5
0
文件: varpool.c 项目: palves/gcc
static void
varpool_remove_unreferenced_decls (void)
{
  varpool_node *next, *node;
  varpool_node *first = (varpool_node *)(void *)1;
  int i;
  struct ipa_ref *ref;
  struct pointer_set_t *referenced = pointer_set_create ();

  if (seen_error ())
    return;

  if (cgraph_dump_file)
    fprintf (cgraph_dump_file, "Trivially needed variables:");
  FOR_EACH_DEFINED_VARIABLE (node)
    {
      if (node->analyzed
	  && (!varpool_can_remove_if_no_refs (node)
	      /* We just expanded all function bodies.  See if any of
		 them needed the variable.  */
	      || DECL_RTL_SET_P (node->decl)))
	{
	  enqueue_node (node, &first);
          if (cgraph_dump_file)
	    fprintf (cgraph_dump_file, " %s", node->asm_name ());
	}
    }
  while (first != (varpool_node *)(void *)1)
    {
      node = first;
      first = (varpool_node *)first->aux;

      if (node->same_comdat_group)
	{
	  symtab_node *next;
	  for (next = node->same_comdat_group;
	       next != node;
	       next = next->same_comdat_group)
	    {
	      varpool_node *vnext = dyn_cast <varpool_node *> (next);
	      if (vnext && vnext->analyzed && !symtab_comdat_local_p (next))
		enqueue_node (vnext, &first);
	    }
	}
      for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
	{
	  varpool_node *vnode = dyn_cast <varpool_node *> (ref->referred);
	  if (vnode
	      && !vnode->in_other_partition
	      && (!DECL_EXTERNAL (ref->referred->decl)
		  || vnode->alias)
	      && vnode->analyzed)
	    enqueue_node (vnode, &first);
	  else
	    pointer_set_insert (referenced, node);
	}
    }
  if (cgraph_dump_file)
    fprintf (cgraph_dump_file, "\nRemoving variables:");
  for (node = varpool_first_defined_variable (); node; node = next)
    {
      next = varpool_next_defined_variable (node);
      if (!node->aux)
	{
          if (cgraph_dump_file)
	    fprintf (cgraph_dump_file, " %s", node->asm_name ());
	  if (pointer_set_contains (referenced, node))
	    varpool_remove_initializer (node);
	  else
	    varpool_remove_node (node);
	}
    }
  pointer_set_destroy (referenced);
  if (cgraph_dump_file)
    fprintf (cgraph_dump_file, "\n");
}
示例#6
0
 void enqueue(const T &t) {
     enqueue_node(new MSQueueNode(t));
 }
示例#7
0
 void enqueue(T &&t) {
     enqueue_node(new MSQueueNode(std::move(t)));
 }
 void sync_enqueue(actor* sender, message_id_t id, any_tuple msg) {
     enqueue_node(super::fetch_node(sender, std::move(msg), id));
 }
 void enqueue(actor* sender, any_tuple msg) {
     enqueue_node(super::fetch_node(sender, std::move(msg)));
 }
 bool chained_sync_enqueue(actor* sender,
                           message_id_t id,
                           any_tuple msg) {
     return enqueue_node(super::fetch_node(sender, std::move(msg), id), pending);
 }
 bool chained_enqueue(actor* sender, any_tuple msg) {
     return enqueue_node(super::fetch_node(sender, std::move(msg)), pending);
 }
示例#12
0
文件: varpool.c 项目: Lao16/gcc
static void
varpool_remove_unreferenced_decls (void)
{
  struct varpool_node *next, *node;
  struct varpool_node *first = (struct varpool_node *)(void *)1;
  int i;
  struct ipa_ref *ref;

  if (seen_error ())
    return;

  if (cgraph_dump_file)
    fprintf (cgraph_dump_file, "Trivially needed variables:");
  FOR_EACH_DEFINED_VARIABLE (node)
    {
      if (node->analyzed
	  && (!varpool_can_remove_if_no_refs (node)
	      /* We just expanded all function bodies.  See if any of
		 them needed the variable.  */
	      || (!DECL_EXTERNAL (node->symbol.decl)
		  && DECL_RTL_SET_P (node->symbol.decl))))
	{
	  enqueue_node (node, &first);
          if (cgraph_dump_file)
	    fprintf (cgraph_dump_file, " %s", varpool_node_asm_name (node));
	}
    }
  while (first != (struct varpool_node *)(void *)1)
    {
      node = first;
      first = (struct varpool_node *)first->symbol.aux;

      if (node->symbol.same_comdat_group)
	{
	  symtab_node next;
	  for (next = node->symbol.same_comdat_group;
	       next != (symtab_node)node;
	       next = next->symbol.same_comdat_group)
	    {
	      varpool_node *vnext = dyn_cast <varpool_node> (next);
	      if (vnext && vnext->analyzed)
		enqueue_node (vnext, &first);
	    }
	}
      for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++)
	{
	  varpool_node *vnode = dyn_cast <varpool_node> (ref->referred);
	  if (vnode
	      && (!DECL_EXTERNAL (ref->referred->symbol.decl)
		  || vnode->alias)
	      && vnode->analyzed)
	    enqueue_node (vnode, &first);
	}
    }
  if (cgraph_dump_file)
    fprintf (cgraph_dump_file, "\nRemoving variables:");
  for (node = varpool_first_defined_variable (); node; node = next)
    {
      next = varpool_next_defined_variable (node);
      if (!node->symbol.aux)
	{
          if (cgraph_dump_file)
	    fprintf (cgraph_dump_file, " %s", varpool_node_asm_name (node));
	  varpool_remove_node (node);
	}
    }
  if (cgraph_dump_file)
    fprintf (cgraph_dump_file, "\n");
}
示例#13
0
文件: demo03.c 项目: Sukumi/levawc
int main(void)
{
  /* Declare YOUR variables here ! */
  Stack mystack;
  Queue myqueue;
  int menu_choice;

  srand((unsigned int)time(NULL));

  if ((myqueue = QUEUEinit(my_destroy)) == NULL) /* Create new queue... */
    {
      printf("\nFatal error - bailing out...!");
      QUEUEdestroy(myqueue);
      exit(-1);
    }

  if ((mystack = STACKinit(my_destroy)) == NULL) /* Create new stack... */
    {
      printf("\nFatal error - bailing out...!");
      STACKdestroy(mystack);
      exit(-1);
    }

  /* Create and initialize queue and stack... */
  enqueue_push_nodes(myqueue, mystack, NR_OF_ITEMS);

  do
    {
      menu_choice = menu(MAIN_MENU_ROW, 0, 6);

      switch (menu_choice)
        {
        case 1:
          enqueue_node(myqueue);
          break;
        case 2:
          dequeue_node(myqueue);
          break;
        case 3:
          push_node(mystack);
          break;
        case 4:
          pop_node(mystack);
          break;
        case 5:
          dequeue_push_node(myqueue, mystack);
          break;
        case 6:
          print_queue_stack(myqueue, mystack);
          break;
        default:
          final_status(myqueue, mystack);
          break;
        }
    }
  while (menu_choice); 

  prompt_and_pause("\n\nLet's tidy up (destroy queue/stack)..- Bye!");

  STACKdestroy(mystack);
  QUEUEdestroy(myqueue);

  return 0;
}
示例#14
0
void abstract_scheduled_actor::enqueue(actor* sender, any_tuple const& msg)
{
    enqueue_node(fetch_node(sender, msg));
    //enqueue_node(new queue_node(sender, msg));
}
示例#15
0
void abstract_scheduled_actor::enqueue(actor* sender, any_tuple&& msg)
{
    enqueue_node(fetch_node(sender, std::move(msg)));
    //enqueue_node(new queue_node(sender, std::move(msg)));
}