示例#1
0
static void
rtems_rtl_unresolved_compact (void)
{
    rtems_rtl_unresolved_t* unresolved = rtems_rtl_unresolved ();
    if (unresolved)
    {
        /*
         * Iterate backwards over the blocks removing any used records. A block is
         * compacted moving up the block.
         */
        rtems_chain_node* node = rtems_chain_last (&unresolved->blocks);
        while (!rtems_chain_is_head (&unresolved->blocks, node))
        {
            rtems_chain_node* prev = rtems_chain_previous (node);
            rtems_rtl_unresolv_block_t* block = (rtems_rtl_unresolv_block_t*) node;
            rtems_rtl_unresolv_rec_t* rec = rtems_rtl_unresolved_rec_first (block);

            while (!rtems_rtl_unresolved_rec_is_last (block, rec))
            {
                bool next = true;

                if (rec->type == rtems_rtl_unresolved_name)
                {
                    if (rec->rec.name.refs == 0)
                    {
                        size_t name_recs = rtems_rtl_unresolved_name_recs (rec->rec.name.name);
                        rtems_rtl_unresolved_clean_block (block, rec, name_recs,
                                                          unresolved->block_recs);
                        next = false;
                    }
                }
                else if (rec->type == rtems_rtl_unresolved_reloc)
                {
                    if (!rec->rec.reloc.obj)
                    {
                        rtems_rtl_unresolved_clean_block (block, rec, 1,
                                                          unresolved->block_recs);
                        next = false;
                    }
                }

                if (next)
                    rec = rtems_rtl_unresolved_rec_next (rec);
            }

            if (block->recs == 0)
            {
                rtems_chain_extract (node);
                free (block);
            }

            node = prev;
        }
    }
}
示例#2
0
/**
 * Scan the chain for a buffer that matches the block number.
 *
 * @param chain The chain to scan.
 * @param count The number of items on the chain.
 * @param block The block number to find.
 * @return  rtems_rfs_buffer* The buffer if found else NULL.
 */
static rtems_rfs_buffer*
rtems_rfs_scan_chain (rtems_chain_control*   chain,
                      uint32_t*              count,
                      rtems_rfs_buffer_block block)
{
  rtems_rfs_buffer* buffer;
  rtems_chain_node* node;

  node = rtems_chain_last (chain);

  if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
    printf ("rtems-rfs: buffer-scan: count=%" PRIu32 ", block=%" PRIu32 ": ", *count, block);

  while (!rtems_chain_is_head (chain, node))
  {
    buffer = (rtems_rfs_buffer*) node;

    if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
      printf ("%" PRIuPTR " ", ((intptr_t) buffer->user));

    if (((rtems_rfs_buffer_block) ((intptr_t)(buffer->user))) == block)
    {
      if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
        printf (": found block=%" PRIuPTR "\n",
                ((intptr_t)(buffer->user)));

      (*count)--;
      rtems_chain_extract (node);
      rtems_chain_set_off_chain (node);
      return buffer;
    }
    node = rtems_chain_previous (node);
  }

  if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
    printf (": not found\n");

  return NULL;
}