From: Nick Mathewson Date: Fri, 12 Nov 2004 20:41:52 +0000 (+0000) Subject: Add a FAST_SMARTLIST define to optionally inline smartlist_get and smartlist_len... X-Git-Tag: tor-0.0.9pre6~80 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=238a895e69ff9280555a922ccc2ad0ca55da2591;p=thirdparty%2Ftor.git Add a FAST_SMARTLIST define to optionally inline smartlist_get and smartlist_len, which are two major profiling offenders. svn:r2822 --- diff --git a/src/common/container.c b/src/common/container.c index 29647c449c..df20eca6ad 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -23,6 +23,7 @@ */ #define SMARTLIST_DEFAULT_CAPACITY 32 +#ifndef FAST_SMARTLIST struct smartlist_t { /** list has enough capacity to store exactly capacity elements * before it needs to be resized. Only the first num_used (\<= @@ -32,6 +33,7 @@ struct smartlist_t { int num_used; int capacity; }; +#endif /** Allocate and return an empty smartlist. */ @@ -160,6 +162,7 @@ void smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2) { smartlist_remove(sl1, sl2->list[i]); } +#ifndef FAST_SMARTLIST /** Return the idxth element of sl. */ void *smartlist_get(const smartlist_t *sl, int idx) @@ -169,6 +172,14 @@ void *smartlist_get(const smartlist_t *sl, int idx) tor_assert(idx < sl->num_used); return sl->list[idx]; } +/** Return the number of items in sl. + */ +int smartlist_len(const smartlist_t *sl) +{ + return sl->num_used; +} +#endif + /** Change the value of the idxth element of sl to val; return the old * value of the idxth element. */ @@ -182,6 +193,7 @@ void *smartlist_set(smartlist_t *sl, int idx, void *val) sl->list[idx] = val; return old; } + /** Remove the idxth element of sl; if idx is not the last * element, swap the last element of sl into the idxth space. * Return the old value of the idxth element. @@ -212,12 +224,6 @@ void *smartlist_del_keeporder(smartlist_t *sl, int idx) memmove(sl->list+idx, sl->list+idx+1, sizeof(void*)*(sl->num_used-idx)); return old; } -/** Return the number of items in sl. - */ -int smartlist_len(const smartlist_t *sl) -{ - return sl->num_used; -} /** Insert the value val as the new idxth element of * sl, moving all items previously at idx or later * forward one space. diff --git a/src/common/container.h b/src/common/container.h index 8be9edcac4..bc000cef46 100644 --- a/src/common/container.h +++ b/src/common/container.h @@ -7,6 +7,18 @@ /** Generic resizeable array. */ typedef struct smartlist_t smartlist_t; +#ifdef FAST_SMARTLIST + +struct smartlist_t { + /** list has enough capacity to store exactly capacity elements + * before it needs to be resized. Only the first num_used (\<= + * capacity) elements point to valid data. + */ + void **list; + int num_used; + int capacity; +}; +#endif smartlist_t *smartlist_create(void); void smartlist_free(smartlist_t *sl); @@ -22,12 +34,18 @@ int smartlist_overlap(const smartlist_t *sl1, const smartlist_t *sl2); void smartlist_intersect(smartlist_t *sl1, const smartlist_t *sl2); void smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2); /* smartlist_choose() is defined in crypto.[ch] */ +#ifndef FAST_SMARTLIST void *smartlist_get(const smartlist_t *sl, int idx); +int smartlist_len(const smartlist_t *sl); +#else +#define smartlist_get(sl,idx) ((sl)->list[(idx)]) +#define smartlist_len(sl) ((sl)->num_used) +#endif void *smartlist_set(smartlist_t *sl, int idx, void *val); void *smartlist_del(smartlist_t *sl, int idx); void *smartlist_del_keeporder(smartlist_t *sl, int idx); void smartlist_insert(smartlist_t *sl, int idx, void *val); -int smartlist_len(const smartlist_t *sl); + #define SPLIT_SKIP_SPACE 0x01 #define SPLIT_IGNORE_BLANK 0x02 int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,