*/
#define STATE_MACHINE_DECL(_x) static void _x(REQUEST *request, int action)
+#define STATE_MACHINE_TIMER(_x) request->timer_action = _x; \
+ fr_event_insert(el, request_timer, request, \
+ &when, &request->ev);
+
+
/**
* @section request_timeline
static void request_timer(void *ctx)
{
REQUEST *request = ctx;
-#ifdef DEBUG_STATE_MACHINE
- int action = FR_ACTION_TIMER;
-#endif
+ int action = request->timer_action;
TRACE_STATE_MACHINE;
- request->process(request, FR_ACTION_TIMER);
+ request->process(request, action);
}
#define USEC (1000000)
*/
STATE_MACHINE_DECL(request_done)
{
- struct timeval now;
+ struct timeval now, when;
TRACE_STATE_MACHINE;
* avoid re-use of proxy IDs for a while.
*/
if (request->in_proxy_hash) {
- struct timeval when;
-
rad_assert(request->proxy != NULL);
fr_event_now(el, &now);
RDEBUG("Waiting for child thread to stop");
}
#endif
- tv_add(&now, request->delay);
+
+ when = now;
+ tv_add(&when, request->delay);
request->delay += request->delay >> 1;
if (request->delay > (10 * USEC)) request->delay = 10 * USEC;
- fr_event_insert(el, request_timer, request, &now,
- &request->ev);
+
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
return;
}
when = now;
tv_add(&when, request->delay);
request->delay += request->delay >> 1;
- fr_event_insert(el, request_timer, request,
- &when, &request->ev);
+
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
return;
}
#endif
request->process = request_reject_delay;
- fr_event_insert(el, request_timer, request,
- &when, &request->ev);
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
return;
}
#endif
request->process = request_cleanup_delay;
- fr_event_insert(el, request_timer, request,
- &when, &request->ev);
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
return;
}
}
static void request_queue_or_run(UNUSED REQUEST *request,
fr_request_process_t process)
{
- struct timeval now;
+ struct timeval when;
#ifdef DEBUG_STATE_MACHINE
int action = FR_ACTION_TIMER;
#endif
* (re) set the initial delay.
*/
request->delay = USEC / 3;
- gettimeofday(&now, NULL);
- tv_add(&now, request->delay);
+ gettimeofday(&when, NULL);
+ tv_add(&when, request->delay);
request->delay += request->delay >> 1;
- fr_event_insert(el, request_timer, request, &now,
- &request->ev);
+
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
/*
* Do this here so that fewer other functions need to do
when = request->reply->timestamp;
request->delay += request->delay ;
when.tv_sec += request->delay;
- fr_event_insert(el, request_timer, request,
- &when, &request->ev);
+
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
return;
#ifdef WITH_PROXY
DEBUG("PING: Waiting %u seconds for response to ping",
home->ping_timeout);
- fr_event_insert(el, request_timer, request, &when,
- &request->ev);
+
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
home->num_sent_pings++;
rad_assert(request->proxy_listener != NULL);
* that.
*/
if (timercmp(&when, &now, >)) {
- fr_event_insert(el, request_timer, request,
- &when, &request->ev);
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
return;
}
tv_add(&when, delay);
if (timercmp(&when, &now, >)) {
- fr_event_insert(el, request_timer, request, &when,
- &request->ev);
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
return;
}
}
if (timercmp(&mrd, &when, <)) {
when = mrd;
}
- fr_event_insert(el, request_timer, request, &when, &request->ev);
+ STATE_MACHINE_TIMER(FR_ACTION_TIMER);
request->num_coa_requests++; /* is NOT reset by code 3 lines above! */