[master] 46561a1 NOP: pull out the actual mmap code from VSM_Map()

Nils Goroll nils.goroll at uplex.de
Fri Jan 19 08:48:08 UTC 2018


commit 46561a19f25e947cdb7748d14f22113671b1554a
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Thu Jan 18 10:21:25 2018 +0100

    NOP: pull out the actual mmap code from VSM_Map()

diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index b2b853c..45aa6ce 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -148,6 +148,53 @@ vsm_diag(struct vsm *vd, const char *fmt, ...)
 
 /*--------------------------------------------------------------------*/
 
+static int
+vsm_mapseg(struct vsm *vd, struct vsm_seg *vg)
+{
+	size_t of, off, sz, ps, len;
+	struct vsb *vsb;
+	int fd;
+
+	CHECK_OBJ_NOTNULL(vg, VSM_SEG_MAGIC);
+
+	ps = getpagesize();
+	of = strtoul(vg->av[2], NULL, 10);
+	off = RDN2(of, ps);
+
+	sz = strtoul(vg->av[3], NULL, 10);
+	assert(sz > 0);
+	assert(of >= off);
+	len = RUP2(of - off + sz, ps);
+
+	vsb = VSB_new_auto();
+	AN(vsb);
+	VSB_printf(vsb, "%s/%s/%s", vd->dname, vg->set->dname, vg->av[1]);
+	AZ(VSB_finish(vsb));
+
+	fd = open(VSB_data(vsb), O_RDONLY);	// XXX: openat
+	if (fd < 0) {
+		VSB_destroy(&vsb);
+		return (vsm_diag(vd, "Could not open segment"));
+	}
+
+	vg->s = (void*)mmap(NULL, len,
+	    PROT_READ,
+	    MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
+	    fd, (off_t)off);
+
+	VSB_destroy(&vsb);
+
+	closefd(&fd);
+	if (vg->s == MAP_FAILED)
+		return (vsm_diag(vd, "Could not mmap segment"));
+
+	vg->b = (char*)(vg->s) + of - off;
+	vg->e = (char *)vg->b + sz;
+	vg->sz = len;
+
+	return (0);
+}
+
 static void
 vsm_unmapseg(struct vsm_seg *vg)
 {
@@ -690,9 +737,7 @@ int
 VSM_Map(struct vsm *vd, struct vsm_fantom *vf)
 {
 	struct vsm_seg *vg;
-	size_t of, off, sz, ps, len;
-	struct vsb *vsb;
-	int fd;
+	int r;
 
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
 	AN(vd->attached);
@@ -714,40 +759,10 @@ VSM_Map(struct vsm *vd, struct vsm_fantom *vf)
 		return (0);
 	}
 
-	ps = getpagesize();
-	of = strtoul(vg->av[2], NULL, 10);
-	off = RDN2(of, ps);
-
-	sz = strtoul(vg->av[3], NULL, 10);
-	assert(sz > 0);
-	assert(of >= off);
-	len = RUP2(of - off + sz, ps);
-
-	vsb = VSB_new_auto();
-	AN(vsb);
-	VSB_printf(vsb, "%s/%s/%s", vd->dname, vg->set->dname, vg->av[1]);
-	AZ(VSB_finish(vsb));
+	r = vsm_mapseg(vd, vg);
 
-	fd = open(VSB_data(vsb), O_RDONLY);	// XXX: openat
-	if (fd < 0) {
-		VSB_destroy(&vsb);
-		return (vsm_diag(vd, "Could not open segment"));
-	}
-
-	vg->s = (void*)mmap(NULL, len,
-	    PROT_READ,
-	    MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
-	    fd, (off_t)off);
-
-	VSB_destroy(&vsb);
-
-	closefd(&fd);
-	if (vg->s == MAP_FAILED)
-		return (vsm_diag(vd, "Could not mmap segment"));
-
-	vg->b = (char*)(vg->s) + of - off;
-	vg->e = (char *)vg->b + sz;
-	vg->sz = len;
+	if (r)
+		return (r);
 
 	vf->b = vg->b;
 	vf->e = vg->e;


More information about the varnish-commit mailing list