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