CBDATA_TYPE(peer);
+static const char *const T_MILLISECOND_STR = "millisecond";
static const char *const T_SECOND_STR = "second";
static const char *const T_MINUTE_STR = "minute";
static const char *const T_HOUR_STR = "hour";
static void update_maxobjsize(void);
static void configDoConfigure(void);
static void parse_refreshpattern(refresh_t **);
-static int parseTimeUnits(const char *unit);
-static void parseTimeLine(time_t * tptr, const char *units);
+static uint64_t parseTimeUnits(const char *unit);
+static void parseTimeLine(time_msec_t * tptr, const char *units);
static void parse_ushort(u_short * var);
static void parse_string(char **);
static void default_all(void);
/* Parse a time specification from the config file. Store the
* result in 'tptr', after converting it to 'units' */
static void
-parseTimeLine(time_t * tptr, const char *units)
+parseTimeLine(time_msec_t * tptr, const char *units)
{
char *token;
double d;
- time_t m;
- time_t u;
+ time_msec_t m;
+ time_msec_t u;
if ((u = parseTimeUnits(units)) == 0)
self_destruct();
else if ((m = parseTimeUnits(token)) == 0)
self_destruct();
- *tptr = static_cast<time_t> (m * d / u);
+ *tptr = static_cast<time_msec_t>(m * d);
}
-static int
+static uint64_t
parseTimeUnits(const char *unit)
{
- if (!strncasecmp(unit, T_SECOND_STR, strlen(T_SECOND_STR)))
+ if (!strncasecmp(unit, T_MILLISECOND_STR, strlen(T_MILLISECOND_STR)))
return 1;
+ if (!strncasecmp(unit, T_SECOND_STR, strlen(T_SECOND_STR)))
+ return 1000;
+
if (!strncasecmp(unit, T_MINUTE_STR, strlen(T_MINUTE_STR)))
- return 60;
+ return 60 * 1000;
if (!strncasecmp(unit, T_HOUR_STR, strlen(T_HOUR_STR)))
- return 3600;
+ return 3600 * 1000;
if (!strncasecmp(unit, T_DAY_STR, strlen(T_DAY_STR)))
- return 86400;
+ return 86400 * 1000;
if (!strncasecmp(unit, T_WEEK_STR, strlen(T_WEEK_STR)))
- return 86400 * 7;
+ return 86400 * 7 * 1000;
if (!strncasecmp(unit, T_FORTNIGHT_STR, strlen(T_FORTNIGHT_STR)))
- return 86400 * 14;
+ return 86400 * 14 * 1000;
if (!strncasecmp(unit, T_MONTH_STR, strlen(T_MONTH_STR)))
- return 86400 * 30;
+ return static_cast<uint64_t>(86400) * 30 * 1000;
if (!strncasecmp(unit, T_YEAR_STR, strlen(T_YEAR_STR)))
- return static_cast<int>(86400 * 365.2522);
+ return static_cast<uint64_t>(86400 * 1000 * 365.2522);
if (!strncasecmp(unit, T_DECADE_STR, strlen(T_DECADE_STR)))
- return static_cast<int>(86400 * 365.2522 * 10);
+ return static_cast<uint64_t>(86400 * 1000 * 365.2522 * 10);
debugs(3, 1, "parseTimeUnits: unknown time unit '" << unit << "'");
void
parse_time_t(time_t * var)
{
- parseTimeLine(var, T_SECOND_STR);
+ time_msec_t tval;
+ parseTimeLine(&tval, T_SECOND_STR);
+ *var = static_cast<time_t>(tval/1000);
}
static void
*var = 0;
}
+static void
+dump_time_msec(StoreEntry * entry, const char *name, time_msec_t var)
+{
+ if (var % 1000)
+ storeAppendPrintf(entry, "%s %"PRId64" milliseconds\n", name, var);
+ else
+ storeAppendPrintf(entry, "%s %d seconds\n", name, (int)(var/1000) );
+}
+
+void
+parse_time_msec(time_msec_t * var)
+{
+ parseTimeLine(var, T_SECOND_STR);
+}
+
+static void
+free_time_msec(time_msec_t * var)
+{
+ *var = 0;
+}
+
#if UNUSED_CODE
static void
dump_size_t(StoreEntry * entry, const char *name, size_t var)
if (NULL == lru_list.tail)
return;
- eventAdd("idnsCheckQueue", idnsCheckQueue, NULL, 1.0, 1);
+ const double when = min(Config.Timeout.idns_query, Config.Timeout.idns_retransmit)/1000.0;
+
+ eventAdd("idnsCheckQueue", idnsCheckQueue, NULL, when, 1);
event_queued = 1;
}
vc->busy = 1;
- commSetTimeout(vc->fd, Config.Timeout.idns_query, NULL, NULL);
+ // Comm needs seconds but idnsCheckQueue() will check the exact timeout
+ const int timeout = (Config.Timeout.idns_query % 1000 ?
+ Config.Timeout.idns_query + 1000 : Config.Timeout.idns_query) / 1000;
+
+ commSetTimeout(vc->fd, timeout, NULL, NULL);
AsyncCall::Pointer call = commCbCall(78, 5, "idnsSentQueryVC",
CommIoCbPtrFun(&idnsSentQueryVC, vc));
q = static_cast<idns_query*>(n->data);
/* Anything to process in the queue? */
- if (tvSubDsec(q->queue_t, current_time) < Config.Timeout.idns_retransmit )
+ if ((time_msec_t)tvSubMsec(q->queue_t, current_time) < Config.Timeout.idns_retransmit )
break;
/* Query timer expired? */
- if (tvSubDsec(q->sent_t, current_time) < Config.Timeout.idns_retransmit * 1 << ((q->nsends - 1) / nns)) {
+ if ((time_msec_t)tvSubMsec(q->sent_t, current_time) < (Config.Timeout.idns_retransmit * 1 << ((q->nsends - 1) / nns))) {
dlinkDelete(&q->lru, &lru_list);
q->queue_t = current_time;
dlinkAdd(q, &q->lru, &lru_list);
dlinkDelete(&q->lru, &lru_list);
- if (tvSubDsec(q->start_t, current_time) < Config.Timeout.idns_query) {
+ if ((time_msec_t)tvSubMsec(q->start_t, current_time) < Config.Timeout.idns_query) {
idnsSendQuery(q);
} else {
debugs(78, 2, "idnsCheckQueue: ID " << q->xact_id <<