diff options
author | Roger Dingledine <arma@torproject.org> | 2007-07-17 09:26:45 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2007-07-17 09:26:45 +0000 |
commit | fcbb817db5507e85bba2d2b743dc0bd66fbf6103 (patch) | |
tree | a29c0a87c921595cadcdc111a2d89785c47bae46 | |
parent | ccfda2e3a32e180598d9b6c7f4fe8c3983763b64 (diff) | |
download | tor-fcbb817db5507e85bba2d2b743dc0bd66fbf6103.tar.gz tor-fcbb817db5507e85bba2d2b743dc0bd66fbf6103.zip |
free another string, and the buffer freelists, on exit.
svn:r10851
-rw-r--r-- | src/or/buffers.c | 11 | ||||
-rw-r--r-- | src/or/config.c | 14 | ||||
-rw-r--r-- | src/or/main.c | 3 | ||||
-rw-r--r-- | src/or/or.h | 2 |
4 files changed, 18 insertions, 12 deletions
diff --git a/src/or/buffers.c b/src/or/buffers.c index 9ddd014529..cfb3613d18 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -254,9 +254,10 @@ buf_get_initial_mem(buf_t *buf, size_t sz) } /** Remove elements from the freelists that haven't been needed since the - * last call to this function. */ + * last call to this function. If <b>free_all</b>, we're exiting and we + * should clear the whole lists. */ void -buf_shrink_freelists(void) +buf_shrink_freelists(int free_all) { int j; for (j = 0; j < 2; ++j) { @@ -267,8 +268,10 @@ buf_shrink_freelists(void) 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); - /* Skip over the slack and non-lowwater entries */ - n_to_free = list->lowwater - 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; diff --git a/src/or/config.c b/src/or/config.c index 8654d54b53..bebc8cacad 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -715,21 +715,22 @@ set_options(or_options_t *new_val, char **msg) extern const char tor_svn_revision[]; /* from tor_main.c */ +static char *_version = NULL; + /** Return the current Tor version, possibly */ const char * get_version(void) { - static char *version = NULL; - if (version == NULL) { + if (_version == NULL) { if (strlen(tor_svn_revision)) { size_t len = strlen(VERSION)+strlen(tor_svn_revision)+8; - version = tor_malloc(len); - tor_snprintf(version, len, "%s (r%s)", VERSION, tor_svn_revision); + _version = tor_malloc(len); + tor_snprintf(_version, len, "%s (r%s)", VERSION, tor_svn_revision); } else { - version = tor_strdup(VERSION); + _version = tor_strdup(VERSION); } } - return version; + return _version; } /** Release all memory and resources held by global configuration structures. @@ -746,6 +747,7 @@ config_free_all(void) global_state = NULL; } tor_free(torrc_fname); + tor_free(_version); } /** If options->SafeLogging is on, return a not very useful string, diff --git a/src/or/main.c b/src/or/main.c index 9bd872b3a3..d379d9261c 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1046,7 +1046,7 @@ run_scheduled_events(time_t now) buf_shrink(conn->inbuf); }); clean_cell_pool(); - buf_shrink_freelists(); + buf_shrink_freelists(0); time_to_shrink_memory = now + MEM_SHRINK_INTERVAL; } @@ -1767,6 +1767,7 @@ tor_free_all(int postfork) circuit_free_all(); entry_guards_free_all(); connection_free_all(); + buf_shrink_freelists(1); policies_free_all(); if (!postfork) { config_free_all(); diff --git a/src/or/or.h b/src/or/or.h index b14f687bac..998f89e336 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2149,7 +2149,7 @@ buf_t *buf_new_with_capacity(size_t size); void buf_free(buf_t *buf); void buf_clear(buf_t *buf); void buf_shrink(buf_t *buf); -void buf_shrink_freelists(void); +void buf_shrink_freelists(int free_all); size_t buf_datalen(const buf_t *buf); size_t buf_capacity(const buf_t *buf); |