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; } } }
/** * 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; }