ChangeLog: - DEBUG_AddSymbol: make it more readable by extracting memory-saving optimization as DEBUG_strduponce index: programs/winedbg/debugger.h =================================================================== RCS file: /home/wine/wine/programs/winedbg/debugger.h,v retrieving revision 1.10 diff -u -r1.10 debugger.h --- programs/winedbg/debugger.h 5 Sep 2003 23:15:41 -0000 1.10 +++ programs/winedbg/debugger.h 19 Sep 2003 03:51:27 -0000 @@ -430,6 +430,10 @@ extern int DEBUG_PrintStringA( int chnl, const DBG_ADDR* address, int len ); extern int DEBUG_PrintStringW( int chnl, const DBG_ADDR* address, int len ); +#define STRONCE_SOURCEFILE 0 +#define STRONCE_LAST STRONCE_SOURCEFILE +extern char *DEBUG_strduponce(int stronce_id, const char *str); + /* debugger/module.c */ extern int DEBUG_LoadEntryPoints( const char * prefix ); extern void DEBUG_LoadModule32( const char* name, HANDLE hFile, void *base ); Index: programs/winedbg/hash.c =================================================================== RCS file: /home/wine/wine/programs/winedbg/hash.c,v retrieving revision 1.10 diff -u -r1.10 hash.c --- programs/winedbg/hash.c 7 Aug 2003 02:56:55 -0000 1.10 +++ programs/winedbg/hash.c 19 Sep 2003 03:51:28 -0000 @@ -201,8 +201,6 @@ { struct name_hash * new; struct name_hash *nh; - static char prev_source[PATH_MAX] = {'\0', }; - static char * prev_duped_source = NULL; int hash; assert(value->cookie == DV_TARGET || value->cookie == DV_HOST); @@ -269,28 +267,7 @@ new = (struct name_hash *) DBG_alloc(sizeof(struct name_hash)); new->value = *value; new->name = DBG_strdup(name); - - if( source != NULL ) - { - /* - * This is an enhancement to reduce memory consumption. The idea - * is that we duplicate a given string only once. This is a big - * win if there are lots of symbols defined in a given source file. - */ - if( strcmp(source, prev_source) == 0 ) - { - new->sourcefile = prev_duped_source; - } - else - { - strcpy(prev_source, source); - prev_duped_source = new->sourcefile = DBG_strdup(source); - } - } - else - { - new->sourcefile = NULL; - } + new->sourcefile = DEBUG_strduponce(STRONCE_SOURCEFILE, source); new->n_lines = 0; new->lines_alloc = 0; Index: programs/winedbg/memory.c =================================================================== RCS file: /home/wine/wine/programs/winedbg/memory.c,v retrieving revision 1.4 diff -u -r1.4 memory.c --- programs/winedbg/memory.c 7 Aug 2003 02:56:35 -0000 1.4 +++ programs/winedbg/memory.c 19 Sep 2003 03:51:28 -0000 @@ -388,3 +388,23 @@ } return written; /* number of actually written chars */ } + +/* + * DEBUG_strduponce + * + * Function used to try to avoid duplicated constant strings such + * as source file names. + */ +static char *str_lists[STRONCE_LAST+1] = { NULL, }; + +char *DEBUG_strduponce(int str_list, const char *str) +{ + if (!str) + return NULL; + + if (str_lists[str_list] && !strcmp(str, str_lists[str_list])) + return str_lists[str_list]; + + return (str_lists[str_list] = DBG_strdup(str)); +} +