[or-cvs] Make smartlists start small and grow as needed.

Nick Mathewson nickm at seul.org
Tue Mar 30 19:25:45 UTC 2004


Update of /home/or/cvsroot/src/common
In directory moria.mit.edu:/tmp/cvs-serv10922/src/common

Modified Files:
	util.c util.h 
Log Message:
Make smartlists start small and grow as needed.

Index: util.c
===================================================================
RCS file: /home/or/cvsroot/src/common/util.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -d -r1.70 -r1.71
--- util.c	21 Mar 2004 04:14:06 -0000	1.70
+++ util.c	30 Mar 2004 19:25:43 -0000	1.71
@@ -117,12 +117,17 @@
  * _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 *sl = tor_malloc(sizeof(smartlist_t));
-  sl->list = tor_malloc(sizeof(void *) * max_elements);
   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->list = tor_malloc(sizeof(void *) * sl->capacity);
   return sl;
 }
 
@@ -131,11 +136,22 @@
   free(sl);
 }
 
+void smartlist_grow_capacity(smartlist_t *sl, int n) {
+  if (sl->capacity < n) {
+    sl->capacity = n;
+    sl->list = tor_realloc(sl->list, sizeof(void*)*sl->capacity);
+  }
+}
+
 /* 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->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
+  } else
     log_fn(LOG_WARN,"We've already got %d elements, discarding.",sl->max);
 }
 

Index: util.h
===================================================================
RCS file: /home/or/cvsroot/src/common/util.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- util.h	21 Mar 2004 04:14:06 -0000	1.40
+++ util.h	30 Mar 2004 19:25:43 -0000	1.41
@@ -62,10 +62,12 @@
   void **list;
   int num_used;
   int max;
+  int capacity;
 } smartlist_t;
 
 smartlist_t *smartlist_create(int max_elements);
 void smartlist_free(smartlist_t *sl);
+void smartlist_grow_capacity(smartlist_t *sl, int n);
 void smartlist_add(smartlist_t *sl, void *element);
 void smartlist_remove(smartlist_t *sl, void *element);
 int smartlist_isin(smartlist_t *sl, void *element);



More information about the tor-commits mailing list