free bridge list on exit; try harder to free buffer freelists on exit.

svn:r10854
This commit is contained in:
Roger Dingledine 2007-07-17 11:33:38 +00:00
parent b7e4683ff9
commit a1ab2c8087
2 changed files with 23 additions and 16 deletions

View File

@ -262,16 +262,19 @@ buf_shrink_freelists(int free_all)
int j;
for (j = 0; j < 2; ++j) {
free_mem_list_t *list = j ? &free_mem_list_16k : &free_mem_list_4k;
if (list->lowwater > list->slack) {
if (list->lowwater > list->slack || free_all) {
int i, n_to_skip, n_to_free;
char **ptr;
log_info(LD_GENERAL, "We haven't used %d/%d allocated %d-byte buffer "
if (free_all) { /* Free every one of them */
log_info(LD_GENERAL, "Freeing all %d elements from %d-byte freelist.",
list->len, (int)list->chunksize);
n_to_free = list->len;
} else { /* Skip over the slack and non-lowwater entries */
log_info(LD_GENERAL, "We haven't used %d/%d allocated %d-byte buffer "
"memory chunks since the last call; freeing all but %d of them",
list->lowwater, list->len, (int)list->chunksize, list->slack);
if (free_all) /* Free every one of them */
n_to_free = list->len;
else /* Skip over the slack and non-lowwater entries */
n_to_free = list->lowwater - list->slack;
}
n_to_skip = list->len - n_to_free;
for (ptr = &list->list, i = 0; i < n_to_skip; ++i) {
char *mem = *ptr;

View File

@ -2083,17 +2083,6 @@ pick_entry_guards(void)
entry_guards_changed();
}
/** Release all storage held by the list of entry guards. */
void
entry_guards_free_all(void)
{
if (entry_guards) {
SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, tor_free(e));
smartlist_free(entry_guards);
entry_guards = NULL;
}
}
/** How long (in seconds) do we allow an entry guard to be nonfunctional,
* unlisted, excluded, or otherwise nonusable before we give up on it? */
#define ENTRY_GUARD_REMOVE_AFTER (30*24*60*60)
@ -2823,3 +2812,18 @@ any_bridge_descriptors_known(void)
#endif
}
/** Release all storage held by the list of entry guards and related
* memory structs. */
void
entry_guards_free_all(void)
{
if (entry_guards) {
SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e, tor_free(e));
smartlist_free(entry_guards);
entry_guards = NULL;
}
clear_bridge_list();
smartlist_free(bridge_list);
bridge_list = NULL;
}