Commit a1ab2c80 authored by Roger Dingledine's avatar Roger Dingledine
Browse files

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


svn:r10854
parent b7e4683f
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -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;
      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;
+15 −11
Original line number Diff line number Diff line
@@ -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;
}