Changeset eab2ac4


Ignore:
Timestamp:
2006-09-25T07:42:39Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
ebe7b36
Parents:
a214954
Message:

Saner garbage collection for node cache.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/jabber.c

    ra214954 reab2ac4  
    179179{
    180180        struct jabber_data *jd = gc->proto_data;
    181         struct xt_node *c, *prev;
     181        struct xt_node *c, *tmp;
    182182       
    183183        /* Just any whitespace character is enough as a keepalive for XMPP sessions. */
     
    194194        /* This horrible loop is explained in xmltree.c. Makes me wonder if maybe I
    195195           didn't choose the perfect data structure... */
    196         for( prev = NULL, c = jd->node_cache->children; c; prev = c, c = c ? c->next : jd->node_cache->children )
    197         {
    198                 if( c->flags == 0 )
    199                 {
    200                         c->flags ++;
    201                 }
    202                 else
    203                 {
    204                         if( prev )
    205                                 prev->next = c->next;
    206                         else
    207                                 jd->node_cache->children = c->next;
    208                        
    209                         xt_free_node( c );
    210                         c = prev;
    211                 }
     196        for( c = jd->node_cache->children; c; c =  c->next )
     197                if( !( c->flags & XT_SEEN ) )
     198                        break;
     199       
     200        /* Now c points at the first unflagged node (or at NULL). Clean up
     201           everything until that point. */
     202        while( jd->node_cache->children != c )
     203        {
     204                /*
     205                printf( "Cleaning up:\n" );
     206                xt_print( jd->node_cache->children );
     207                */
     208               
     209                tmp = jd->node_cache->children->next;
     210                xt_free_node( jd->node_cache->children );
     211                jd->node_cache->children = tmp;
     212        }
     213       
     214        /* Now flag the ones that were still unflagged. */
     215        for( c = jd->node_cache->children; c; c = c->next )
     216        {
     217                /*
     218                printf( "Flagged:\n" );
     219                xt_print( c );
     220                */
     221               
     222                c->flags |= XT_SEEN;
    212223        }
    213224}
Note: See TracChangeset for help on using the changeset viewer.