AnyEvent-FastPing
view release on metacpan or search on metacpan
FastPing.xs view on Meta::CPAN
&& self->ranges [j]->next > self->ranges [j + 1]->next)
++j;
if (self->ranges [j]->next >= elem->next)
break;
self->ranges [k] = self->ranges [j];
k = j;
}
self->ranges [k] = elem;
}
static void
upheap (PINGER *self, int k)
{
RANGE *elem = self->ranges [k];
while (k)
{
int j = (k - 1) >> 1;
if (self->ranges [j]->next <= elem->next)
break;
self->ranges [k] = self->ranges [j];
k = j;
}
self->ranges [k] = elem;
}
static void *
ping_proc (void *self_)
{
PINGER *self = (PINGER *)self_;
PKT pkt;
memset (&pkt, 0, sizeof (pkt));
tstamp now = NOW ();
pkt.code = 0;
pkt.id = self->magic1;
pkt.seq = self->magic2;
pkt.magic = self->magic3;
pkt.pinger = self->id;
if (self->next < now)
self->next = now;
while (self->rangecnt)
{
RANGE *range = self->ranges [0];
// ranges [0] is always the next range to ping
tstamp wait = range->next - now;
// compare with the global frequency limit
{
tstamp diff = self->next - now;
if (wait < diff)
wait = diff; // global rate limit overrides
else
self->next = range->next; // fast forward
}
if (wait > 0.)
ssleep (wait);
now = NOW ();
ts_to_pkt (&pkt, now);
if (!range_send_ping (range, &pkt))
{
self->ranges [0] = self->ranges [--self->rangecnt];
range_free (range);
}
else
range->next = self->next + range->interval;
downheap (self);
self->next += self->interval;
now = NOW ();
}
ssleep (self->maxrtt);
{
uint16_t id = self->id;
write (thr_res [1], &id, sizeof (id));
}
return 0;
}
/*****************************************************************************/
/* NetBSD, Solaris... */
#ifndef PTHREAD_STACK_MIN
# define PTHREAD_STACK_MIN 0
#endif
static void
pinger_start (PINGER *self)
{
sigset_t fullsigset, oldsigset;
pthread_attr_t attr;
if (self->running)
return;
sigfillset (&fullsigset);
pthread_attr_init (&attr);
pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN < sizeof (long) * 2048 ? sizeof (long) * 2048 : PTHREAD_STACK_MIN);
pthread_sigmask (SIG_SETMASK, &fullsigset, &oldsigset);
if (pthread_create (&self->thrid, &attr, ping_proc, (void *)self))
( run in 0.778 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )