diff options
author | /C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org </C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org> | 2008-01-22 01:25:34 +0000 |
---|---|---|
committer | /C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org </C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org> | 2008-01-22 01:25:34 +0000 |
commit | 6174e60abbcdc5b62a52fc03c373cee0b77ebcbf (patch) | |
tree | 0252f43ec5eea34b479d06d4fbe9bfbcead5aad6 /src | |
parent | d6f29c81c1452db525d12110d5f15f7f39df9b86 (diff) | |
download | conntrack-tools-6174e60abbcdc5b62a52fc03c373cee0b77ebcbf.tar.gz conntrack-tools-6174e60abbcdc5b62a52fc03c373cee0b77ebcbf.zip |
Max Kellermann <max@duempel.org>:
- Pass next_alarm to __run() only if there is an alarm
- Eliminate the "timeout" parameter
- the alarm functions get_next_alarm_run() and do_alarm_run() return an timeval pointer instead of a boolean
Diffstat (limited to 'src')
-rw-r--r-- | src/alarm.c | 12 | ||||
-rw-r--r-- | src/run.c | 44 |
2 files changed, 21 insertions, 35 deletions
diff --git a/src/alarm.c b/src/alarm.c index 2190bb6..883a42c 100644 --- a/src/alarm.c +++ b/src/alarm.c @@ -74,7 +74,7 @@ void del_alarm(struct alarm_list *alarm) } } -static int +static struct timeval * calculate_next_run(struct timeval *cand, struct timeval *tv, struct timeval *next_run) @@ -87,12 +87,13 @@ calculate_next_run(struct timeval *cand, next_run->tv_sec = 0; next_run->tv_usec = 0; } - return 1; + return next_run; } - return 0; + return NULL; } -int get_next_alarm_run(struct timeval *next_run) +struct timeval * +get_next_alarm_run(struct timeval *next_run) { int i; struct alarm_list *t; @@ -133,7 +134,8 @@ tv_compare(struct alarm_list *a, struct timeval *cur, struct timeval *cand) return 0; } -int do_alarm_run(struct timeval *next_run) +struct timeval * +do_alarm_run(struct timeval *next_run) { int i; struct alarm_list *t, *next, *prev; @@ -158,15 +158,10 @@ init(void) return 0; } -static int __run(struct timeval *next_alarm, int *timeout) +static void __run(struct timeval *next_alarm) { int max, ret; fd_set readfds; - struct timeval *tmp = next_alarm; - - /* No alarms, select must block */ - if (*timeout == 0) - tmp = NULL; FD_ZERO(&readfds); FD_SET(STATE(local), &readfds); @@ -177,21 +172,17 @@ static int __run(struct timeval *next_alarm, int *timeout) if (STATE(mode)->add_fds_to_set) max = MAX(max, STATE(mode)->add_fds_to_set(&readfds)); - ret = select(max+1, &readfds, NULL, NULL, tmp); + ret = select(max+1, &readfds, NULL, NULL, next_alarm); if (ret == -1) { /* interrupted syscall, retry */ if (errno == EINTR) - return 0; + return; dlog(LOG_WARNING, "select failed: %s", strerror(errno)); - return 0; + return; } - /* timeout expired, run the alarm list */ - if (tmp != NULL && !timerisset(tmp)) - return 1; - /* signals are racy */ sigprocmask(SIG_BLOCK, &STATE(block), NULL); @@ -235,33 +226,26 @@ static int __run(struct timeval *next_alarm, int *timeout) if (STATE(mode)->run) STATE(mode)->run(&readfds); - /* check if we have introduced any new alarms */ - if (*timeout == 0 && alarm_counter > 0) { - *timeout = 1; - if (!get_next_alarm_run(next_alarm)) - dlog(LOG_ERR, "Bug in alarm?"); - return 0; - } - sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); - - return 0; } void __attribute__((noreturn)) run(void) { - int timeout; struct timeval next_alarm; + struct timeval *next; /* initialization: get the next alarm available */ - timeout = get_next_alarm_run(&next_alarm); + next = get_next_alarm_run(&next_alarm); while(1) { - if (__run(&next_alarm, &timeout)) { - sigprocmask(SIG_BLOCK, &STATE(block), NULL); - timeout = do_alarm_run(&next_alarm); - sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); - } + __run(next); + + sigprocmask(SIG_BLOCK, &STATE(block), NULL); + if (next != NULL && !timerisset(next)) + next = do_alarm_run(&next_alarm); + else + next = get_next_alarm_run(&next_alarm); + sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); } } |