hwclock: size optimizations

libbb/time.c: new file, introducing monotonic_us()
pscan, traceroute, arping: use it instead of gettimeofday
ping, zcip: TODO

function                                             old     new   delta
monotonic_us                                           -      89     +89
find_pair                                            164     180     +16
.rodata                                           129747  129763     +16
refresh                                             1144    1152      +8
............
timeout                                                8       4      -4
static.start                                           8       4      -4
last                                                   8       4      -4
parse_conf                                          1303    1284     -19
time_main                                           1149    1124     -25
gettimeofday_us                                       39       -     -39
arping_main                                         2042    1969     -73
hwclock_main                                         594     501     -93
catcher                                              485     380    -105
traceroute_main                                     4300    4117    -183
------------------------------------------------------------------------------
(add/remove: 2/1 grow/shrink: 8/11 up/down: 157/-562)        Total: -405 bytes
This commit is contained in:
Denis Vlasenko
2007-06-17 19:09:05 +00:00
parent e79dd06782
commit 459be35234
10 changed files with 228 additions and 260 deletions

View File

@@ -275,7 +275,8 @@ struct hostinfo {
struct outdata {
unsigned char seq; /* sequence number of this packet */
unsigned char ttl; /* ttl packet left with */
struct timeval tv ATTRIBUTE_PACKED; /* time packet left */
// UNUSED. Retaining to have the same packet size.
struct timeval tv_UNUSED ATTRIBUTE_PACKED; /* time packet left */
};
struct IFADDRLIST {
@@ -533,37 +534,19 @@ findsaddr(const struct sockaddr_in *to, struct sockaddr_in *from)
*/
/*
* Subtract 2 timeval structs: out = out - in.
* Out is assumed to be >= in.
*/
static inline void
tvsub(struct timeval *out, struct timeval *in)
{
if ((out->tv_usec -= in->tv_usec) < 0) {
--out->tv_sec;
out->tv_usec += 1000000;
}
out->tv_sec -= in->tv_sec;
}
static int
wait_for_reply(int sock, struct sockaddr_in *fromp, const struct timeval *tp)
wait_for_reply(int sock, struct sockaddr_in *fromp)
{
fd_set fds;
struct timeval now, tvwait;
struct timezone tz;
struct timeval tvwait;
int cc = 0;
socklen_t fromlen = sizeof(*fromp);
FD_ZERO(&fds);
FD_SET(sock, &fds);
tvwait.tv_sec = tp->tv_sec + waittime;
tvwait.tv_usec = tp->tv_usec;
(void)gettimeofday(&now, &tz);
tvsub(&tvwait, &now);
tvwait.tv_sec = waittime;
tvwait.tv_usec = 0;
if (select(sock + 1, &fds, NULL, NULL, &tvwait) > 0)
cc = recvfrom(sock, (char *)packet, sizeof(packet), 0,
@@ -609,7 +592,7 @@ in_cksum(uint16_t *addr, int len)
static void
send_probe(int seq, int ttl, struct timeval *tp)
send_probe(int seq, int ttl)
{
int cc;
struct udpiphdr *ui, *oui;
@@ -633,7 +616,8 @@ send_probe(int seq, int ttl, struct timeval *tp)
/* Payload */
outdata->seq = seq;
outdata->ttl = ttl;
memcpy(&outdata->tv, tp, sizeof(outdata->tv));
// UNUSED: was storing gettimeofday's result there, but never ever checked it
/*memcpy(&outdata->tv, tp, sizeof(outdata->tv));*/
#if ENABLE_FEATURE_TRACEROUTE_USE_ICMP
if (useicmp)
@@ -706,7 +690,6 @@ send_probe(int seq, int ttl, struct timeval *tp)
packlen, (struct sockaddr *)&whereto, sizeof(whereto));
if (cc != packlen) {
bb_info_msg("wrote %s %d chars, ret=%d", hostname, packlen, cc);
// (void)fflush(stdout);
}
}
@@ -908,9 +891,9 @@ getaddr(uint32_t *ap, const char *host)
#endif
static void
print_delta_ms(struct timeval *t1p, struct timeval *t2p)
print_delta_ms(unsigned t1p, unsigned t2p)
{
unsigned tt = (t2p->tv_sec - t1p->tv_sec) * 1000000 + (t2p->tv_usec - t1p->tv_usec);
unsigned tt = t2p - t1p;
printf(" %u.%03u ms", tt/1000, tt%1000);
}
@@ -1230,17 +1213,17 @@ int traceroute_main(int argc, char **argv)
printf("%2d ", ttl);
for (probe = 0; probe < nprobes; ++probe) {
int cc;
struct timeval t1, t2;
struct timezone tz;
unsigned t1;
unsigned t2;
struct ip *ip;
if (sentfirst && pausemsecs > 0)
usleep(pausemsecs * 1000);
(void)gettimeofday(&t1, &tz);
send_probe(++seq, ttl, &t1);
t1 = monotonic_us();
send_probe(++seq, ttl);
++sentfirst;
while ((cc = wait_for_reply(s, from, &t1)) != 0) {
(void)gettimeofday(&t2, &tz);
while ((cc = wait_for_reply(s, from)) != 0) {
t2 = monotonic_us();
i = packet_ok(packet, cc, from, seq);
/* Skip short packet */
if (i == 0)
@@ -1251,7 +1234,7 @@ int traceroute_main(int argc, char **argv)
lastaddr = from->sin_addr.s_addr;
++gotlastaddr;
}
print_delta_ms(&t1, &t2);
print_delta_ms(t1, t2);
ip = (struct ip *)packet;
if (op & OPT_TTL_FLAG)
printf(" (%d)", ip->ip_ttl);