diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-02-24 07:37:45 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-02-24 07:37:45 +0000 |
commit | f599adf40ad702f26680ab6a7bbf869c788dd860 (patch) | |
tree | 8ede61d62d801797f6e39e276560cc3d30cb4182 | |
parent | 2015479b5a8f58d78e379c434cda82e7c4a86b95 (diff) | |
download | tor-f599adf40ad702f26680ab6a7bbf869c788dd860.tar.gz tor-f599adf40ad702f26680ab6a7bbf869c788dd860.zip |
r11909@catbus: nickm | 2007-02-24 02:37:40 -0500
Move tricky "delete the member of the smartlist currently under iteration" logic into its own happyfun macro.
svn:r9633
-rw-r--r-- | src/common/container.h | 10 | ||||
-rw-r--r-- | src/or/circuitbuild.c | 3 |
2 files changed, 11 insertions, 2 deletions
diff --git a/src/common/container.h b/src/common/container.h index ff2d3cb011..fbd3c6c603 100644 --- a/src/common/container.h +++ b/src/common/container.h @@ -156,6 +156,16 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, cmd; \ } } while (0) +/** Helper: While in a SMARTLIST_FOREACH loop over the list <b>sl</b> indexed + * with the variable <b>var</b>, remover the current element in a way that + * won't confuse the loop. */ +#define SMARTLIST_DEL_CURRENT(sl, var) \ + do { \ + smartlist_del(sl, var ## _sl_idx); \ + --var ## _sl_idx; \ + --var ## _sl_len; \ + } while (0); + #define DECLARE_MAP_FNS(maptype, keytype, prefix) \ typedef struct maptype maptype; \ typedef struct prefix##entry_t *prefix##iter_t; \ diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 58e85da590..fa6cd5108d 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -2280,8 +2280,7 @@ entry_guards_prepend_from_config(void) /* Remove all currently configured entry guards from entry_routers. */ SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, { if (is_an_entry_guard(ri->cache_info.identity_digest)) { - smartlist_del(entry_routers, ri_sl_idx--); - ri_sl_len--; + SMARTLIST_DEL_CURRENT(entry_routers, ri); } }); |