Selaa lähdekoodia

Don't allocate an extra smartlist in the OOM handler

Fixes issue 10116
Nick Mathewson 9 vuotta sitten
vanhempi
commit
7f5a440421
2 muutettua tiedostoa jossa 12 lisäystä ja 10 poistoa
  1. 3 0
      changes/bug10116
  2. 9 10
      src/or/circuitlist.c

+ 3 - 0
changes/bug10116

@@ -0,0 +1,3 @@
+  o Minor features:
+    - When handling a low-memory situation, allocate less memory
+      for teporary data structures. Fixes issue 10115.

+ 9 - 10
src/or/circuitlist.c

@@ -1975,8 +1975,7 @@ circuits_compare_by_oldest_queued_item_(const void **a_, const void **b_)
 void
 circuits_handle_oom(size_t current_allocation)
 {
-  /* Let's hope there's enough slack space for this allocation here... */
-  smartlist_t *circlist = smartlist_new();
+  smartlist_t *circlist;
   size_t mem_to_recover;
   size_t mem_recovered=0;
   int n_circuits_killed=0;
@@ -2008,18 +2007,20 @@ circuits_handle_oom(size_t current_allocation)
   tor_gettimeofday_cached_monotonic(&now);
   now_ms = (uint32_t)tv_to_msec(&now);
 
-  /* This algorithm itself assumes that you've got enough memory slack
-   * to actually run it. */
-  SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) {
+  circlist = circuit_get_global_list();
+  SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) {
     circ->age_tmp = circuit_max_queued_item_age(circ, now_ms);
-    smartlist_add(circlist, circ);
-  }
-  SMARTLIST_FOREACH_END(circ);
+  } SMARTLIST_FOREACH_END(circ);
 
   /* This is O(n log n); there are faster algorithms we could use instead.
    * Let's hope this doesn't happen enough to be in the critical path. */
   smartlist_sort(circlist, circuits_compare_by_oldest_queued_item_);
 
+  /* Fix up the indices before we run into trouble */
+  SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) {
+    circ->global_circuitlist_idx = circ_sl_idx;
+  } SMARTLIST_FOREACH_END(circ);
+
   /* Okay, now the worst circuits are at the front of the list. Let's mark
    * them, and reclaim their storage aggressively. */
   SMARTLIST_FOREACH_BEGIN(circlist, circuit_t *, circ) {
@@ -2051,8 +2052,6 @@ circuits_handle_oom(size_t current_allocation)
              U64_PRINTF_ARG(mem_recovered),
              n_circuits_killed,
              smartlist_len(circlist) - n_circuits_killed);
-
-  smartlist_free(circlist);
 }
 
 /** Verify that cpath layer <b>cp</b> has all of its invariants