|
|
@@ -556,56 +556,46 @@ static void *_dns_client_work(void *arg)
|
|
|
int num = 0;
|
|
|
int i = 0;
|
|
|
unsigned long now = {0};
|
|
|
- unsigned long last = {0};
|
|
|
unsigned int msec = 0;
|
|
|
unsigned int sleep = 100;
|
|
|
int sleep_time = 0;
|
|
|
unsigned long expect_time = 0;
|
|
|
- int unused __attribute__((unused));
|
|
|
+ unsigned long start_time = 0;
|
|
|
|
|
|
- sleep_time = sleep;
|
|
|
- now = get_tick_count() - sleep;
|
|
|
- last = now;
|
|
|
+ now = get_tick_count();
|
|
|
+ start_time = now;
|
|
|
expect_time = now + sleep;
|
|
|
+
|
|
|
while (atomic_read(&client.run)) {
|
|
|
now = get_tick_count();
|
|
|
- if (sleep_time > 0) {
|
|
|
- sleep_time -= now - last;
|
|
|
- if (sleep_time <= 0) {
|
|
|
- sleep_time = 0;
|
|
|
- }
|
|
|
-
|
|
|
- int cnt = sleep_time / sleep;
|
|
|
- msec -= cnt;
|
|
|
- expect_time -= cnt * sleep;
|
|
|
- sleep_time -= cnt * sleep;
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
if (now >= expect_time) {
|
|
|
- msec++;
|
|
|
- if (last != now) {
|
|
|
- _dns_client_period_run(msec);
|
|
|
+ unsigned long elapsed_from_start = now - start_time;
|
|
|
+ unsigned int current_period = (elapsed_from_start + sleep / 2) / sleep;
|
|
|
+
|
|
|
+ if (current_period > msec) {
|
|
|
+ msec = current_period;
|
|
|
}
|
|
|
-
|
|
|
- sleep_time = sleep - (now - expect_time);
|
|
|
- if (sleep_time < 0) {
|
|
|
- sleep_time = 0;
|
|
|
- expect_time = now;
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
+ expect_time = start_time + (msec + 1) * sleep;
|
|
|
+ _dns_client_period_run(msec);
|
|
|
+ msec++;
|
|
|
+
|
|
|
/* When client is idle, the sleep time is 1000ms, to reduce CPU usage */
|
|
|
pthread_mutex_lock(&client.domain_map_lock);
|
|
|
if (list_empty(&client.dns_request_list)) {
|
|
|
- int cnt = 10 - (msec % 10) - 1;
|
|
|
- sleep_time += sleep * cnt;
|
|
|
- msec += cnt;
|
|
|
- /* sleep to next second */
|
|
|
- expect_time += sleep * cnt;
|
|
|
+ if (msec % 10 != 0) {
|
|
|
+ msec = ((msec / 10) + 1) * 10;
|
|
|
+ expect_time = start_time + msec * sleep;
|
|
|
+ }
|
|
|
}
|
|
|
pthread_mutex_unlock(&client.domain_map_lock);
|
|
|
- expect_time += sleep;
|
|
|
}
|
|
|
- last = now;
|
|
|
+
|
|
|
+ sleep_time = (int)(expect_time - now);
|
|
|
+ if (sleep_time < 0) {
|
|
|
+ sleep_time = 0;
|
|
|
+ }
|
|
|
|
|
|
num = epoll_wait(client.epoll_fd, events, DNS_MAX_EVENTS, sleep_time);
|
|
|
if (num < 0) {
|