static void schedule_delay(uint16_t query_id, const char *buf, size_t buflen, struct sockaddr *addr, socklen_t addrlen) { int i; int found = 0; struct timeval now; gettimeofday(&now, 0); delay_buf_t *delay_buf = &delay_queue[delay_queue_last]; // first search for existed item with query_id and replace it for (i = delay_queue_first; i != delay_queue_last; i = (i + 1) % DELAY_QUEUE_LEN) { delay_buf_t *delay_buf2 = &delay_queue[i]; if (delay_buf2->id == query_id) { free_delay(i); delay_buf = &delay_queue[i]; found = 1; } } delay_buf->id = query_id; delay_buf->ts = now; delay_buf->buf = malloc(buflen); memcpy(delay_buf->buf, buf, buflen); delay_buf->buflen = buflen; delay_buf->addr = malloc(addrlen); memcpy(delay_buf->addr, addr, addrlen); delay_buf->addrlen = addrlen; // then append to queue if (!found) { delay_queue_last = (delay_queue_last + 1) % DELAY_QUEUE_LEN; if (delay_queue_last == delay_queue_first) { free_delay(delay_queue_first); delay_queue_first = (delay_queue_first + 1) % DELAY_QUEUE_LEN; } } }
static void check_and_send_delay() { struct timeval now; int i; gettimeofday(&now, 0); for (i = delay_queue_first; i != delay_queue_last; i = (i + 1) % DELAY_QUEUE_LEN) { delay_buf_t *delay_buf = &delay_queue[i]; if (time_diff(delay_buf->ts, now) > empty_result_delay) { if (-1 == sendto(local_sock, delay_buf->buf, delay_buf->buflen, 0, delay_buf->addr, delay_buf->addrlen)) ERR("sendto"); free_delay(i); delay_queue_first = (delay_queue_first + 1) % DELAY_QUEUE_LEN; } else { break; } } }
static void check_and_send_delay() { time_t ts_limit; int i; time(&ts_limit); ts_limit -= EMPTY_RESULT_DELAY; for (i = delay_queue_first; i != delay_queue_last; i = (i + 1) % DELAY_QUEUE_LEN) { delay_buf_t *delay_buf = &delay_queue[i]; if (delay_buf->ts < ts_limit) { if (-1 == sendto(local_sock, delay_buf->buf, delay_buf->buflen, 0, delay_buf->addr, delay_buf->addrlen)) ERR("sendto"); free_delay(i); delay_queue_first = (delay_queue_first + 1) % DELAY_QUEUE_LEN; } else { break; } } }
static void schedule_delay(const char *buf, size_t buflen, struct sockaddr *addr, socklen_t addrlen) { time_t now; time(&now); delay_buf_t *delay_buf = &delay_queue[delay_queue_last]; delay_buf->ts = now; delay_buf->buf = malloc(buflen); memcpy(delay_buf->buf, buf, buflen); delay_buf->buflen = buflen; delay_buf->addr = malloc(addrlen); memcpy(delay_buf->addr, addr, addrlen); delay_buf->addrlen = addrlen; delay_queue_last = (delay_queue_last + 1) % DELAY_QUEUE_LEN; if (delay_queue_last == delay_queue_first) { free_delay(delay_queue_first); delay_queue_first = (delay_queue_first + 1) % DELAY_QUEUE_LEN; } }