--- AnyEvent-FastPing/FastPing.xs 2009/07/03 09:26:19 1.5 +++ AnyEvent-FastPing/FastPing.xs 2009/07/18 00:53:42 1.6 @@ -184,6 +184,9 @@ REQ *req; int len = read (thr_send [0], &req, sizeof (req)); + tstamp now = NOW (); + tstamp next = now; + if (!len) pthread_exit (0); else if (len != sizeof (req)) @@ -199,9 +202,6 @@ pkt.seq = (uint16_t)~magic; pkt.payload = req->payload; - tstamp now = NOW (); - tstamp next = now; - { int r; for (r = req->nranges; r--; ) @@ -211,6 +211,7 @@ while (req->nranges) { RANGE *range = req->ranges; + int n, k; if (!memcmp (&range->lo, &range->hi, sizeof (addr_t))) req->ranges [0] = req->ranges [--req->nranges]; @@ -291,13 +292,12 @@ } // make a downheap operation - int k = 0; - int n = 0; - for (;;) + for (n = k = 0; ; ) { - ++n; int j = k * 2 + 1; + ++n; + if (j >= req->nranges) break; else if (j < req->nranges - 1) @@ -307,9 +307,11 @@ if (req->ranges [j].next >= req->ranges [k].next) break; - RANGE temp = req->ranges [k]; - req->ranges [k] = req->ranges [j]; - req->ranges [j] = temp; + { + RANGE temp = req->ranges [k]; + req->ranges [k] = req->ranges [j]; + req->ranges [j] = temp; + } k = j; } @@ -324,13 +326,13 @@ static void feed_reply (AV *res_av) { - if (av_len (res_av) < 0) - return; - dSP; SV *res = sv_2mortal (newRV_inc ((SV *)res_av)); int i; + if (av_len (res_av) < 0) + return; + ENTER; SAVETMPS; @@ -429,14 +431,17 @@ _req_icmp_ping (SV *ranges, NV interval, U32 payload, SV *id) CODE: { + AV *rav; + int nranges, i; + REQ *req; + if (!SvROK (ranges) || SvTYPE (SvRV (ranges)) != SVt_PVAV) croak ("address ranges must be given as arrayref with lo, hi pairs"); - AV *rav = (AV *)SvRV (ranges); - int nranges = av_len (rav) + 1; + rav = (AV *)SvRV (ranges); + nranges = av_len (rav) + 1; - REQ *req = malloc (sizeof (REQ)); - int i; + req = malloc (sizeof (REQ)); if (interval < MIN_INTERVAL) interval = MIN_INTERVAL; @@ -450,15 +455,18 @@ while (nranges--) { SV *sv = *av_fetch (rav, nranges, 1); + SV *lo, *hi; + AV *av; + RANGE *r; if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV) croak ("address range must be given as arrayref with lo, hi, interval arrayrefs"); - AV *av = (AV *)SvRV (sv); - RANGE *r = req->ranges + nranges; + av = (AV *)SvRV (sv); + r = req->ranges + nranges; - SV *lo = *av_fetch (av, 0, 1); - SV *hi = *av_fetch (av, 1, 1); + lo = *av_fetch (av, 0, 1); + hi = *av_fetch (av, 1, 1); sv_utf8_downgrade (lo, 0); sv_utf8_downgrade (hi, 0); @@ -492,9 +500,10 @@ } else if (SvIOK (lo) && SvIOK (hi)) { + uint32_t addr; + r->family = AF_INET; - uint32_t addr; addr = htonl (SvUV (lo)); memcpy (sizeof (addr_t) - 4 + (char *)&r->lo, &addr, 4); addr = htonl (SvUV (hi)); memcpy (sizeof (addr_t) - 4 + (char *)&r->hi, &addr, 4); } @@ -553,15 +562,16 @@ for (;;) { + IP4HDR *iphdr = (IP4HDR *)buf; int len = recvfrom (icmp4_fd, buf, sizeof (buf), MSG_TRUNC, (struct sockaddr *)&sa, &sl); + int hdrlen, totlen; + PKT *pkt; if (len <= HDR_SIZE_IP4) break; - IP4HDR *iphdr = (IP4HDR *)buf; - - int hdrlen = (iphdr->version_ihl & 15) * 4; - int totlen = ntohs (iphdr->tot_len); + hdrlen = (iphdr->version_ihl & 15) * 4; + totlen = ntohs (iphdr->tot_len); // packet corrupt? if (!res_av @@ -570,7 +580,7 @@ || hdrlen < HDR_SIZE_IP4 || hdrlen + sizeof (PKT) != totlen) continue; - PKT *pkt = (PKT *)(buf + hdrlen); + pkt = (PKT *)(buf + hdrlen); if (pkt->type != ICMP4_ECHO_REPLY || pkt->id != (uint16_t) magic @@ -578,12 +588,14 @@ || !isnormal (pkt->stamp)) continue; - AV *av = newAV (); - av_push (av, newSVpvn ((char *)&sa.sin_addr, 4)); - av_push (av, newSVnv (now - pkt->stamp)); - av_push (av, newSVuv (pkt->payload)); + { + AV *av = newAV (); + av_push (av, newSVpvn ((char *)&sa.sin_addr, 4)); + av_push (av, newSVnv (now - pkt->stamp)); + av_push (av, newSVuv (pkt->payload)); - av_push (res_av, newRV_noinc ((SV *)av)); + av_push (res_av, newRV_noinc ((SV *)av)); + } } if (res_av) @@ -614,12 +626,14 @@ || !isnormal (pkt.stamp)) continue; - AV *av = newAV (); - av_push (av, newSVpvn ((char *)&sa.sin6_addr, 16)); - av_push (av, newSVnv (now - pkt.stamp)); - av_push (av, newSVuv (pkt.payload)); + { + AV *av = newAV (); + av_push (av, newSVpvn ((char *)&sa.sin6_addr, 16)); + av_push (av, newSVnv (now - pkt.stamp)); + av_push (av, newSVuv (pkt.payload)); - av_push (res_av, newRV_noinc ((SV *)av)); + av_push (res_av, newRV_noinc ((SV *)av)); + } } if (res_av)