/*----- Main code ---------------------------------------------------------*/
+static void checktimers(void)
+{
+ sel_timer *t, **tt;
+
+ tt = &sel.timers;
+ while (*tt) {
+ assert((*tt)->prev == tt);
+ tt = &(*tt)->next;
+ }
+}
+
/* --- @p_pingtype@ --- *
*
* Arguments: @unsigned msg@ = message type
void p_pingdone(ping *p, int rc)
{
- if (!p->p) return;
if (p->prev) p->prev->next = p->next;
else p->p->pings = p->next;
if (p->next) p->next->prev = p->prev;
if (rc != PING_TIMEOUT) sel_rmtimer(&p->t);
- p->p = 0;
+ T( trace(T_PEER, "peer: ping 0x%08lx done (rc = %d)",
+ (unsigned long)p->id, rc); )
+checktimers();
if (rc >= 0) p->func(rc, p->arg);
}
pg->p = p;
pg->func = func;
pg->arg = arg;
+ if (p->pings) p->pings->prev = pg;
p->pings = pg;
gettimeofday(&tv, 0);
tv.tv_sec += timeout;
sel_addtimer(&sel, &pg->t, &tv, p_pingtimeout, pg);
+checktimers();
T( trace(T_PEER, "peer: send %s 0x%08lx to %s",
p_pingtype(type), (unsigned long)pg->id, p->spec.name); )
return (0);
const char *p_name(peer *p) { return (p->spec.name); }
+/* --- @p_spec@ --- *
+ *
+ * Arguments: @peer *p@ = pointer to a peer block
+ *
+ * Returns: Pointer to the peer's specification
+ */
+
+const peerspec *p_spec(peer *p) { return (&p->spec); }
+
/* --- @p_find@ --- *
*
* Arguments: @const char *name@ = name to look up