[master] b37c01d Since we're cleaning up, rename TIM_ to VTIM_ and take out of libvarnish.h

Poul-Henning Kamp phk at varnish-cache.org
Sun Oct 9 20:51:37 CEST 2011


commit b37c01dfe71edd703758f555fdc8c51554ab4993
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sun Oct 9 18:51:03 2011 +0000

    Since we're cleaning up, rename TIM_ to VTIM_ and take out of libvarnish.h

diff --git a/bin/varnishd/cache_acceptor.c b/bin/varnishd/cache_acceptor.c
index 87a9180..4feefb6 100644
--- a/bin/varnishd/cache_acceptor.c
+++ b/bin/varnishd/cache_acceptor.c
@@ -34,6 +34,7 @@
 
 #include "vcli.h"
 #include "vtcp.h"
+#include "vtim.h"
 #include "cli_priv.h"
 
 static pthread_t	VCA_thread;
@@ -167,7 +168,7 @@ vca_pace_check(void)
 	p = vca_pace;
 	Lck_Unlock(&pace_mtx);
 	if (p > 0.0)
-		TIM_sleep(p);
+		VTIM_sleep(p);
 }
 
 static void
@@ -273,7 +274,7 @@ VCA_SetupSess(struct worker *w)
 	sp->fd = wa->acceptsock;
 	sp->vsl_id = wa->acceptsock | VSL_CLIENTMARKER ;
 	wa->acceptsock = -1;
-	sp->t_open = TIM_real();
+	sp->t_open = VTIM_real();
 	sp->t_end = sp->t_open;
 	sp->mylsock = wa->acceptlsock;
 	CHECK_OBJ_NOTNULL(sp->mylsock, LISTEN_SOCK_MAGIC);
@@ -313,14 +314,14 @@ vca_acct(void *arg)
 	hack_ready = 1;
 
 	need_test = 1;
-	t0 = TIM_real();
+	t0 = VTIM_real();
 	while (1) {
 		(void)sleep(1);
 #ifdef SO_SNDTIMEO_WORKS
 		if (params->send_timeout != send_timeout) {
 			need_test = 1;
 			send_timeout = params->send_timeout;
-			tv_sndtimeo = TIM_timeval(send_timeout);
+			tv_sndtimeo = VTIM_timeval(send_timeout);
 			VTAILQ_FOREACH(ls, &heritage.socks, list) {
 				if (ls->sock < 0)
 					continue;
@@ -334,7 +335,7 @@ vca_acct(void *arg)
 		if (params->sess_timeout != sess_timeout) {
 			need_test = 1;
 			sess_timeout = params->sess_timeout;
-			tv_rcvtimeo = TIM_timeval(sess_timeout);
+			tv_rcvtimeo = VTIM_timeval(sess_timeout);
 			VTAILQ_FOREACH(ls, &heritage.socks, list) {
 				if (ls->sock < 0)
 					continue;
@@ -344,7 +345,7 @@ vca_acct(void *arg)
 			}
 		}
 #endif
-		now = TIM_real();
+		now = VTIM_real();
 		VSC_C_main->uptime = (uint64_t)(now - t0);
 	}
 	NEEDLESS_RETURN(NULL);
diff --git a/bin/varnishd/cache_backend_poll.c b/bin/varnishd/cache_backend_poll.c
index c90cda9..c9497bb 100644
--- a/bin/varnishd/cache_backend_poll.c
+++ b/bin/varnishd/cache_backend_poll.c
@@ -46,6 +46,7 @@
 #include "cache.h"
 #include "vrt.h"
 #include "vtcp.h"
+#include "vtim.h"
 #include "cache_backend.h"
 
 /* Default averaging rate, we want something pretty responsive */
@@ -131,28 +132,28 @@ vbp_poke(struct vbp_target *vt)
 	bp = vt->backend;
 	CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC);
 
-	t_start = t_now = TIM_real();
+	t_start = t_now = VTIM_real();
 	t_end = t_start + vt->probe.timeout;
 	tmo = (int)round((t_end - t_now) * 1e3);
 
 	s = -1;
 	if (params->prefer_ipv6 && bp->ipv6 != NULL) {
 		s = vbp_connect(PF_INET6, bp->ipv6, bp->ipv6len, tmo);
-		t_now = TIM_real();
+		t_now = VTIM_real();
 		tmo = (int)round((t_end - t_now) * 1e3);
 		if (s >= 0)
 			vt->good_ipv6 |= 1;
 	}
 	if (tmo > 0 && s < 0 && bp->ipv4 != NULL) {
 		s = vbp_connect(PF_INET, bp->ipv4, bp->ipv4len, tmo);
-		t_now = TIM_real();
+		t_now = VTIM_real();
 		tmo = (int)round((t_end - t_now) * 1e3);
 		if (s >= 0)
 			vt->good_ipv4 |= 1;
 	}
 	if (tmo > 0 && s < 0 && bp->ipv6 != NULL) {
 		s = vbp_connect(PF_INET6, bp->ipv6, bp->ipv6len, tmo);
-		t_now = TIM_real();
+		t_now = VTIM_real();
 		tmo = (int)round((t_end - t_now) * 1e3);
 		if (s >= 0)
 			vt->good_ipv6 |= 1;
@@ -208,7 +209,7 @@ vbp_poke(struct vbp_target *vt)
 		return;
 
 	/* So we have a good receive ... */
-	t_now = TIM_real();
+	t_now = VTIM_real();
 	vt->last = t_now - t_start;
 	vt->good_recv |= 1;
 
@@ -350,7 +351,7 @@ vbp_wrk_poll_backend(void *priv)
 		vbp_has_poked(vt);
 
 		if (!vt->stop)
-			TIM_sleep(vt->probe.interval);
+			VTIM_sleep(vt->probe.interval);
 	}
 	return (NULL);
 }
diff --git a/bin/varnishd/cache_ban.c b/bin/varnishd/cache_ban.c
index f346b4d..8396c7f 100644
--- a/bin/varnishd/cache_ban.c
+++ b/bin/varnishd/cache_ban.c
@@ -70,6 +70,7 @@
 
 #include "vcli.h"
 #include "vend.h"
+#include "vtim.h"
 #include "cli_priv.h"
 #include "hash_slinger.h"
 
@@ -402,7 +403,7 @@ BAN_Insert(struct ban *b)
 	b->spec = malloc(ln + 13L);	/* XXX */
 	XXXAN(b->spec);
 
-	t0 = TIM_real();
+	t0 = VTIM_real();
 	memcpy(b->spec, &t0, sizeof t0);
 	b->spec[12] = (b->flags & BAN_F_REQ) ? 1 : 0;
 	memcpy(b->spec + 13, VSB_data(b->vsb), ln);
@@ -835,10 +836,10 @@ ban_lurker(struct sess *sp, void *priv)
 	while (1) {
 		if (params->ban_lurker_sleep == 0.0) {
 			/* Lurker is disabled.  */
-			TIM_sleep(1.0);
+			VTIM_sleep(1.0);
 			continue;
 		}
-		TIM_sleep(params->ban_lurker_sleep);
+		VTIM_sleep(params->ban_lurker_sleep);
 		ban_lurker_work(sp);
 		WSL_Flush(sp->wrk, 0);
 		WRK_SumStat(sp->wrk);
diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
index 1415170..6ab8a11 100644
--- a/bin/varnishd/cache_center.c
+++ b/bin/varnishd/cache_center.c
@@ -71,6 +71,7 @@ DOT acceptor -> start [style=bold,color=green]
 
 #include "vcl.h"
 #include "vtcp.h"
+#include "vtim.h"
 #include "cli_priv.h"
 #include "hash_slinger.h"
 #include "stevedore.h"
@@ -211,7 +212,7 @@ cnt_prepresp(struct sess *sp)
 		}
 	}
 
-	sp->t_resp = TIM_real();
+	sp->t_resp = VTIM_real();
 	if (sp->obj->objcore != NULL) {
 		if ((sp->t_resp - sp->obj->last_lru) > params->lru_timeout &&
 		    EXP_Touch(sp->obj->objcore))
@@ -326,7 +327,7 @@ cnt_done(struct sess *sp)
 
 	SES_Charge(sp);
 
-	sp->t_end = TIM_real();
+	sp->t_end = VTIM_real();
 	sp->wrk->lastused = sp->t_end;
 	if (sp->xid == 0) {
 		sp->t_req = sp->t_end;
@@ -466,7 +467,7 @@ cnt_error(struct sess *sp)
 
 	http_PutProtocol(w, sp->vsl_id, h, "HTTP/1.1");
 	http_PutStatus(h, sp->err_code);
-	TIM_format(TIM_real(), date);
+	VTIM_format(VTIM_real(), date);
 	http_PrintfHeader(w, sp->vsl_id, h, "Date: %s", date);
 	http_PrintfHeader(w, sp->vsl_id, h, "Server: Varnish");
 
@@ -581,7 +582,7 @@ cnt_fetch(struct sess *sp)
 		 * What does RFC2616 think about TTL ?
 		 */
 		EXP_Clr(&sp->wrk->exp);
-		sp->wrk->exp.entered = TIM_real();
+		sp->wrk->exp.entered = VTIM_real();
 		RFC2616_Ttl(sp);
 
 		/* pass from vclrecv{} has negative TTL */
@@ -823,7 +824,7 @@ cnt_fetchbody(struct sess *sp)
 	http_CopyHome(sp->wrk, sp->vsl_id, hp2);
 
 	if (http_GetHdr(hp, H_Last_Modified, &b))
-		sp->obj->last_modified = TIM_parse(b);
+		sp->obj->last_modified = VTIM_parse(b);
 	else
 		sp->obj->last_modified = floor(sp->wrk->exp.entered);
 
@@ -1464,7 +1465,7 @@ cnt_start(struct sess *sp)
 
 	/* Update stats of various sorts */
 	sp->wrk->stats.client_req++;
-	sp->t_req = TIM_real();
+	sp->t_req = VTIM_real();
 	sp->wrk->lastused = sp->t_req;
 	sp->wrk->acct_tmp.req++;
 
diff --git a/bin/varnishd/cache_expire.c b/bin/varnishd/cache_expire.c
index 35d0a1e..aed6807 100644
--- a/bin/varnishd/cache_expire.c
+++ b/bin/varnishd/cache_expire.c
@@ -57,6 +57,7 @@
 #include "cache.h"
 #include "hash_slinger.h"
 #include "stevedore.h"
+#include "vtim.h"
 
 static pthread_t exp_thread;
 static struct binheap *exp_heap;
@@ -337,14 +338,14 @@ exp_timer(struct sess *sp, void *priv)
 	struct object *o;
 
 	(void)priv;
-	t = TIM_real();
+	t = VTIM_real();
 	oc = NULL;
 	while (1) {
 		if (oc == NULL) {
 			WSL_Flush(sp->wrk, 0);
 			WRK_SumStat(sp->wrk);
-			TIM_sleep(params->expiry_sleep);
-			t = TIM_real();
+			VTIM_sleep(params->expiry_sleep);
+			t = VTIM_real();
 		}
 
 		Lck_Lock(&exp_mtx);
@@ -360,7 +361,7 @@ exp_timer(struct sess *sp, void *priv)
 		 * got out of date, refresh it and check again.
 		 */
 		if (oc->timer_when > t)
-			t = TIM_real();
+			t = VTIM_real();
 		if (oc->timer_when > t) {
 			Lck_Unlock(&exp_mtx);
 			oc = NULL;
diff --git a/bin/varnishd/cache_pipe.c b/bin/varnishd/cache_pipe.c
index 74343ba..418ded1 100644
--- a/bin/varnishd/cache_pipe.c
+++ b/bin/varnishd/cache_pipe.c
@@ -36,6 +36,7 @@
 
 #include "cache.h"
 #include "vtcp.h"
+#include "vtim.h"
 
 static int
 rdf(int fd0, int fd1)
@@ -90,7 +91,7 @@ PipeSession(struct sess *sp)
 		return;
 	}
 
-	sp->t_resp = TIM_real();
+	sp->t_resp = VTIM_real();
 
 	memset(fds, 0, sizeof fds);
 
diff --git a/bin/varnishd/cache_pool.c b/bin/varnishd/cache_pool.c
index e146043..4421969 100644
--- a/bin/varnishd/cache_pool.c
+++ b/bin/varnishd/cache_pool.c
@@ -51,6 +51,7 @@
 #include "cache_waiter.h"
 #include "hash_slinger.h"
 #include "vtcp.h"
+#include "vtim.h"
 
 /*--------------------------------------------------------------------
  * MAC OS/X is incredibly moronic when it comes to time and such...
@@ -224,7 +225,7 @@ Pool_Work_Thread(void *priv, struct worker *w)
 		} else if (VTAILQ_EMPTY(&pp->socks)) {
 			/* Nothing to do: To sleep, perchance to dream ... */
 			if (isnan(w->lastused))
-				w->lastused = TIM_real();
+				w->lastused = VTIM_real();
 			VTAILQ_INSERT_HEAD(&pp->idle, w, list);
 			if (!stats_clean)
 				WRK_SumStat(w);
@@ -343,7 +344,7 @@ Pool_Schedule(struct pool *pp, struct sess *sp)
 	 * XXX: a notice might be polite, but would potentially
 	 * XXX: sleep whichever thread got us here
 	 */
-	sp->t_end = TIM_real();
+	sp->t_end = VTIM_real();
 	if (sp->vcl != NULL) {
 		/*
 		 * A session parked on a busy object can come here
@@ -401,10 +402,10 @@ pool_breed(struct pool *qp, const pthread_attr_t *tp_attr)
 			Lck_Lock(&pool_mtx);
 			VSC_C_main->threads_limited++;
 			Lck_Unlock(&pool_mtx);
-			TIM_sleep(params->wthread_fail_delay * 1e-3);
+			VTIM_sleep(params->wthread_fail_delay * 1e-3);
 		} else {
 			AZ(pthread_detach(tp));
-			TIM_sleep(params->wthread_add_delay * 1e-3);
+			VTIM_sleep(params->wthread_add_delay * 1e-3);
 			qp->nthr++;
 			Lck_Lock(&pool_mtx);
 			VSC_C_main->threads++;
@@ -476,7 +477,7 @@ pool_herder(void *priv)
 		if (pp->nthr <= params->wthread_min) 
 			continue;
 
-		t_idle = TIM_real() - params->wthread_timeout;
+		t_idle = VTIM_real() - params->wthread_timeout;
 
 		Lck_Lock(&pp->mtx);
 		VSC_C_main->sess_queued += pp->nqueued;
diff --git a/bin/varnishd/cache_response.c b/bin/varnishd/cache_response.c
index 4d7c88b..b4459da 100644
--- a/bin/varnishd/cache_response.c
+++ b/bin/varnishd/cache_response.c
@@ -38,6 +38,7 @@
 #include "cache.h"
 #include "stevedore.h"
 #include "vct.h"
+#include "vtim.h"
 
 /*--------------------------------------------------------------------*/
 
@@ -133,7 +134,7 @@ RES_BuildHttp(const struct sess *sp)
 		http_PrintfHeader(sp->wrk, sp->vsl_id, sp->wrk->resp,
 		    "Transfer-Encoding: chunked");
 
-	TIM_format(TIM_real(), time_str);
+	VTIM_format(VTIM_real(), time_str);
 	http_PrintfHeader(sp->wrk, sp->vsl_id, sp->wrk->resp, "Date: %s", time_str);
 
 	if (sp->xid != sp->obj->xid)
diff --git a/bin/varnishd/cache_shmlog.c b/bin/varnishd/cache_shmlog.c
index 8c06897..75f662d 100644
--- a/bin/varnishd/cache_shmlog.c
+++ b/bin/varnishd/cache_shmlog.c
@@ -34,6 +34,7 @@
 #include "cache.h"
 #include "vmb.h"
 #include "vsm.h"
+#include "vtim.h"
 
 /* These cannot be struct lock, which depends on vsm/vsl working */
 static pthread_mutex_t vsl_mtx;
@@ -285,7 +286,7 @@ VSL_Init(void)
 	vsl_ptr = vsl_start + 1;
 
 	vsl_wrap();
-	VSM_head->starttime = (intmax_t)TIM_real();
+	VSM_head->starttime = (intmax_t)VTIM_real();
 	memset(VSM_head->panicstr, '\0', sizeof *VSM_head->panicstr);
 	memset(VSC_C_main, 0, sizeof *VSC_C_main);
 	VSM_head->child_pid = getpid();
diff --git a/bin/varnishd/cache_vrt.c b/bin/varnishd/cache_vrt.c
index a53799e..5c633e2 100644
--- a/bin/varnishd/cache_vrt.c
+++ b/bin/varnishd/cache_vrt.c
@@ -43,6 +43,7 @@
 #include "vrt_obj.h"
 #include "vav.h"
 #include "vcl.h"
+#include "vtim.h"
 #include "hash_slinger.h"
 #include "cache_backend.h"
 
@@ -276,7 +277,7 @@ VRT_r_now(const struct sess *sp)
 {
 
 	(void)sp;
-	return (TIM_real());
+	return (VTIM_real());
 }
 
 /*--------------------------------------------------------------------*/
@@ -339,8 +340,8 @@ VRT_time_string(const struct sess *sp, double t)
 {
 	char *p;
 
-	AN(p = WS_Alloc(sp->http->ws, TIM_FORMAT_SIZE));
-	TIM_format(t, p);
+	AN(p = WS_Alloc(sp->http->ws, VTIM_FORMAT_SIZE));
+	VTIM_format(t, p);
 	return p;
 }
 
diff --git a/bin/varnishd/cache_vrt_var.c b/bin/varnishd/cache_vrt_var.c
index 1343ae4..ff523df 100644
--- a/bin/varnishd/cache_vrt_var.c
+++ b/bin/varnishd/cache_vrt_var.c
@@ -37,6 +37,7 @@
 
 #include "vrt.h"
 #include "vtcp.h"
+#include "vtim.h"
 #include "vrt_obj.h"
 #include "cache_backend.h"
 #include "hash_slinger.h"
@@ -535,7 +536,7 @@ VRT_r_obj_lastuse(const struct sess *sp)
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);	/* XXX */
-	return (TIM_real() - sp->obj->last_use);
+	return (VTIM_real() - sp->obj->last_use);
 }
 
 unsigned
diff --git a/bin/varnishd/cache_waiter_epoll.c b/bin/varnishd/cache_waiter_epoll.c
index d4168db..c66d15a 100644
--- a/bin/varnishd/cache_waiter_epoll.c
+++ b/bin/varnishd/cache_waiter_epoll.c
@@ -42,6 +42,7 @@
 
 #include "cache.h"
 #include "cache_waiter.h"
+#include "vtim.h"
 
 #ifndef EPOLLRDHUP
 #  define EPOLLRDHUP 0
@@ -186,7 +187,7 @@ vwe_thread(void *priv)
 			continue;
 
 		/* check for timeouts */
-		deadline = TIM_real() - params->sess_timeout;
+		deadline = VTIM_real() - params->sess_timeout;
 		for (;;) {
 			sp = VTAILQ_FIRST(&vwe->sesshead);
 			if (sp == NULL)
@@ -215,7 +216,7 @@ vwe_sess_timeout_ticker(void *priv)
 	while (1) {
 		/* ticking */
 		assert(write(vwe->timer_pipes[1], &ticker, 1));
-		TIM_sleep(100 * 1e-3);
+		VTIM_sleep(100 * 1e-3);
 	}
 	return NULL;
 }
diff --git a/bin/varnishd/cache_waiter_kqueue.c b/bin/varnishd/cache_waiter_kqueue.c
index f023c3f..e7cb299 100644
--- a/bin/varnishd/cache_waiter_kqueue.c
+++ b/bin/varnishd/cache_waiter_kqueue.c
@@ -43,6 +43,7 @@
 
 #include "cache.h"
 #include "cache_waiter.h"
+#include "vtim.h"
 
 #define NKEV	100
 
@@ -183,7 +184,7 @@ vwk_thread(void *priv)
 		 * would not know we meant "the old fd of this number".
 		 */
 		vwk_kq_flush(vwk);
-		deadline = TIM_real() - params->sess_timeout;
+		deadline = VTIM_real() - params->sess_timeout;
 		for (;;) {
 			sp = VTAILQ_FIRST(&vwk->sesshead);
 			if (sp == NULL)
diff --git a/bin/varnishd/cache_waiter_poll.c b/bin/varnishd/cache_waiter_poll.c
index df0439b..f3f3289 100644
--- a/bin/varnishd/cache_waiter_poll.c
+++ b/bin/varnishd/cache_waiter_poll.c
@@ -36,6 +36,7 @@
 #include "cache.h"
 
 #include "cache_waiter.h"
+#include "vtim.h"
 
 #define NEEV	128
 
@@ -139,7 +140,7 @@ vwp_main(void *priv)
 		assert(vwp->pollfd[vwp->pipes[1]].fd == -1);
 		v = poll(vwp->pollfd, vwp->hpoll + 1, 100);
 		assert(v >= 0);
-		deadline = TIM_real() - params->sess_timeout;
+		deadline = VTIM_real() - params->sess_timeout;
 		v2 = v;
 		VTAILQ_FOREACH_SAFE(sp, &vwp->sesshead, list, sp2) {
 			if (v != 0 && v2 == 0)
diff --git a/bin/varnishd/cache_waiter_ports.c b/bin/varnishd/cache_waiter_ports.c
index 04c6e92..ca7e229 100644
--- a/bin/varnishd/cache_waiter_ports.c
+++ b/bin/varnishd/cache_waiter_ports.c
@@ -43,6 +43,7 @@
 
 #include "cache.h"
 #include "cache_waiter.h"
+#include "vtim.h"
 
 #define MAX_EVENTS 256
 
@@ -195,7 +196,7 @@ vws_thread(void *priv)
 			vws_port_ev(vws, ev + ei);
 
 		/* check for timeouts */
-		now = TIM_real();
+		now = VTIM_real();
 		deadline = now - params->sess_timeout;
 
 		/*
@@ -234,7 +235,7 @@ vws_thread(void *priv)
 			} else if (tmo > max_t) {
 				timeout = &max_ts;
 			} else {
-				ts = TIM_timespec(tmo);
+				ts = VTIM_timespec(tmo);
 				timeout = &ts;
 			}
 		} else {
diff --git a/bin/varnishd/hash_critbit.c b/bin/varnishd/hash_critbit.c
index 7428097..e5b0746 100644
--- a/bin/varnishd/hash_critbit.c
+++ b/bin/varnishd/hash_critbit.c
@@ -38,6 +38,7 @@
 #include "hash_slinger.h"
 #include "cli_priv.h"
 #include "vmb.h"
+#include "vtim.h"
 
 static struct lock hcb_mtx;
 
@@ -367,7 +368,7 @@ hcb_cleaner(void *priv)
 		VTAILQ_CONCAT(&dead_h, &cool_h, hoh_list);
 		Lck_Unlock(&hcb_mtx);
 		WRK_SumStat(&ww);
-		TIM_sleep(params->critbit_cooloff);
+		VTIM_sleep(params->critbit_cooloff);
 	}
 	NEEDLESS_RETURN(NULL);
 }
diff --git a/bin/varnishd/mgt_child.c b/bin/varnishd/mgt_child.c
index 6c1cf71..e676f48 100644
--- a/bin/varnishd/mgt_child.c
+++ b/bin/varnishd/mgt_child.c
@@ -53,6 +53,7 @@
 #include "vss.h"
 #include "vbm.h"
 #include "vtcp.h"
+#include "vtim.h"
 
 pid_t		child_pid = -1;
 
@@ -439,7 +440,7 @@ mgt_save_panic(void)
 		VSB_delete(child_panic);
 	child_panic = VSB_new_auto();
 	XXXAN(child_panic);
-	TIM_format(TIM_real(), time_str);
+	VTIM_format(VTIM_real(), time_str);
 	VSB_printf(child_panic, "Last panic at: %s\n", time_str);
 	VSB_cat(child_panic, VSM_head->panicstr);
 	AZ(VSB_finish(child_panic));
diff --git a/bin/varnishd/rfc2616.c b/bin/varnishd/rfc2616.c
index 36936b6..6de52e2 100644
--- a/bin/varnishd/rfc2616.c
+++ b/bin/varnishd/rfc2616.c
@@ -33,6 +33,7 @@
 #include <math.h>
 
 #include "cache.h"
+#include "vtim.h"
 
 /*--------------------------------------------------------------------
  * TTL and Age calculation in Varnish
@@ -88,10 +89,10 @@ RFC2616_Ttl(const struct sess *sp)
 		sp->wrk->exp.age = age;
 	}
 	if (http_GetHdr(hp, H_Expires, &p))
-		h_expires = TIM_parse(p);
+		h_expires = VTIM_parse(p);
 
 	if (http_GetHdr(hp, H_Date, &p))
-		h_date = TIM_parse(p);
+		h_date = VTIM_parse(p);
 
 	switch (sp->err_code) {
 	default:
@@ -315,7 +316,7 @@ RFC2616_Do_Cond(const struct sess *sp)
 	if (http_GetHdr(sp->http, H_If_Modified_Since, &p) ) {
 		if (!sp->obj->last_modified)
 			return (0);
-		ims = TIM_parse(p);
+		ims = VTIM_parse(p);
 		if (ims > sp->t_req)	/* [RFC2616 14.25] */
 			return (0);
 		if (sp->obj->last_modified > ims)
diff --git a/bin/varnishd/storage_persistent_silo.c b/bin/varnishd/storage_persistent_silo.c
index ba84b79..2defc0d 100644
--- a/bin/varnishd/storage_persistent_silo.c
+++ b/bin/varnishd/storage_persistent_silo.c
@@ -41,6 +41,7 @@
 #include "stevedore.h"
 #include "hash_slinger.h"
 #include "vsha256.h"
+#include "vtim.h"
 
 #include "persistent.h"
 #include "storage_persistent.h"
@@ -122,7 +123,7 @@ smp_load_seg(const struct sess *sp, const struct smp_sc *sc,
 	struct smp_object *so;
 	struct objcore *oc;
 	uint32_t no;
-	double t_now = TIM_real();
+	double t_now = VTIM_real();
 	struct smp_signctx ctx[1];
 
 	ASSERT_SILO_THREAD(sc);
diff --git a/bin/varnishd/varnishd.c b/bin/varnishd/varnishd.c
index 2d7db59..360cdad 100644
--- a/bin/varnishd/varnishd.c
+++ b/bin/varnishd/varnishd.c
@@ -55,6 +55,7 @@
 
 #include "vav.h"
 #include "vin.h"
+#include "vtim.h"
 #include "heritage.h"
 #include "mgt.h"
 #include "hash_slinger.h"
@@ -376,9 +377,9 @@ main(int argc, char * const *argv)
 	 */
 	AZ(setenv("TZ", "UTC", 1));
 	tzset();
-	assert(TIM_parse("Sun, 06 Nov 1994 08:49:37 GMT") == 784111777);
-	assert(TIM_parse("Sunday, 06-Nov-94 08:49:37 GMT") == 784111777);
-	assert(TIM_parse("Sun Nov  6 08:49:37 1994") == 784111777);
+	assert(VTIM_parse("Sun, 06 Nov 1994 08:49:37 GMT") == 784111777);
+	assert(VTIM_parse("Sunday, 06-Nov-94 08:49:37 GMT") == 784111777);
+	assert(VTIM_parse("Sun Nov  6 08:49:37 1994") == 784111777);
 
 	/*
 	 * Check that our SHA256 works
diff --git a/bin/varnishd/vsm.c b/bin/varnishd/vsm.c
index 28f98e5..dc265ba 100644
--- a/bin/varnishd/vsm.c
+++ b/bin/varnishd/vsm.c
@@ -54,6 +54,7 @@
 #include "common.h"
 #include "vsm.h"
 #include "vmb.h"
+#include "vtim.h"
 
 /* These two come from beyond (mgt_shmem.c actually) */
 struct VSM_head		*VSM_head;
@@ -87,7 +88,7 @@ vsm_release(unsigned seq)
 static void
 vsm_cleanup(void)
 {
-	unsigned now = (unsigned)TIM_mono();
+	unsigned now = (unsigned)VTIM_mono();
 	struct VSM_chunk *sha, *sha2;
 	unsigned seq;
 
@@ -203,7 +204,7 @@ VSM__Free(const void *ptr)
 	AN(sha);
 	seq = vsm_mark();
 	bprintf(sha->class, "%s", VSM_CLASS_COOL);
-	sha->state = (unsigned)TIM_mono();
+	sha->state = (unsigned)VTIM_mono();
 	vsm_release(seq);
 }
 
diff --git a/bin/varnishtest/vtc.c b/bin/varnishtest/vtc.c
index e31eaca..83bbb22 100644
--- a/bin/varnishtest/vtc.c
+++ b/bin/varnishtest/vtc.c
@@ -40,6 +40,7 @@
 #include "vtc.h"
 
 #include "vav.h"
+#include "vtim.h"
 #include "libvarnish.h"
 
 
@@ -129,10 +130,10 @@ macro_get(const char *b, const char *e)
 	l = e - b;
 
 	if (l == 4 && !memcmp(b, "date", l)) {
-		double t = TIM_real();
+		double t = VTIM_real();
 		retval = malloc(64);
 		AN(retval);
-		TIM_format(t, retval);
+		VTIM_format(t, retval);
 		return (retval);
 	}
 
@@ -415,7 +416,7 @@ cmd_delay(CMD_ARGS)
 	AZ(av[2]);
 	f = strtod(av[1], NULL);
 	vtc_log(vl, 3, "delaying %g second(s)", f);
-	TIM_sleep(f);
+	VTIM_sleep(f);
 }
 
 /**********************************************************************
diff --git a/bin/varnishtest/vtc_log.c b/bin/varnishtest/vtc_log.c
index 51c6646..c06f319 100644
--- a/bin/varnishtest/vtc_log.c
+++ b/bin/varnishtest/vtc_log.c
@@ -36,6 +36,7 @@
 #include "vtc.h"
 
 #include "libvarnish.h"
+#include "vtim.h"
 
 static pthread_mutex_t	vtclog_mtx;
 static char		*vtclog_buf;
@@ -58,7 +59,7 @@ void
 vtc_loginit(char *buf, unsigned buflen)
 {
 
-	t0 = TIM_mono();
+	t0 = VTIM_mono();
 	vtclog_buf = buf;
 	vtclog_left = buflen;
 	AZ(pthread_mutex_init(&vtclog_mtx, NULL));
@@ -126,7 +127,7 @@ vtc_log(struct vtclog *vl, unsigned lvl, const char *fmt, ...)
 	double tx;
 
 	CHECK_OBJ_NOTNULL(vl, VTCLOG_MAGIC);
-	tx = TIM_mono() - t0;
+	tx = VTIM_mono() - t0;
 	AZ(pthread_mutex_lock(&vl->mtx));
 	assert(lvl < NLEAD);
 	VSB_clear(vl->vsb);
@@ -162,7 +163,7 @@ vtc_dump(struct vtclog *vl, unsigned lvl, const char *pfx, const char *str, int
 	double tx;
 
 	CHECK_OBJ_NOTNULL(vl, VTCLOG_MAGIC);
-	tx = TIM_mono() - t0;
+	tx = VTIM_mono() - t0;
 	assert(lvl < NLEAD);
 	AZ(pthread_mutex_lock(&vl->mtx));
 	VSB_clear(vl->vsb);
@@ -225,7 +226,7 @@ vtc_hexdump(struct vtclog *vl, unsigned lvl, const char *pfx, const unsigned cha
 	double tx;
 
 	CHECK_OBJ_NOTNULL(vl, VTCLOG_MAGIC);
-	tx = TIM_mono() - t0;
+	tx = VTIM_mono() - t0;
 	assert(len >= 0);
 	assert(lvl < NLEAD);
 	AZ(pthread_mutex_lock(&vl->mtx));
diff --git a/bin/varnishtest/vtc_main.c b/bin/varnishtest/vtc_main.c
index d201946..040afdc 100644
--- a/bin/varnishtest/vtc_main.c
+++ b/bin/varnishtest/vtc_main.c
@@ -42,6 +42,7 @@
 
 #include "libvarnish.h"
 #include "vev.h"
+#include "vtim.h"
 
 #ifndef HAVE_SRANDOMDEV
 #include "compat/srandomdev.h"
@@ -193,7 +194,7 @@ tst_cb(const struct vev *ve, int what)
 		njob--;
 		px = wait4(jp->child, &stx, 0, NULL);
 		assert(px == jp->child);
-		t = TIM_mono() - jp->t0;
+		t = VTIM_mono() - jp->t0;
 		AZ(close(ve->fd));
 
 		if (stx && vtc_verbosity)
@@ -283,7 +284,7 @@ start_test(void)
 	AZ(pipe(p));
 	assert(p[0] > STDERR_FILENO);
 	assert(p[1] > STDERR_FILENO);
-	jp->t0 = TIM_mono();
+	jp->t0 = VTIM_mono();
 	jp->child = fork();
 	assert(jp->child >= 0);
 	if (jp->child == 0) {
diff --git a/include/Makefile.am b/include/Makefile.am
index 2cbe5d1..d62cab3 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -57,7 +57,8 @@ nobase_noinst_HEADERS = \
 	vsub.h \
 	vsha256.h \
 	vss.h \
-	vtcp.h
+	vtcp.h \
+	vtim.h
 
 tbl/vrt_stv_var.h tbl/vcl_returns.h vcl.h vrt_obj.h: $(top_srcdir)/lib/libvcl/generate.py $(top_srcdir)/include/vrt.h
 	mkdir -p tbl
diff --git a/include/libvarnish.h b/include/libvarnish.h
index 5bbe073..c0851c8 100644
--- a/include/libvarnish.h
+++ b/include/libvarnish.h
@@ -41,16 +41,6 @@ struct vsb;
 /* from libvarnish/num.c */
 const char *str2bytes(const char *p, uintmax_t *r, uintmax_t rel);
 
-/* from libvarnish/time.c */
-#define TIM_FORMAT_SIZE 30
-void TIM_format(double t, char *p);
-double TIM_parse(const char *p);
-double TIM_mono(void);
-double TIM_real(void);
-void TIM_sleep(double t);
-struct timespec TIM_timespec(double t);
-struct timeval TIM_timeval(double t);
-
 /* from libvarnish/version.c */
 void VCS_Message(const char *);
 
diff --git a/include/vtim.h b/include/vtim.h
new file mode 100644
index 0000000..8db4fbe
--- /dev/null
+++ b/include/vtim.h
@@ -0,0 +1,39 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2011 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/* from libvarnish/vtim.c */
+#define VTIM_FORMAT_SIZE 30
+void VTIM_format(double t, char *p);
+double VTIM_parse(const char *p);
+double VTIM_mono(void);
+double VTIM_real(void);
+void VTIM_sleep(double t);
+struct timespec VTIM_timespec(double t);
+struct timeval VTIM_timeval(double t);
diff --git a/lib/libvarnish/Makefile.am b/lib/libvarnish/Makefile.am
index 0148460..3c045e6 100644
--- a/lib/libvarnish/Makefile.am
+++ b/lib/libvarnish/Makefile.am
@@ -14,7 +14,7 @@ libvarnish_la_SOURCES = \
 	cli_serve.c \
 	flopen.c \
 	num.c \
-	time.c \
+	vtim.c \
 	vtcp.c \
 	vct.c \
 	version.c \
diff --git a/lib/libvarnish/time.c b/lib/libvarnish/time.c
deleted file mode 100644
index 31fc284..0000000
--- a/lib/libvarnish/time.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*-
- * Copyright (c) 2006 Verdens Gang AS
- * Copyright (c) 2006-2011 Varnish Software AS
- * All rights reserved.
- *
- * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * Semi-trivial functions to handle HTTP header timestamps according to
- * RFC 2616 section 3.3.
- *
- * In the highly unlikely event of performance trouble, handbuilt versions
- * would likely be faster than relying on the OS time functions.
- *
- * We must parse three different formats:
- *       000000000011111111112222222222
- *       012345678901234567890123456789
- *       ------------------------------
- *	"Sun, 06 Nov 1994 08:49:37 GMT"		RFC822 & RFC1123
- *	"Sunday, 06-Nov-94 08:49:37 GMT"	RFC850
- *	"Sun Nov  6 08:49:37 1994"		ANSI-C asctime()
- *
- * And always output the RFC1123 format.
- *
- */
-
-#include "config.h"
-
-#include <sys/time.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <math.h>
-
-#include "libvarnish.h"
-
-/*
- * Note on Solaris: for some reason, clock_gettime(CLOCK_MONOTONIC, &ts) is not
- * implemented in assembly, but falls into a syscall, while gethrtime() doesn't,
- * so we save a syscall by using gethrtime() if it is defined.
- */
-
-double
-TIM_mono(void)
-{
-#ifdef HAVE_GETHRTIME
-	return (gethrtime() * 1e-9);
-#elif  HAVE_CLOCK_GETTIME
-	struct timespec ts;
-
-	assert(clock_gettime(CLOCK_MONOTONIC, &ts) == 0);
-	return (ts.tv_sec + 1e-9 * ts.tv_nsec);
-#else
-	struct timeval tv;
-
-	assert(gettimeofday(&tv, NULL) == 0);
-	return (tv.tv_sec + 1e-6 * tv.tv_usec);
-#endif
-}
-
-double
-TIM_real(void)
-{
-#ifdef HAVE_CLOCK_GETTIME
-	struct timespec ts;
-
-	assert(clock_gettime(CLOCK_REALTIME, &ts) == 0);
-	return (ts.tv_sec + 1e-9 * ts.tv_nsec);
-#else
-	struct timeval tv;
-
-	assert(gettimeofday(&tv, NULL) == 0);
-	return (tv.tv_sec + 1e-6 * tv.tv_usec);
-#endif
-}
-
-void
-TIM_format(double t, char *p)
-{
-	struct tm tm;
-	time_t tt;
-
-	tt = (time_t) t;
-	(void)gmtime_r(&tt, &tm);
-	AN(strftime(p, TIM_FORMAT_SIZE, "%a, %d %b %Y %T GMT", &tm));
-}
-
-/* XXX: add statistics ? */
-static const char *fmts[] = {
-	"%a, %d %b %Y %T GMT",	/* RFC 822 & RFC 1123 */
-	"%A, %d-%b-%y %T GMT",	/* RFC 850 */
-	"%a %b %d %T %Y",	/* ANSI-C asctime() */
-	"%F %T",		/* ISO 8601 */
-	NULL
-};
-
-double
-TIM_parse(const char *p)
-{
-	double t;
-	struct tm tm;
-	const char **r;
-
-	for (r = fmts; *r != NULL; r++) {
-		memset(&tm, 0, sizeof tm);
-		if (strptime(p, *r, &tm) != NULL) {
-			/*
-			 * Make sure this is initialized on the off-chance
-			 * that some raving loonie would apply DST to UTC.
-			 */
-			tm.tm_isdst = -1;
-#if defined(HAVE_TIMEGM)
-			t = timegm(&tm);
-#else
-			/*
-			 * Ahh, another POSIX_STUPIDITY, how unexpected.
-			 * Instead of, as would have been logical, to have
-			 * tm_timezone element, mktime() is standardized as
-			 * always working in localtime.  This brilliant idea
-			 * came from the same people who said "leap-seconds ?
-			 * Naah, screw it!".
-			 *
-			 * On broken systems without a working timegm(),
-			 * it is the responsibility of the calling program
-			 * to set the timezone to UTC.  We check that.
-			 */
-			t = mktime(&tm);
-			assert(!strcmp(tzname[0], "UTC"));
-#endif
-			return (t);
-		}
-	}
-	return (0);
-}
-
-void
-TIM_sleep(double t)
-{
-#ifdef HAVE_NANOSLEEP
-	struct timespec ts;
-
-	ts = TIM_timespec(t);
-
-	(void)nanosleep(&ts, NULL);
-#else
-	if (t >= 1.) {
-		(void)sleep(floor(t));
-		t -= floor(t);
-	}
-	/* XXX: usleep() is not mandated to be thread safe */
-	t *= 1e6;
-	if (t > 0)
-		(void)usleep(floor(t));
-#endif
-}
-
-struct timeval
-TIM_timeval(double t)
-{
-	struct timeval tv;
-
-	tv.tv_sec = (time_t)trunc(t);
-	tv.tv_usec = (int)(1e6 * (t - tv.tv_sec));
-	return (tv);
-}
-
-struct timespec
-TIM_timespec(double t)
-{
-	struct timespec tv;
-
-	tv.tv_sec = (time_t)trunc(t);
-	tv.tv_nsec = (int)(1e9 * (t - tv.tv_sec));
-	return (tv);
-}
-
-
-#ifdef TEST_DRIVER
-
-#include <stdlib.h>
-
-/*
- * Compile with:
- *  cc -o foo -DTEST_DRIVER -I../.. -I../../include time.c assert.c
- * (Solaris)
- *  cc -o foo -DTEST_DRIVER -I../.. -I../../include -lm time.c assert.c
- * Test with:
- *  env TZ=UTC ./foo
- *  env TZ=CET ./foo
- */
-
-static void
-tst(const char *s, time_t good)
-{
-	time_t t;
-	char buf[BUFSIZ];
-
-	t = TIM_parse(s);
-	TIM_format(t, buf);
-	printf("%-30s -> %12jd -> %s\n", s, (intmax_t)t, buf);
-	if (t != good) {
-		printf("Parse error! Got: %jd should have %jd diff %jd\n",
-		    (intmax_t)t, (intmax_t)good, (intmax_t)(t - good));
-		exit (2);
-	}
-}
-
-static int
-tst_delta_check(const char *name, double begin, double end, double ref)
-{
-	const double tol_max = 1.1;
-	const double tol_min = 1;
-
-	printf("%s delta for %fs sleep: %f\n", name, ref, (end - begin));
-
-	if ((end - begin) > tol_max * ref) {
-		printf("%s delta above tolerance: ((%f - %f) = %f) > %f\n",
-		    name, end, begin, (end - begin), tol_max);
-		return (1);
-	} else if ((end - begin) < tol_min * ref) {
-		printf("%s delta below tolerance: ((%f - %f) = %f) < %f\n",
-		    name, end, begin, (end - begin), tol_min);
-		return (1);
-	}
-	return (0);
-}
-
-static void
-tst_delta()
-{
-	double m_begin, m_end;
-	double r_begin, r_end;
-	const double ref = 1;
-	int err = 0;
-
-	r_begin = TIM_real();
-	m_begin = TIM_mono();
-	TIM_sleep(ref);
-	r_end = TIM_real();
-	m_end = TIM_mono();
-
-	err += tst_delta_check("TIM_mono", m_begin, m_end, ref);
-	err += tst_delta_check("TIM_real", r_begin, r_end, ref);
-
-	if (err) {
-		printf("%d time delta test errrors\n", err);
-		exit (2);
-	}
-}
-
-int
-main(int argc, char **argv)
-{
-	time_t t;
-	char buf[BUFSIZ];
-
-	time(&t);
-	memset(buf, 0x55, sizeof buf);
-	TIM_format(t, buf);
-	printf("scan = %d <%s>\n", TIM_parse(buf), buf);
-
-	/* Examples from RFC2616 section 3.3.1 */
-	tst("Sun, 06 Nov 1994 08:49:37 GMT", 784111777);
-	tst("Sunday, 06-Nov-94 08:49:37 GMT", 784111777);
-	tst("Sun Nov  6 08:49:37 1994", 784111777);
-
-	tst_delta();
-
-	return (0);
-}
-#endif
diff --git a/lib/libvarnish/vev.c b/lib/libvarnish/vev.c
index 8c64562..c55ebfc 100644
--- a/lib/libvarnish/vev.c
+++ b/lib/libvarnish/vev.c
@@ -39,6 +39,7 @@
 #include <pthread.h>
 
 #include "libvarnish.h"
+#include "vtim.h"
 #include "vev.h"
 #include "miniobj.h"
 #include "binary_heap.h"
@@ -278,7 +279,7 @@ vev_add(struct vev_base *evb, struct vev *e)
 	e->magic = VEV_MAGIC;	/* before binheap_insert() */
 
 	if (e->timeout != 0.0) {
-		e->__when += TIM_mono() + e->timeout;
+		e->__when += VTIM_mono() + e->timeout;
 		binheap_insert(evb->binheap, e);
 		assert(e->__binheap_idx > 0);
 		DBG(evb, "... bidx = %d\n", e->__binheap_idx);
@@ -455,7 +456,7 @@ vev_schedule_one(struct vev_base *evb)
 	if (e != NULL) {
 		CHECK_OBJ_NOTNULL(e, VEV_MAGIC);
 		assert(e->__binheap_idx == 1);
-		t = TIM_mono();
+		t = VTIM_mono();
 		if (e->__when <= t)
 			return (vev_sched_timeout(evb, e, t));
 		tmo = (int)((e->__when - t) * 1e3);
@@ -478,7 +479,7 @@ vev_schedule_one(struct vev_base *evb)
 		return (vev_sched_signal(evb));
 	if (i == 0) {
 		assert(e != NULL);
-		t = TIM_mono();
+		t = VTIM_mono();
 		if (e->__when <= t)
 			return (vev_sched_timeout(evb, e, t));
 	}
diff --git a/lib/libvarnish/vtim.c b/lib/libvarnish/vtim.c
new file mode 100644
index 0000000..edfb8a5
--- /dev/null
+++ b/lib/libvarnish/vtim.c
@@ -0,0 +1,295 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2011 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Semi-trivial functions to handle HTTP header timestamps according to
+ * RFC 2616 section 3.3.
+ *
+ * In the highly unlikely event of performance trouble, handbuilt versions
+ * would likely be faster than relying on the OS time functions.
+ *
+ * We must parse three different formats:
+ *       000000000011111111112222222222
+ *       012345678901234567890123456789
+ *       ------------------------------
+ *	"Sun, 06 Nov 1994 08:49:37 GMT"		RFC822 & RFC1123
+ *	"Sunday, 06-Nov-94 08:49:37 GMT"	RFC850
+ *	"Sun Nov  6 08:49:37 1994"		ANSI-C asctime()
+ *
+ * And always output the RFC1123 format.
+ *
+ */
+
+#include "config.h"
+
+#include <sys/time.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <math.h>
+
+#include "vas.h"
+#include "vtim.h"
+//#include "libvarnish.h"
+
+/*
+ * Note on Solaris: for some reason, clock_gettime(CLOCK_MONOTONIC, &ts) is not
+ * implemented in assembly, but falls into a syscall, while gethrtime() doesn't,
+ * so we save a syscall by using gethrtime() if it is defined.
+ */
+
+double
+VTIM_mono(void)
+{
+#ifdef HAVE_GETHRTIME
+	return (gethrtime() * 1e-9);
+#elif  HAVE_CLOCK_GETTIME
+	struct timespec ts;
+
+	assert(clock_gettime(CLOCK_MONOTONIC, &ts) == 0);
+	return (ts.tv_sec + 1e-9 * ts.tv_nsec);
+#else
+	struct timeval tv;
+
+	assert(gettimeofday(&tv, NULL) == 0);
+	return (tv.tv_sec + 1e-6 * tv.tv_usec);
+#endif
+}
+
+double
+VTIM_real(void)
+{
+#ifdef HAVE_CLOCK_GETTIME
+	struct timespec ts;
+
+	assert(clock_gettime(CLOCK_REALTIME, &ts) == 0);
+	return (ts.tv_sec + 1e-9 * ts.tv_nsec);
+#else
+	struct timeval tv;
+
+	assert(gettimeofday(&tv, NULL) == 0);
+	return (tv.tv_sec + 1e-6 * tv.tv_usec);
+#endif
+}
+
+void
+VTIM_format(double t, char *p)
+{
+	struct tm tm;
+	time_t tt;
+
+	tt = (time_t) t;
+	(void)gmtime_r(&tt, &tm);
+	AN(strftime(p, VTIM_FORMAT_SIZE, "%a, %d %b %Y %T GMT", &tm));
+}
+
+/* XXX: add statistics ? */
+static const char *fmts[] = {
+	"%a, %d %b %Y %T GMT",	/* RFC 822 & RFC 1123 */
+	"%A, %d-%b-%y %T GMT",	/* RFC 850 */
+	"%a %b %d %T %Y",	/* ANSI-C asctime() */
+	"%F %T",		/* ISO 8601 */
+	NULL
+};
+
+double
+VTIM_parse(const char *p)
+{
+	double t;
+	struct tm tm;
+	const char **r;
+
+	for (r = fmts; *r != NULL; r++) {
+		memset(&tm, 0, sizeof tm);
+		if (strptime(p, *r, &tm) != NULL) {
+			/*
+			 * Make sure this is initialized on the off-chance
+			 * that some raving loonie would apply DST to UTC.
+			 */
+			tm.tm_isdst = -1;
+#if defined(HAVE_TIMEGM)
+			t = timegm(&tm);
+#else
+			/*
+			 * Ahh, another POSIX_STUPIDITY, how unexpected.
+			 * Instead of, as would have been logical, to have
+			 * tm_timezone element, mktime() is standardized as
+			 * always working in localtime.  This brilliant idea
+			 * came from the same people who said "leap-seconds ?
+			 * Naah, screw it!".
+			 *
+			 * On broken systems without a working timegm(),
+			 * it is the responsibility of the calling program
+			 * to set the timezone to UTC.  We check that.
+			 */
+			t = mktime(&tm);
+			assert(!strcmp(tzname[0], "UTC"));
+#endif
+			return (t);
+		}
+	}
+	return (0);
+}
+
+void
+VTIM_sleep(double t)
+{
+#ifdef HAVE_NANOSLEEP
+	struct timespec ts;
+
+	ts = VTIM_timespec(t);
+
+	(void)nanosleep(&ts, NULL);
+#else
+	if (t >= 1.) {
+		(void)sleep(floor(t));
+		t -= floor(t);
+	}
+	/* XXX: usleep() is not mandated to be thread safe */
+	t *= 1e6;
+	if (t > 0)
+		(void)usleep(floor(t));
+#endif
+}
+
+struct timeval
+VTIM_timeval(double t)
+{
+	struct timeval tv;
+
+	tv.tv_sec = (time_t)trunc(t);
+	tv.tv_usec = (int)(1e6 * (t - tv.tv_sec));
+	return (tv);
+}
+
+struct timespec
+VTIM_timespec(double t)
+{
+	struct timespec tv;
+
+	tv.tv_sec = (time_t)trunc(t);
+	tv.tv_nsec = (int)(1e9 * (t - tv.tv_sec));
+	return (tv);
+}
+
+
+#ifdef TEST_DRIVER
+
+#include <stdlib.h>
+
+/*
+ * Compile with:
+ *  cc -o foo -DTEST_DRIVER -I../.. -I../../include time.c assert.c
+ * (Solaris)
+ *  cc -o foo -DTEST_DRIVER -I../.. -I../../include -lm time.c assert.c
+ * Test with:
+ *  env TZ=UTC ./foo
+ *  env TZ=CET ./foo
+ */
+
+static void
+tst(const char *s, time_t good)
+{
+	time_t t;
+	char buf[BUFSIZ];
+
+	t = VTIM_parse(s);
+	VTIM_format(t, buf);
+	printf("%-30s -> %12jd -> %s\n", s, (intmax_t)t, buf);
+	if (t != good) {
+		printf("Parse error! Got: %jd should have %jd diff %jd\n",
+		    (intmax_t)t, (intmax_t)good, (intmax_t)(t - good));
+		exit (2);
+	}
+}
+
+static int
+tst_delta_check(const char *name, double begin, double end, double ref)
+{
+	const double tol_max = 1.1;
+	const double tol_min = 1;
+
+	printf("%s delta for %fs sleep: %f\n", name, ref, (end - begin));
+
+	if ((end - begin) > tol_max * ref) {
+		printf("%s delta above tolerance: ((%f - %f) = %f) > %f\n",
+		    name, end, begin, (end - begin), tol_max);
+		return (1);
+	} else if ((end - begin) < tol_min * ref) {
+		printf("%s delta below tolerance: ((%f - %f) = %f) < %f\n",
+		    name, end, begin, (end - begin), tol_min);
+		return (1);
+	}
+	return (0);
+}
+
+static void
+tst_delta()
+{
+	double m_begin, m_end;
+	double r_begin, r_end;
+	const double ref = 1;
+	int err = 0;
+
+	r_begin = VTIM_real();
+	m_begin = VTIM_mono();
+	VTIM_sleep(ref);
+	r_end = VTIM_real();
+	m_end = VTIM_mono();
+
+	err += tst_delta_check("VTIM_mono", m_begin, m_end, ref);
+	err += tst_delta_check("VTIM_real", r_begin, r_end, ref);
+
+	if (err) {
+		printf("%d time delta test errrors\n", err);
+		exit (2);
+	}
+}
+
+int
+main(int argc, char **argv)
+{
+	time_t t;
+	char buf[BUFSIZ];
+
+	time(&t);
+	memset(buf, 0x55, sizeof buf);
+	VTIM_format(t, buf);
+	printf("scan = %d <%s>\n", VTIM_parse(buf), buf);
+
+	/* Examples from RFC2616 section 3.3.1 */
+	tst("Sun, 06 Nov 1994 08:49:37 GMT", 784111777);
+	tst("Sunday, 06-Nov-94 08:49:37 GMT", 784111777);
+	tst("Sun Nov  6 08:49:37 1994", 784111777);
+
+	tst_delta();
+
+	return (0);
+}
+#endif



More information about the varnish-commit mailing list