Beispiel #1
0
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;
    }
  }
}
Beispiel #2
0
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;
    }
  }
}
Beispiel #3
0
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;
        }
    }
}
Beispiel #4
0
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;
    }
}