Re: Patches for various leaks

The patch changes generate a warning message at  pEl->token.
To get rid of the warning I recommend the following slight change to the code.
Here is the diff I produced after I applied the patch and then removed the
warning:

Index: HTMIMPrs.c
===================================================================
RCS file: /home/cvs/.cvsroot-alib/oss/libwww/Library/src/HTMIMPrs.c,v
retrieving revision 1.3
diff -c -r1.3 HTMIMPrs.c
*** 79,90 ****
  {
      int i;
      HTMIMEParseEl * pEl, * next;

      if(me && me->parsers) {
     for (i=0; i<me->size; i++) {
         for (pEl = me->parsers[i]; pEl; pEl = next) {
          next = pEl->next;
!         HT_FREE(pEl->token);
          HT_FREE(pEl);
         }
          }
--- 79,92 ----
  {
      int i;
      HTMIMEParseEl * pEl, * next;
+     void * temp;

      if(me && me->parsers) {
     for (i=0; i<me->size; i++) {
         for (pEl = me->parsers[i]; pEl; pEl = next) {
          next = pEl->next;
!                 temp = (void *)(pEl->token);
!         HT_FREE(temp);
          HT_FREE(pEl);
         }
          }






andyl@infospinner.com on 12/28/99 11:28:37 AM

To:   www-lib@w3.org
cc:   (bcc: Diana X Bruk)
Subject:  Patches for various leaks




Attached find CVS diff files to 2 source files that clean up a few memory
leaks when an app shuts down.

The first, HTIcons.c, adds the function HTIcon_deleteAll(), a function to
undo the effects of HTIconInit(). It clears out the entire icon table,
deleting all elements and nukes the table.

The second, HTMIMPrs.c, fixes the function HTParseSet_deleteAll() which had
the following problems:
     1) free'd each element twice
     2) the element tokens (pEl->token) was never being free'd
     3) the parser hash table itself (me->parsers) was never freed.

Andy Levine
andyl@infospinner.com

Index: HTIcons.c
===================================================================
RCS file: /sources/public/libwww/Library/src/HTIcons.c,v
retrieving revision 2.29
diff -r2.29 HTIcons.c
243a244,283
>
> PRIVATE void HTIconNode_delete(HTIconNode* pNode)
> {
>     HT_FREE(pNode->icon_url);
>     HT_FREE(pNode->icon_alt);
>     HT_FREE(pNode->type_templ);
>     HT_FREE(pNode);
> }
>
> /*
> **  cleans up all memory used by icons. Should be called by
> **  HTLibTerminate() (but it isn't)
> **
> */
> PUBLIC void HTIcon_deleteAll()
> {
>     if(icons != NULL)
>     {
>    HTList * iconList = icons;
>    HTIconNode * node;
>
>    while((node = (HTIconNode*)HTList_removeLastObject(iconList)))
>    {
>        HTIconNode_delete(node);
>    }
>
>    /* delete the list as well */
>    HTList_delete(icons);
>    icons = NULL;
>     }
>
>     HTIconNode_delete(icon_unknown);
>     icon_unknown = NULL;
>     HTIconNode_delete(icon_blank);
>     icon_blank = NULL;
>     HTIconNode_delete(icon_parent);
>     icon_parent = NULL;
>     HTIconNode_delete(icon_dir);
>     icon_dir = NULL;
> }
Index: HTMIMPrs.c
===================================================================
RCS file: /sources/public/libwww/Library/src/HTMIMPrs.c,v
retrieving revision 2.9
diff -r2.9 HTMIMPrs.c
82,87d81
<
<     for (i=0; i<me->size; i++)
<    for (pEl = me->parsers[i]; pEl; pEl = next) {
<        next = pEl->next;
<        HT_FREE(pEl);
<    }
89,91c83,92
<     for (pEl = me->parsers[i]; pEl; pEl = next) {
<         next = pEl->next;
<    HT_FREE(pEl);
---
>     if(me && me->parsers) {
>    for (i=0; i<me->size; i++) {
>        for (pEl = me->parsers[i]; pEl; pEl = next) {
>         next = pEl->next;
>         HT_FREE(pEl->token);
>         HT_FREE(pEl);
>        }
>    }
>    HT_FREE(me->parsers);
>    HT_FREE(me);
93d93
<     HT_FREE(me);

Received on Wednesday, 29 December 1999 10:22:50 UTC