struct fake_timer* replay_get_oldest_timer(struct replay_runtime* runtime) { struct fake_timer* t = first_timer(runtime); if(t && timeval_smaller(&t->tv, &runtime->now_tv)) return t; return NULL; }
void timehist_insert(struct timehist* hist, struct timeval* tv) { size_t i; for(i=0; i<hist->num; i++) { if(timeval_smaller(tv, &hist->buckets[i].upper)) { hist->buckets[i].count++; return; } } /* dump in last bucket */ hist->buckets[hist->num-1].count++; }
/** fetch oldest timer in list that is enabled */ static struct fake_timer* first_timer(struct replay_runtime* runtime) { struct fake_timer* p, *res = NULL; for(p=runtime->timer_list; p; p=p->next) { if(!p->enabled) continue; if(!res) res = p; else if(timeval_smaller(&p->tv, &res->tv)) res = p; } return res; }
int mesh_make_new_space(struct mesh_area* mesh, ldns_buffer* qbuf) { struct mesh_state* m = mesh->jostle_first; /* free space is available */ if(mesh->num_reply_states < mesh->max_reply_states) return 1; /* try to kick out a jostle-list item */ if(m && m->reply_list && m->list_select == mesh_jostle_list) { /* how old is it? */ struct timeval age; timeval_subtract(&age, mesh->env->now_tv, &m->reply_list->start_time); if(timeval_smaller(&mesh->jostle_max, &age)) { /* its a goner */ log_nametypeclass(VERB_ALGO, "query jostled out to " "make space for a new one", m->s.qinfo.qname, m->s.qinfo.qtype, m->s.qinfo.qclass); /* backup the query */ if(qbuf) ldns_buffer_copy(mesh->qbuf_bak, qbuf); /* notify supers */ if(m->super_set.count > 0) { verbose(VERB_ALGO, "notify supers of failure"); m->s.return_msg = NULL; m->s.return_rcode = LDNS_RCODE_SERVFAIL; mesh_walk_supers(mesh, m); } mesh->stats_jostled ++; mesh_state_delete(&m->s); /* restore the query - note that the qinfo ptr to * the querybuffer is then correct again. */ if(qbuf) ldns_buffer_copy(qbuf, mesh->qbuf_bak); return 1; } } /* no space for new item */ return 0; }