dbghelp: When building the by address lookup table, speed up resorting by always taking into account that existing symbols are already sorted.
This commit is contained in:
parent
dca2d350ad
commit
9d3be00df2
|
@ -879,16 +879,38 @@ static inline unsigned where_to_insert(struct module* module, unsigned high, con
|
||||||
*/
|
*/
|
||||||
static BOOL resort_symbols(struct module* module)
|
static BOOL resort_symbols(struct module* module)
|
||||||
{
|
{
|
||||||
|
int delta;
|
||||||
|
|
||||||
if (!(module->module.NumSyms = module->num_symbols))
|
if (!(module->module.NumSyms = module->num_symbols))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* FIXME: what's the optimal value here ??? */
|
/* we know that set from 0 up to num_sorttab is already sorted
|
||||||
if (module->num_sorttab && module->num_symbols <= module->num_sorttab + 30)
|
* so sort the remaining (new) symbols, and merge the two sets
|
||||||
{
|
* (unless the first set is empty)
|
||||||
int i, delta, ins_idx = module->num_sorttab, prev_ins_idx;
|
*/
|
||||||
struct symt_ht* tmp[30];
|
|
||||||
|
|
||||||
delta = module->num_symbols - module->num_sorttab;
|
delta = module->num_symbols - module->num_sorttab;
|
||||||
|
qsort(&module->addr_sorttab[module->num_sorttab], delta, sizeof(struct symt_ht*), symt_cmp_addr);
|
||||||
|
if (module->num_sorttab)
|
||||||
|
{
|
||||||
|
int i, ins_idx = module->num_sorttab, prev_ins_idx;
|
||||||
|
static struct symt_ht** tmp;
|
||||||
|
static unsigned num_tmp;
|
||||||
|
|
||||||
|
if (num_tmp < delta)
|
||||||
|
{
|
||||||
|
static struct symt_ht** new;
|
||||||
|
if (tmp)
|
||||||
|
new = HeapReAlloc(GetProcessHeap(), 0, tmp, delta * sizeof(struct symt_ht*));
|
||||||
|
else
|
||||||
|
new = HeapAlloc(GetProcessHeap(), 0, delta * sizeof(struct symt_ht*));
|
||||||
|
if (!new)
|
||||||
|
{
|
||||||
|
module->num_sorttab = 0;
|
||||||
|
return resort_symbols(module);
|
||||||
|
}
|
||||||
|
tmp = new;
|
||||||
|
num_tmp = delta;
|
||||||
|
}
|
||||||
memcpy(tmp, &module->addr_sorttab[module->num_sorttab], delta * sizeof(struct symt_ht*));
|
memcpy(tmp, &module->addr_sorttab[module->num_sorttab], delta * sizeof(struct symt_ht*));
|
||||||
qsort(tmp, delta, sizeof(struct symt_ht*), symt_cmp_addr);
|
qsort(tmp, delta, sizeof(struct symt_ht*), symt_cmp_addr);
|
||||||
|
|
||||||
|
@ -902,10 +924,6 @@ static BOOL resort_symbols(struct module* module)
|
||||||
module->addr_sorttab[ins_idx + i] = tmp[i];
|
module->addr_sorttab[ins_idx + i] = tmp[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
qsort(module->addr_sorttab, module->num_symbols, sizeof(struct symt_ht*), symt_cmp_addr);
|
|
||||||
}
|
|
||||||
module->num_sorttab = module->num_symbols;
|
module->num_sorttab = module->num_symbols;
|
||||||
return module->sortlist_valid = TRUE;
|
return module->sortlist_valid = TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue