winedbg: ResortSymbols optimization
Michal Janusz Miroslaw
M.Miroslaw at elka.pw.edu.pl
Fri Sep 19 10:18:13 CDT 2003
ChangeLog:
- DEBUG_ResortSymbols optimization: avoid one counting loop
Index: programs/winedbg/debugger.h
===================================================================
RCS file: /home/wine/wine/programs/winedbg/debugger.h,v
retrieving revision 1.9
diff -u -r1.9 debugger.h
--- programs/winedbg/debugger.h 1 Apr 2003 00:02:36 -0000 1.9
+++ programs/winedbg/debugger.h 18 Apr 2003 01:17:59 -0000
@@ -570,6 +576,8 @@
return p;
}
#endif
+
+#define DBG_realloc_tab(t,n) (void *)(t) = DBG_realloc(t, (n) * sizeof(*t))
#define DEBUG_STATUS_OFFSET 0x80003000
#define DEBUG_STATUS_INTERNAL_ERROR (DEBUG_STATUS_OFFSET+0)
Index: programs/winedbg/hash.c
===================================================================
RCS file: /home/wine/wine/programs/winedbg/hash.c,v
retrieving revision 1.7
diff -u -r1.7 hash.c
--- programs/winedbg/hash.c 19 Feb 2003 03:41:48 -0000 1.7
+++ programs/winedbg/hash.c 18 Apr 2003 01:18:03 -0000
@@ -73,9 +73,9 @@
static BOOL DEBUG_GetStackSymbolValue( const char * name, DBG_VALUE *value );
-static int sortlist_valid = FALSE;
-static int sorttab_nsym;
+static int sorttab_missing = 0;
+static int sorttab_nsym = 0;
static struct name_hash ** addr_sorttab = NULL;
static struct name_hash * name_hash_table[NR_NAME_HASH];
@@ -149,30 +137,14 @@
void
DEBUG_ResortSymbols(void)
{
- struct name_hash *nh;
- int nsym = 0;
- int i;
-
- for(i=0; i<NR_NAME_HASH; i++)
- {
- for (nh = name_hash_table[i]; nh; nh = nh->next)
- {
- if( (nh->flags & SYM_INVALID) == 0 )
- nsym++;
- else
- DEBUG_Printf( DBG_CHN_MESG, "Symbol %s (%04lx:%08lx) is invalid\n",
- nh->name, nh->value.addr.seg, nh->value.addr.off );
- }
- }
+ const struct name_hash *nh;
+ int nsym, i;
- sorttab_nsym = nsym;
- if( nsym == 0 )
- {
+ if (sorttab_missing == 0)
return;
- }
- addr_sorttab = (struct name_hash **) DBG_realloc(addr_sorttab,
- nsym * sizeof(struct name_hash *));
+ sorttab_nsym += sorttab_missing;
+ DBG_realloc_tab(addr_sorttab, sorttab_nsym);
nsym = 0;
for(i=0; i<NR_NAME_HASH; i++)
@@ -184,10 +156,12 @@
}
}
+ DEBUG_Printf(DBG_CHN_ERR, "Internal error in %s: sorttab: %d/%d, counted: %d\n",
+ __FUNCTION__, sorttab_missing, sorttab_nsym, nsym);
+
qsort(addr_sorttab, nsym,
sizeof(struct name_hash *), DEBUG_cmp_sym);
- sortlist_valid = TRUE;
-
+ sorttab_missing = 0;
}
/***********************************************************************
@@ -201,6 +175,11 @@
assert(value->cookie == DV_TARGET || value->cookie == DV_HOST);
+ /*
+ * First see if we already have an entry for this symbol. If so
+ * return it, so we don't end up with duplicates.
+ */
+
hash = name_hash(name);
for (nh = name_hash_table[hash]; nh; nh = nh->next)
{
@@ -245,12 +222,14 @@
* in that case, we don't clear the invalid flag for all the compilation
* units (N_GSYM), and wait to get the symbol from the symtab
*/
- if ((flags & SYM_INVALID) == 0)
+ if ((flags & SYM_INVALID) == 0) {
nh->flags &= ~SYM_INVALID;
+ ++sorttab_missing;
+ }
return nh;
}
/* don't define a symbol twice */
- if (c == 0 && (flags & SYM_INVALID) == 0) return nh;
+ if (c == 0) return nh;
}
}
@@ -259,11 +238,6 @@
(flags & SYM_INVALID) ? "invalid" : " valid", name, source, value->addr.seg, value->addr.off);
#endif
- /*
- * First see if we already have an entry for this symbol. If so
- * return it, so we don't end up with duplicates.
- */
-
new = (struct name_hash *) DBG_alloc(sizeof(struct name_hash));
new->value = *value;
new->name = DBG_strdup(name);
@@ -324,7 +277,8 @@
}
}
- sortlist_valid = FALSE;
+ if ( (flags & SYM_INVALID) == 0)
+ ++sorttab_missing;
return new;
}
@@ -336,9 +290,7 @@
* Free any spare memory that we might have allocated.
*/
if( nh == NULL )
- {
return TRUE;
- }
if( nh->n_locals != nh->locals_alloc )
{
@@ -541,9 +540,7 @@
char modbuf[256];
if( rtn != NULL )
- {
*rtn = NULL;
- }
if( source != NULL )
{
@@ -551,15 +548,11 @@
source->line = -1;
}
- if( sortlist_valid == FALSE )
- {
+ if( sorttab_missing > 0 )
DEBUG_ResortSymbols();
- }
- if( sortlist_valid == FALSE )
- {
+ if( sorttab_nsym == 0 )
return NULL;
- }
/*
* FIXME - use the binary search that we added to
@@ -897,7 +890,7 @@
{
int i;
int depth;
- struct name_hash *nh;
+ const struct name_hash *nh;
/*
* Utility function to dump stats about the hash table.
@@ -925,10 +918,8 @@
struct name_hash * nearest = NULL;
int mid, high, low;
- if( sortlist_valid == FALSE )
- {
+ if( sorttab_missing > 0 )
DEBUG_ResortSymbols();
- }
/*
* Binary search to find closest symbol.
@@ -1077,7 +1068,7 @@
{
char buffer[256];
char * pnt;
- struct name_hash *nh;
+ const struct name_hash *nh;
for(nh = name_hash_table[name_hash(name)]; nh; nh = nh->next)
{
More information about the wine-patches
mailing list