]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
r13952@catbus: nickm | 2007-07-27 19:18:46 -0400
authorNick Mathewson <nickm@torproject.org>
Fri, 27 Jul 2007 23:19:02 +0000 (23:19 +0000)
committerNick Mathewson <nickm@torproject.org>
Fri, 27 Jul 2007 23:19:02 +0000 (23:19 +0000)
 Weasel noticed that many buffers spend their time with empty 4k, 8k, and 16k memory chunks.  Thus, be more aggressive about putting empty chunks on the freelist, regardless of their high water marks.  (Also, run buffer_shrink_freelist on the 8k-chunk freelist.)

svn:r10953

ChangeLog
src/or/buffers.c

index de4b86fafeca5fd42318a4a46ad70ad2f0af1a03..0bb6feb7fab733a5403296044d539d89f7d57f00 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -40,6 +40,10 @@ Changes in version 0.2.0.3-alpha - 2007-??-??
     - Merge in some (as-yet-unused) IPv6 address manipulation code. (Patch
       from croup.)
 
+  o Performance improvements:
+    - Be more aggressive with freeing buffer RAM or putting it on the
+      free lists.
+
   o Performance improvements (win32):
     - Use Critical Sections rather than Mutexes for synchronizing threads
       on win32; Mutexes are heavier-weight, and designed for synchronizing
index 05132fa19665f63caf552ba3e98dd3fe862b459c..c5d8b1c7d0ea83f80099132f6305a85773f0d3e3 100644 (file)
@@ -281,9 +281,9 @@ buf_get_initial_mem(buf_t *buf, size_t sz)
 void
 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;
+  int list_elt_size;
+  for (list_elt_size = 4096; list_elt_size <= 16384; list_elt_size *= 2) {
+    free_mem_list_t *list = get_free_mem_list(list_elt_size);
     if (list->lowwater > list->slack || free_all) {
       int i, n_to_skip, n_to_free;
       char **ptr;
@@ -452,8 +452,16 @@ buf_shrink(buf_t *buf)
   size_t new_len;
 
   new_len = buf->len;
-  if (buf->datalen == 0 && buf->highwater == 0 &&
+  /* Actually, we ignore highwater here if we're going to throw it on the
+   * freelist, since it's way cheaper to use the freelist than to use (some)
+   * platform mallocs.
+   *
+   * DOCDOC If it turns out to be a good idea, add it to the doxygen for this
+   * function.
+   */
+  if (buf->datalen == 0 && // buf->highwater == 0 &&
       IS_FREELIST_SIZE(buf->len)) {
+    buf->highwater = 0;
     if (add_buf_mem_to_freelist(buf))
       return;
   }