From cc48ec587f1448ed2deacafabd6df6e9d08bc0b0 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Tue, 22 May 2007 15:02:39 +0000 Subject: [PATCH] Fixes. git-svn-id: file:///svn/unbound/trunk@330 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 3 ++ services/cache/infra.c | 12 +++--- testcode/unitlruhash.c | 2 +- testcode/unitslabhash.c | 2 +- testdata/fwd_three.tpkg | Bin 1913 -> 1964 bytes testdata/fwd_three_service.tpkg | Bin 1947 -> 1946 bytes util/data/msgreply.c | 3 +- util/data/packed_rrset.c | 3 +- util/mini_event.c | 69 ++++++++++++++++++++------------ 9 files changed, 59 insertions(+), 35 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index d9c37c8b3..53b8af6a5 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -4,6 +4,9 @@ - testbound support for new serviced queries. - test for retry to TCP cannot use testbound any longer. - testns test for EDNS fallback, test for TCP fallback already exists. + - fixes for no-locking compile. + - mini_event timer precision and fix for change in timeouts during + timeout callback. Fix for fwd_three tests, performed nonexit query. 21 May 2007: Wouter - small comment on hash table locking. diff --git a/services/cache/infra.c b/services/cache/infra.c index fbc0d0502..5e9c861bc 100644 --- a/services/cache/infra.c +++ b/services/cache/infra.c @@ -75,7 +75,7 @@ infra_host_delkeyfunc(void* k, void* ATTR_UNUSED(arg), int il) struct infra_host_key* key = (struct infra_host_key*)k; if(!key) return; - if(il) lock_rw_unlock(&key->entry.lock); + if(il) { lock_rw_unlock(&key->entry.lock); } lock_rw_destroy(&key->entry.lock); free(key); } @@ -322,7 +322,7 @@ infra_lame_delkeyfunc(void* k, void* ATTR_UNUSED(arg), int il) struct infra_lame_key* key = (struct infra_lame_key*)k; if(!key) return; - if(il) lock_rw_unlock(&key->entry.lock); + if(il) { lock_rw_unlock(&key->entry.lock); } lock_rw_destroy(&key->entry.lock); free(key->zonename); free(key); @@ -397,7 +397,7 @@ infra_set_lame(struct infra_cache* infra, log_err("set_lame: malloc failure"); if(needtoinsert) slabhash_insert(infra->hosts, e->hash, e, e->data, NULL); - else lock_rw_unlock(&e->lock); + else { lock_rw_unlock(&e->lock); } free(k->zonename); free(k); free(d); @@ -409,7 +409,7 @@ infra_set_lame(struct infra_cache* infra, if(needtoinsert) slabhash_insert(infra->hosts, e->hash, e, e->data, NULL); - else lock_rw_unlock(&e->lock); + else { lock_rw_unlock(&e->lock); } return 1; } @@ -436,7 +436,7 @@ infra_rtt_update(struct infra_cache* infra, if(needtoinsert) slabhash_insert(infra->hosts, e->hash, e, e->data, NULL); - else lock_rw_unlock(&e->lock); + else { lock_rw_unlock(&e->lock); } return 1; } @@ -461,6 +461,6 @@ infra_edns_update(struct infra_cache* infra, if(needtoinsert) slabhash_insert(infra->hosts, e->hash, e, e->data, NULL); - else lock_rw_unlock(&e->lock); + else { lock_rw_unlock(&e->lock); } return 1; } diff --git a/testcode/unitlruhash.c b/testcode/unitlruhash.c index d03f5a9ce..489df9424 100644 --- a/testcode/unitlruhash.c +++ b/testcode/unitlruhash.c @@ -526,7 +526,7 @@ static int test_compfunc(void* key1, void* key2) static void test_delkey(void* key, void* ATTR_UNUSED(arg), int l) { - if(l) lock_rw_unlock(&((struct testkey*)key)->entry.lock); + if(l) { lock_rw_unlock(&((struct testkey*)key)->entry.lock); } delkey((struct testkey*)key); } diff --git a/testcode/unitslabhash.c b/testcode/unitslabhash.c index c525e1df7..32d17838a 100644 --- a/testcode/unitslabhash.c +++ b/testcode/unitslabhash.c @@ -406,7 +406,7 @@ static int test_compfunc(void* key1, void* key2) static void test_delkey(void* key, void* ATTR_UNUSED(arg), int l) { - if(l) lock_rw_unlock(&((struct slabtestkey*)key)->entry.lock); + if(l) { lock_rw_unlock(&((struct slabtestkey*)key)->entry.lock); } delkey((struct slabtestkey*)key); } diff --git a/testdata/fwd_three.tpkg b/testdata/fwd_three.tpkg index 86a1aab3dc5c565ba458ac30f4121949a1bfa6df..ce0a7414b4e0988af6ce6430ebe8884b6f42f47a 100644 GIT binary patch literal 1964 zc-jH12UGYTiwFSX1XD%;1MOLRbJ|D}_rJ`i=*X0vR2HEJk6Ik45F1~7mw*@J%Wdsl z5m_2QXV7RR5#rk2?|wa_2NH(ZwMU%V-TC>!sC%Y+rl)78BMLB;r?UWJOFKPGx!4j;`{%`3TfY3&=zESPyR`R z&}Ci=bX6l~G_(WPj|AbI1uH9XK=gy3mo#u`2v!8lv*~xR3|((3n3fZ&!cfLfK3&Ze9eDuh3wwN<2mcvyNjZ0QNYddQ60w_thU3QfqZ!B;+y zFWftYxD%KL)CWb^R6|ouO|5B4s`rF1&?BW-*5Drsq4SWY&wUmFr z)P2GAwP2$t*w`l6c(mZgTCiCZY;F^5?hs5wQ~NW0u|E>KzW;6JP4=bZq4*!Oy>l_5EfDS@KzcA@XZ}$G#>dG{uzR zS5hS*53Wa>oWSy?REWw*LZ0;7C{({H&cVpN2=ZVq2bUbkWb*-7^|E5vX>LUI(YV!O)1vcY zpVN{C{9n@X=)nIlj`r`6iGuM;VJi=WAY_P`4i}9xh{HP_%I6<2hP*gK?!vmI5Mrhu zGgA(9st)~B^_EC8I!8JeG;uu#EF{p+QDE^X>y|oVAzp~FmlJEk1uRs8!QN>ywYc(1FJqb?0vlcXt0^9%r2ulAOCZqWZ1iW z_apo;gl-r5gWhmB7?SSU->^dOQ@U}^=dZ(j{K_7m&?p^T);iZMrMZeU| zSl#~Bhu(0_DCN@DWInzA+0#tT*flj{V`}v$pPIRAYUak&8ilESYd@6uHrN^e2Xt>b z9=QKa-K=fA|E)I-S^s|$+>8GM`e&;C50k=hyZrn)l!x8^+2B3Agt}R;!HX9pUpsD> z)6PT${K=?{ioeAM>zI;#6RfU0gi3IJ3 z-Fw6K-0{Ln9Ix>Tsj$g2ZYSmAYUbKAk-+qZAChba0htCqTsHr!3qC_S8XV-N5#aKFY(+#oVS)zZ$-B%>--canQ_@rIANV` zrk-0$>i9gN1)L|>QjYjLF=X8Y)Ve*v7CP@*HfN(7{G6Z4rnsxvT0F7V!NCBFzakKZ zdnP1vW0!T&U%WEdp=3&-ytc|(N&K!!PX>u({I|kxWha{N1%}!bH46t6`*ZvbGkxmu zCN7y*MUVMZaW7R;+^DRIpxhgx6cnbOx>enk@Ow59PUPBjr?$LfE8)f{MaGm85)u*; y5)u*;5)u*;5)u*;5)u*;5)u*;5)u*;5)u*;5)u*;5)u+$1OEeF*Oco3PyhgdK--r9 literal 1913 zc-jGZ2Zs0`iwFQNsX;~n1MOLRbJ|7__rKhy*eHyhOp4G+JSNyMCN^%|Cg5P)G}Csl zEFGX4Bt?%9PuuU_z0(5;L+nl+GD)~3NZP&o-QM25?lPL2!(ieuCYzR5-uWy|!B($U z#gkSlxo6yVs8UlEO|4X_+79PdHM&#%JmTbA=m)xoQ_h_*VBY$Eck%fuRH{Ua!sl1g zM!Ef8d>M{CdZ;U8~f0HloDueE)ssePCXL6!7=T@vY#d0V*lj z;jF|BK{x#dR7t^gyr2PxXTAR5kQ7iAW5=?`rI_5i7%X!<-5xUmm68Oe;R@o&@#eZ` zmI9{%5>@N6f`6!#WhCH(UW|u>clm#%#{Iuqr;1uvYKriGTHpHrCfW<#XI*`UuA1&W`GtAD<=E&-vOe5!rt{{I*rmr6?x0j1Jo@)&$4^bCgX%wVSb zxOn)WdoV($fcb>kU#>a8EWp;eL1594Ub4 zoP*D?2w#Eezzs4H7(<9Nw?P0QdX(c>)0!Fq4UEnN!OTnwO)o$6S!& z&PZ-ZTo`%kjNxy$l?ZTVl50O|9{g~!Kc@yQb?_S@a#-fMUURjpcq zr%y>5+(eh8GZ6tl9+gsY7{wuY)=hayzh|7mjEMtM9x?kRL94YaUo>VhUGlc7FW(b1 zRiPkWgrokjd#B%=nzmnxQVy|3k>Vb4JxQ1IiDgVg0_*fIrG36%HYr5I$`fbC%8^-@ zuPnQq#Ti*78U-a6Qn5Jb^QA%=^IR)QUOXwlE{XGHv-l{xKu(BX)+|q?9)9s;jfJ6+ zMJg0G55FIl_i`%TEAJ)z=$1hANTkhh;|mJGPBxIU4pL|?el zjq9-|66jgK)0DVb%MvN#M>*+Q!oNlW1g)5y)lep>F0_;*WKQ**QBaK3UAw|gW=$1zjNNy6mf9_=wpF*(^O!eKjEMW#l@(I`0N?_9Yl3Y zA+c68t0LuI99Kp~RpNw2xsh0Ip%AHx7c_Y06tfiZN8+q2JZ@g^;~N_90-LkZ4Blr& zS%y20w8aZ63Z`X(?F5nH9tmWw>>?HYKca%^nn}hCiVLkQCh?~XS4HDNq8R%pw_B-4 z^Sv<8EpcXHfMS34USXxjZ2pQ%=C@*dTvXgkndCPrts*_yl)(4;{DX#=(*qM_Lr;eddC*n@Tgh#>>2g8l3#K?!7dSR~ocpDR_;8qg~6SyuP^y zkh&U3O@Y*V0%@y(v=m6=Kv7Dr#+M+^p%_cMOi-5z8p-W!vfgNC)77u)qvrakEBk1< zKH5VWkuR)hX?H(qMl^3n6f7T>jY$yg+ZJ^jxVivV^T6sVVD;X>wFR)22i8^rYiods zcvZf~g5^{B-}WD7jyv!FsgnNxpQ=)k|LfZJ{(lo~ANXM~IWCIq%d=Op*FXL7vN*;JAikVt5H|T>Ryrq~AGv^$yf5D!`+4mUM&-Z>ha_PX%qqI1q)2+u8r({7=ivfADAx1IiiQOLxt zSe{Pzcr&7@>qJwRM5}IGG;N(|+LCCsoM>O#4!3RFwr$(CZL{rPc3W3}04x9i{xQ-9 diff --git a/testdata/fwd_three_service.tpkg b/testdata/fwd_three_service.tpkg index 9decdba891c7e5c914f597262110427992f1d3b4..b0e74bc8383f1e223ab95843e33ea1331bfdfb2d 100644 GIT binary patch literal 1946 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.lock); + } lock_rw_destroy(&q->entry.lock); query_info_clear(&q->key); free(q); diff --git a/util/data/packed_rrset.c b/util/data/packed_rrset.c index 1393c58c2..23aa080a2 100644 --- a/util/data/packed_rrset.c +++ b/util/data/packed_rrset.c @@ -106,8 +106,9 @@ ub_rrset_key_delete(void* key, void* userdata, int is_locked) struct ub_packed_rrset_key* k = (struct ub_packed_rrset_key*)key; struct alloc_cache* a = (struct alloc_cache*)userdata; k->id = 0; - if(is_locked) + if(is_locked) { lock_rw_unlock(&k->entry.lock); + } free(k->rk.dname); k->rk.dname = NULL; alloc_special_release(a, k); diff --git a/util/mini_event.c b/util/mini_event.c index aec29d089..6eb5b500c 100644 --- a/util/mini_event.c +++ b/util/mini_event.c @@ -115,46 +115,56 @@ const char *event_get_method(void) } /** call timeouts handlers, and return how long to wait for next one or -1 */ -static void handle_timeouts(struct event_base* base, time_t now, time_t *wait) +static void handle_timeouts(struct event_base* base, struct timeval* now, + struct timeval* wait) { - struct event* p, *np; - *wait = (time_t)-1; + struct event* p; +#ifndef S_SPLINT_S + wait->tv_sec = (time_t)-1; +#endif - p = (struct event*)rbtree_first(base->times); - while((rbnode_t*)p!=RBTREE_NULL) { - /* store next to make deletion possible */ - np = (struct event*)rbtree_next((rbnode_t*)p); - if(!p || p->ev_timeout.tv_sec > now || - (p->ev_timeout.tv_sec==now && p->ev_timeout.tv_usec>0)) { + while((rbnode_t*)(p = (struct event*)rbtree_first(base->times)) + !=RBTREE_NULL) { +#ifndef S_SPLINT_S + if(p->ev_timeout.tv_sec > now->tv_sec || + (p->ev_timeout.tv_sec==now->tv_sec && + p->ev_timeout.tv_usec > now->tv_usec)) { /* there is a next larger timeout. wait for it */ - *wait = p->ev_timeout.tv_sec - now; - if(p->ev_timeout.tv_usec > 0) - *wait+=1; /* wait a bit longer */ + wait->tv_sec = p->ev_timeout.tv_sec - now->tv_sec; + if(now->tv_usec > p->ev_timeout.tv_usec) { + wait->tv_sec--; + wait->tv_usec = 1000000 - (now->tv_usec - + p->ev_timeout.tv_usec); + } else { + wait->tv_usec = p->ev_timeout.tv_usec + - now->tv_usec; + } return; } +#endif /* event times out, remove it */ (void)rbtree_delete(base->times, p); p->ev_events &= ~EV_TIMEOUT; (*p->ev_callback)(p->ev_fd, EV_TIMEOUT, p->ev_arg); - /* next is a valid pointer and next larger element */ - p = np; } } /** call select and callbacks for that */ -static int handle_select(struct event_base* base, time_t wait) +static int handle_select(struct event_base* base, struct timeval* wait) { - struct timeval tv; fd_set r, w; int ret, i; - tv.tv_sec = wait; - tv.tv_usec = 0; +#ifndef S_SPLINT_S + if(wait->tv_sec==(time_t)-1) + wait = NULL; +#endif + if(wait) log_info("waiting for %d %d", wait->tv_sec, wait->tv_usec); + else log_info("wait forever"); memmove(&r, &base->reads, sizeof(fd_set)); memmove(&w, &base->writes, sizeof(fd_set)); - if((ret = select(base->maxfd+1, &r, &w, NULL, - (wait==(time_t)-1)?NULL:&tv)) == -1) { + if((ret = select(base->maxfd+1, &r, &w, NULL, wait)) == -1) { return -1; } @@ -185,13 +195,15 @@ static int handle_select(struct event_base* base, time_t wait) /** run select in a loop */ int event_base_dispatch(struct event_base* base) { + struct timeval now, wait; while(!base->need_to_exit) { - time_t now = time(NULL), wait; + if(gettimeofday(&now, NULL) < 0) + return -1; /* see if timeouts need handling */ - handle_timeouts(base, now, &wait); + handle_timeouts(base, &now, &wait); /* do select */ - if(handle_select(base, wait) < 0) { + if(handle_select(base, &wait) < 0) { if(base->need_to_exit) return 0; return -1; @@ -258,8 +270,15 @@ int event_add(struct event* ev, struct timeval* tv) } if(tv && ev->ev_events&EV_TIMEOUT) { #ifndef S_SPLINT_S - ev->ev_timeout.tv_sec = tv->tv_sec + time(NULL); - ev->ev_timeout.tv_usec = tv->tv_usec; + struct timeval now; + if(gettimeofday(&now, NULL) < 0) + return -1; + ev->ev_timeout.tv_sec = tv->tv_sec + now.tv_sec; + ev->ev_timeout.tv_usec = tv->tv_usec + now.tv_usec; + while(ev->ev_timeout.tv_usec > 1000000) { + ev->ev_timeout.tv_usec -= 1000000; + ev->ev_timeout.tv_sec++; + } #endif (void)rbtree_insert(ev->ev_base->times, &ev->node); } -- 2.47.2