Browse Source

Remove maximum-size field from smartlists

svn:r1397
Nick Mathewson 21 years ago
parent
commit
96a86ef14d
4 changed files with 21 additions and 31 deletions
  1. 7 16
      src/common/util.c
  2. 1 2
      src/common/util.h
  3. 7 7
      src/or/onion.c
  4. 6 6
      src/or/routerlist.c

+ 7 - 16
src/common/util.c

@@ -117,16 +117,10 @@ void set_uint32(char *cp, uint32_t v)
  * _add() adds an element, _remove() removes an element if it's there,
  * _choose() returns a random element.
  */
-#define SL_DEFAULT_CAPACITY 32
-
-smartlist_t *smartlist_create(int max_elements) {
+smartlist_t *smartlist_create(int capacity) {
   smartlist_t *sl = tor_malloc(sizeof(smartlist_t));
   sl->num_used = 0;
-  sl->max = max_elements;
-  if (max_elements <= SL_DEFAULT_CAPACITY)
-    sl->capacity = max_elements;
-  else
-    sl->capacity = SL_DEFAULT_CAPACITY;
+  sl->capacity = capacity;
   sl->list = tor_malloc(sizeof(void *) * sl->capacity);
   return sl;
 }
@@ -145,14 +139,11 @@ void smartlist_grow_capacity(smartlist_t *sl, int n) {
 
 /* add element to the list, but only if there's room */
 void smartlist_add(smartlist_t *sl, void *element) {
-  if (sl->num_used < sl->max) {
-    if (sl->num_used >= sl->capacity) {
-      sl->capacity *= 2;
-      sl->list = tor_realloc(sl->list, sizeof(void*)*sl->capacity);
-    }
-    sl->list[sl->num_used++] = element;
-  } else
-    log_fn(LOG_WARN,"We've already got %d elements, discarding.",sl->max);
+  if (sl->num_used >= sl->capacity) {
+    sl->capacity *= 2;
+    sl->list = tor_realloc(sl->list, sizeof(void*)*sl->capacity);
+  }
+  sl->list[sl->num_used++] = element;
 }
 
 void smartlist_remove(smartlist_t *sl, void *element) {

+ 1 - 2
src/common/util.h

@@ -61,11 +61,10 @@ void set_uint32(char *cp, uint32_t v);
 typedef struct {
   void **list;
   int num_used;
-  int max;
   int capacity;
 } smartlist_t;
 
-smartlist_t *smartlist_create(int max_elements);
+smartlist_t *smartlist_create(int capacity);
 void smartlist_free(smartlist_t *sl);
 void smartlist_grow_capacity(smartlist_t *sl, int n);
 void smartlist_add(smartlist_t *sl, void *element);

+ 7 - 7
src/or/onion.c

@@ -300,13 +300,13 @@ static routerinfo_t *choose_good_exit_server(routerlist_t *dir)
   log_fn(LOG_INFO, "Found %d servers that might support %d/%d pending connections.",
          n_best_support, best_support, n_pending_connections);
 
-  preferredexits = smartlist_create(MAX_ROUTERS_IN_DIR);
+  preferredexits = smartlist_create(16);
   add_nickname_list_to_smartlist(preferredexits,options.ExitNodes);
 
-  excludedexits = smartlist_create(MAX_ROUTERS_IN_DIR);
+  excludedexits = smartlist_create(16);
   add_nickname_list_to_smartlist(excludedexits,options.ExcludeNodes);
 
-  sl = smartlist_create(MAX_ROUTERS_IN_DIR);
+  sl = smartlist_create(dir->n_routers);
 
   /* If any routers definitely support any pending connections, choose one
    * at random. */
@@ -450,7 +450,7 @@ int onion_extend_cpath(crypt_path_t **head_ptr, cpath_build_state_t *state, rout
   log_fn(LOG_DEBUG, "Path is %d long; we want %d", cur_len,
          state->desired_path_len);
 
-  excludednodes = smartlist_create(MAX_ROUTERS_IN_DIR);
+  excludednodes = smartlist_create(16);
   add_nickname_list_to_smartlist(excludednodes,options.ExcludeNodes);
 
   if(cur_len == state->desired_path_len - 1) { /* Picking last node */
@@ -465,7 +465,7 @@ int onion_extend_cpath(crypt_path_t **head_ptr, cpath_build_state_t *state, rout
     }
   } else if(cur_len == 0) { /* picking first node */
     /* try the nodes in EntryNodes first */
-    sl = smartlist_create(MAX_ROUTERS_IN_DIR);
+    sl = smartlist_create(16);
     add_nickname_list_to_smartlist(sl,options.EntryNodes);
     /* XXX one day, consider picking chosen_exit knowing what's in EntryNodes */
     remove_twins_from_smartlist(sl,router_get_by_nickname(state->chosen_exit));
@@ -473,7 +473,7 @@ int onion_extend_cpath(crypt_path_t **head_ptr, cpath_build_state_t *state, rout
     choice = smartlist_choose(sl);
     smartlist_free(sl);
     if(!choice) {
-      sl = smartlist_create(MAX_ROUTERS_IN_DIR);
+      sl = smartlist_create(32);
       router_add_running_routers_to_smartlist(sl);
       remove_twins_from_smartlist(sl,router_get_by_nickname(state->chosen_exit));
       smartlist_subtract(sl,excludednodes);
@@ -487,7 +487,7 @@ int onion_extend_cpath(crypt_path_t **head_ptr, cpath_build_state_t *state, rout
     }
   } else {
     log_fn(LOG_DEBUG, "Contemplating intermediate hop: random choice.");
-    sl = smartlist_create(MAX_ROUTERS_IN_DIR);
+    sl = smartlist_create(32);
     router_add_running_routers_to_smartlist(sl);
     remove_twins_from_smartlist(sl,router_get_by_nickname(state->chosen_exit));
     for (i = 0, cpath = *head_ptr; i < cur_len; ++i, cpath=cpath->next) {

+ 6 - 6
src/or/routerlist.c

@@ -164,7 +164,7 @@ static routerinfo_t *router_pick_directory_server_impl(void) {
   if(!routerlist)
     return NULL;
 
-  sl = smartlist_create(MAX_ROUTERS_IN_DIR);
+  sl = smartlist_create(8);
   for(i=0;i<routerlist->n_routers;i++) {
     router = routerlist->routers[i];
     if(router->dir_port > 0 && router->is_running)
@@ -604,8 +604,8 @@ router_get_routerlist_from_directory_impl(const char *str,
   } else {
     end = str + strlen(str);
   }
-  
-  tokens = smartlist_create(128);
+
+  tokens = smartlist_create(16);
   if (tokenize_string(str,end,tokens,1)) {
     log_fn(LOG_WARN, "Error tokenizing directory"); goto err;
   }
@@ -617,7 +617,7 @@ router_get_routerlist_from_directory_impl(const char *str,
            tok->args[0]);
     goto err;
   }
-  
+
   tok = (directory_token_t*)tokens->list[0];
   if (tok->tp != K_SIGNED_DIRECTORY) {
     log_fn(LOG_WARN, "Directory doesn't start with signed-directory."); 
@@ -671,7 +671,7 @@ router_get_routerlist_from_directory_impl(const char *str,
     token_free((directory_token_t*)tokens->list[i]);
   }
   smartlist_free(tokens);
-  tokens = smartlist_create(128);
+  tokens = smartlist_create(16);
   if (tokenize_string(str,str+strlen(str),tokens,1)<0) {
     log_fn(LOG_WARN, "Error tokenizing signature"); goto err;
   }
@@ -817,7 +817,7 @@ routerinfo_t *router_get_entry_from_string(const char *s,
     log_fn(LOG_WARN, "Couldn't compute router hash.");
     return NULL;
   }
-  tokens = smartlist_create(128);
+  tokens = smartlist_create(16);
   if (tokenize_string(s,end,tokens,0)) {
     log_fn(LOG_WARN, "Error tokeninzing router descriptor."); goto err;
   }