1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
diff --git a/trickle-overload.c b/trickle-overload.c
index e72eb0c..9254e89 100644
--- a/trickle-overload.c
+++ b/trickle-overload.c
@@ -393,18 +393,14 @@ struct _pollfd {
}
static struct delay *
-select_shift(struct delayhead *dhead, struct timeval *inittv,
+select_shift(struct delayhead *dhead, struct timeval *difftv,
struct timeval **delaytv)
{
- struct timeval curtv, difftv;
struct delay *d;
struct sockdesc *sd;
- gettimeofday(&curtv, NULL);
- timersub(&curtv, inittv, &difftv);
-
TAILQ_FOREACH(d, dhead, next) {
- if (timercmp(&d->delaytv, &difftv, >))
+ if (timercmp(&d->delaytv, difftv, >))
break;
sd = d->sd;
@@ -413,7 +409,7 @@ struct _pollfd {
}
if (d != NULL)
- timersub(&d->delaytv, &difftv, *delaytv);
+ timersub(&d->delaytv, difftv, *delaytv);
else
*delaytv = NULL;
@@ -431,8 +427,8 @@ struct _pollfd {
{
struct sockdesc *sd;
fd_set *fdsets[] = { wfds, rfds }, *fds;
- struct timeval *delaytv, *selecttv = NULL, *timeout = NULL, _timeout,
- inittv, curtv, difftv;
+ struct timeval *delaytv, _delaytv, *selecttv = NULL, *timeout = NULL,
+ _timeout, inittv, curtv, difftv;
short which;
struct delayhead dhead;
struct delay *d, *_d;
@@ -462,15 +458,18 @@ struct _pollfd {
FD_ISSET(sd->sock, fds) &&
select_delay(&dhead, sd, which)) {
FD_CLR(sd->sock, fds);
- nfds--;
}
gettimeofday(&inittv, NULL);
curtv = inittv;
d = TAILQ_FIRST(&dhead);
- delaytv = d != NULL ? &d->delaytv : NULL;
+ if (d != NULL) {
+ _delaytv = d->delaytv;
+ delaytv = &_delaytv;
+ } else
+ delaytv = NULL;
+ timersub(&curtv, &inittv, &difftv);
again:
- timersub(&inittv, &curtv, &difftv);
selecttv = NULL;
if (delaytv != NULL)
@@ -498,15 +497,15 @@ struct _pollfd {
#endif /* DEBUG */
if (ret == 0 && delaytv != NULL && selecttv == delaytv) {
- _d = select_shift(&dhead, &inittv, &delaytv);
+ gettimeofday(&curtv, NULL);
+ timersub(&curtv, &inittv, &difftv);
+ _d = select_shift(&dhead, &difftv, &delaytv);
while ((d = TAILQ_FIRST(&dhead)) != _d) {
FD_SET(d->sd->sock, fdsets[d->which]);
- nfds++;
TAILQ_REMOVE(&dhead, d, next);
free(d);
}
- gettimeofday(&curtv, NULL);
goto again;
}
|