From: oes Date: Wed, 20 Nov 2002 14:38:15 +0000 (+0000) Subject: Fixed delayed/incomplete freeing of client resources and X-Git-Tag: v_3_0_1~74 X-Git-Url: http://www.privoxy.org/gitweb/?a=commitdiff_plain;h=2645b0a9675d306320f6909de51c2f6077406a15;p=privoxy.git Fixed delayed/incomplete freeing of client resources and simplified loop structure in sweep. Thanks to Oliver Stoeneberg for the hint. --- diff --git a/loaders.c b/loaders.c index f2055fb8..32218125 100644 --- a/loaders.c +++ b/loaders.c @@ -1,4 +1,4 @@ -const char loaders_rcs[] = "$Id: loaders.c,v 1.50 2002/04/24 02:12:16 oes Exp $"; +const char loaders_rcs[] = "$Id: loaders.c,v 1.50.2.1 2002/07/26 15:19:24 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/Attic/loaders.c,v $ @@ -35,6 +35,12 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.50 2002/04/24 02:12:16 oes Exp $" * * Revisions : * $Log: loaders.c,v $ + * Revision 1.50.2.1 2002/07/26 15:19:24 oes + * - PCRS jobs now chained in order of appearance. Previous + * reverse chaining was counter-intuitive. + * - Changed loglevel of PCRS job compile errors to + * LOG_LEVEL_ERROR + * * Revision 1.50 2002/04/24 02:12:16 oes * Jon's multiple AF patch: Sweep now takes care of all AFs * @@ -336,7 +342,7 @@ static struct file_list *current_re_filterfile = NULL; void sweep(void) { struct file_list *fl, *nfl; - struct client_state *csp, *ncsp; + struct client_state *csp, *last_active; int i; /* clear all of the file's active flags */ @@ -345,78 +351,83 @@ void sweep(void) fl->active = 0; } - for (csp = clients; csp && (NULL != (ncsp = csp->next)) ; csp = csp->next) + last_active = clients; + csp = clients->next; + + while (NULL != csp) { - if (ncsp->flags & CSP_FLAG_ACTIVE) + if (csp->flags & CSP_FLAG_ACTIVE) { - /* mark this client's files as active */ + /* Mark this client's files as active */ /* * Always have a configuration file. * (Also note the slightly non-standard extra * indirection here.) */ - ncsp->config->config_file_list->active = 1; + csp->config->config_file_list->active = 1; + /* + * Actions files + */ for (i = 0; i < MAX_ACTION_FILES; i++) { - if (ncsp->actions_list[i]) /* actions files */ + if (csp->actions_list[i]) { - ncsp->actions_list[i]->active = 1; + csp->actions_list[i]->active = 1; } } - if (ncsp->rlist) /* pcrsjob files */ + /* + * Filter file + */ + if (csp->rlist) { - ncsp->rlist->active = 1; + csp->rlist->active = 1; } + /* + * Trust file + */ #ifdef FEATURE_TRUST - if (ncsp->tlist) /* trust files */ + if (csp->tlist) { - ncsp->tlist->active = 1; + csp->tlist->active = 1; } #endif /* def FEATURE_TRUST */ } - else + else /* - * this client is not active, release its resources - * and the ones of all inactive clients that might - * follow it + * This client is not active. Free its resources. */ { - while (!(ncsp->flags & CSP_FLAG_ACTIVE)) - { - csp->next = ncsp->next; + last_active->next = csp->next; - freez(ncsp->ip_addr_str); - freez(ncsp->my_ip_addr_str); - freez(ncsp->my_hostname); - freez(ncsp->x_forwarded); - freez(ncsp->iob->buf); + freez(csp->ip_addr_str); + freez(csp->my_ip_addr_str); + freez(csp->my_hostname); + freez(csp->x_forwarded); + freez(csp->iob->buf); - free_http_request(ncsp->http); + free_http_request(csp->http); - destroy_list(ncsp->headers); - destroy_list(ncsp->cookie_list); + destroy_list(csp->headers); + destroy_list(csp->cookie_list); - free_current_action(ncsp->action); + free_current_action(csp->action); #ifdef FEATURE_STATISTICS - urls_read++; - if (ncsp->flags & CSP_FLAG_REJECTED) - { - urls_rejected++; - } + urls_read++; + if (csp->flags & CSP_FLAG_REJECTED) + { + urls_rejected++; + } #endif /* def FEATURE_STATISTICS */ - freez(ncsp); - - /* are there any more in sequence after it? */ - if( (ncsp = csp->next) == NULL) - break; - } + freez(csp); + + csp = last_active->next; } }