aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2007-07-17 09:26:45 +0000
committerRoger Dingledine <arma@torproject.org>2007-07-17 09:26:45 +0000
commitfcbb817db5507e85bba2d2b743dc0bd66fbf6103 (patch)
treea29c0a87c921595cadcdc111a2d89785c47bae46
parentccfda2e3a32e180598d9b6c7f4fe8c3983763b64 (diff)
downloadtor-fcbb817db5507e85bba2d2b743dc0bd66fbf6103.tar.gz
tor-fcbb817db5507e85bba2d2b743dc0bd66fbf6103.zip
free another string, and the buffer freelists, on exit.
svn:r10851
-rw-r--r--src/or/buffers.c11
-rw-r--r--src/or/config.c14
-rw-r--r--src/or/main.c3
-rw-r--r--src/or/or.h2
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);