[master] 9703c6cd4 ws: Move common code to a new cache_ws_common.c
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Mon Sep 6 05:14:06 UTC 2021
commit 9703c6cd40112a80990309411c3f8e5decb02db3
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Mon Sep 6 06:50:40 2021 +0200
ws: Move common code to a new cache_ws_common.c
diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am
index e129b9a8a..583f9c5dc 100644
--- a/bin/varnishd/Makefile.am
+++ b/bin/varnishd/Makefile.am
@@ -53,6 +53,7 @@ varnishd_SOURCES = \
cache/cache_vrt_vcl.c \
cache/cache_vrt_vmod.c \
cache/cache_wrk.c \
+ cache/cache_ws_common.c \
common/common_vsc.c \
common/common_vsmw.c \
hash/hash_classic.c \
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 6955c1c8b..90b9d781e 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -780,13 +780,10 @@ void WRK_BgThread(pthread_t *thr, const char *name, bgthread_t *func,
void *priv);
/* cache_ws.c */
-
void WS_Init(struct ws *ws, const char *id, void *space, unsigned len);
unsigned WS_ReserveSize(struct ws *, unsigned);
unsigned WS_ReserveAll(struct ws *);
-unsigned WS_ReserveLumps(struct ws *ws, size_t sz);
-void WS_MarkOverflow(struct ws *ws);
void WS_Release(struct ws *ws, unsigned bytes);
void WS_ReleaseP(struct ws *ws, const char *ptr);
void WS_Assert(const struct ws *ws);
@@ -794,14 +791,9 @@ void WS_Reset(struct ws *ws, uintptr_t);
void *WS_Alloc(struct ws *ws, unsigned bytes);
void *WS_Copy(struct ws *ws, const void *str, int len);
uintptr_t WS_Snapshot(struct ws *ws);
-int WS_Overflowed(const struct ws *ws);
-const char *WS_Printf(struct ws *ws, const char *fmt, ...) v_printflike_(2, 3);
int WS_Allocated(const struct ws *ws, const void *ptr, ssize_t len);
unsigned WS_Dump(const struct ws *ws, char, size_t off, void *buf, size_t len);
-void WS_VSB_new(struct vsb *, struct ws *);
-char *WS_VSB_finish(struct vsb *, struct ws *, size_t *);
-
static inline void *
WS_Reservation(const struct ws *ws)
{
@@ -820,6 +812,23 @@ WS_ReservationSize(const struct ws *ws)
return (ws->r - ws->f);
}
+static inline unsigned
+WS_ReserveLumps(struct ws *ws, size_t sz)
+{
+
+ AN(sz);
+ return (WS_ReserveAll(ws) / sz);
+}
+
+/* cache_ws_common.c */
+void WS_MarkOverflow(struct ws *ws);
+int WS_Overflowed(const struct ws *ws);
+
+const char *WS_Printf(struct ws *ws, const char *fmt, ...) v_printflike_(2, 3);
+
+void WS_VSB_new(struct vsb *, struct ws *);
+char *WS_VSB_finish(struct vsb *, struct ws *, size_t *);
+
/* cache_rfc2616.c */
void RFC2616_Ttl(struct busyobj *, vtim_real now, vtim_real *t_origin,
float *ttl, float *grace, float *keep);
diff --git a/bin/varnishd/cache/cache_varnishd.h b/bin/varnishd/cache/cache_varnishd.h
index 47213fff6..fda1e4dba 100644
--- a/bin/varnishd/cache/cache_varnishd.h
+++ b/bin/varnishd/cache/cache_varnishd.h
@@ -527,7 +527,6 @@ void WRK_Init(void);
void WRK_AddStat(const struct worker *);
/* cache_ws.c */
-void WS_Id(const struct ws *ws, char *id);
void WS_Panic(struct vsb *, const struct ws *);
static inline int
WS_IsReserved(const struct ws *ws)
@@ -536,11 +535,14 @@ WS_IsReserved(const struct ws *ws)
return (ws->r != NULL);
}
-void WS_Rollback(struct ws *, uintptr_t);
void *WS_AtOffset(const struct ws *ws, unsigned off, unsigned len);
unsigned WS_ReservationOffset(const struct ws *ws);
unsigned WS_ReqPipeline(struct ws *, const void *b, const void *e);
+/* cache_ws_common.c */
+void WS_Id(const struct ws *ws, char *id);
+void WS_Rollback(struct ws *, uintptr_t);
+
/* http1/cache_http1_pipe.c */
void V1P_Init(void);
diff --git a/bin/varnishd/cache/cache_ws.c b/bin/varnishd/cache/cache_ws.c
index 1db047a1a..02a3a867c 100644
--- a/bin/varnishd/cache/cache_ws.c
+++ b/bin/varnishd/cache/cache_ws.c
@@ -1,9 +1,10 @@
/*-
* Copyright (c) 2006 Verdens Gang AS
- * Copyright (c) 2006-2011 Varnish Software AS
+ * Copyright (c) 2006-2021 Varnish Software AS
* All rights reserved.
*
* Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ * Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*
@@ -34,8 +35,6 @@
#include "cache_varnishd.h"
-#include <stdio.h>
-
#define WS_REDZONE_END '\x15'
static const uintptr_t snap_overflowed = (uintptr_t)&snap_overflowed;
@@ -100,32 +99,6 @@ WS_Init(struct ws *ws, const char *id, void *space, unsigned len)
WS_Assert(ws);
}
-void
-WS_Id(const struct ws *ws, char *id)
-{
-
- WS_Assert(ws);
- AN(id);
- memcpy(id, ws->id, WS_ID_SIZE);
- id[0] |= 0x20; // cheesy tolower()
-}
-
-void
-WS_MarkOverflow(struct ws *ws)
-{
- CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
-
- ws->id[0] &= ~0x20; // cheesy toupper()
-}
-
-static void
-ws_ClearOverflow(struct ws *ws)
-{
- CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
-
- ws->id[0] |= 0x20; // cheesy tolower()
-}
-
/*
* Reset a WS to a cookie from WS_Snapshot
*
@@ -156,24 +129,6 @@ WS_Reset(struct ws *ws, uintptr_t pp)
WS_Assert(ws);
}
-/*
- * Reset the WS to a cookie or its start and clears any overflow
- *
- * for varnishd internal use only
- */
-
-void
-WS_Rollback(struct ws *ws, uintptr_t pp)
-{
- WS_Assert(ws);
-
- if (pp == 0)
- pp = (uintptr_t)ws->s;
-
- ws_ClearOverflow(ws);
- WS_Reset(ws, pp);
-}
-
/*
* Make a reservation and optionally pipeline a memory region that may or
* may not originate from the same workspace.
@@ -252,28 +207,6 @@ WS_Copy(struct ws *ws, const void *str, int len)
return (r);
}
-const char *
-WS_Printf(struct ws *ws, const char *fmt, ...)
-{
- unsigned u, v;
- va_list ap;
- char *p;
-
- u = WS_ReserveAll(ws);
- p = ws->f;
- va_start(ap, fmt);
- v = vsnprintf(p, u, fmt, ap);
- va_end(ap);
- if (v >= u) {
- WS_Release(ws, 0);
- WS_MarkOverflow(ws);
- p = NULL;
- } else {
- WS_Release(ws, v + 1);
- }
- return (p);
-}
-
uintptr_t
WS_Snapshot(struct ws *ws)
{
@@ -332,12 +265,6 @@ WS_ReserveSize(struct ws *ws, unsigned bytes)
return (bytes);
}
-unsigned
-WS_ReserveLumps(struct ws *ws, size_t sz)
-{
- return (WS_ReserveAll(ws) / sz);
-}
-
void
WS_Release(struct ws *ws, unsigned bytes)
{
@@ -364,17 +291,6 @@ WS_ReleaseP(struct ws *ws, const char *ptr)
WS_Assert(ws);
}
-int
-WS_Overflowed(const struct ws *ws)
-{
- CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
- AN(ws->id[0]);
-
- if (ws->id[0] & 0x20) // cheesy islower()
- return (0);
- return (1);
-}
-
void *
WS_AtOffset(const struct ws *ws, unsigned off, unsigned len)
{
@@ -394,60 +310,6 @@ WS_ReservationOffset(const struct ws *ws)
return (ws->f - ws->s);
}
-/*---------------------------------------------------------------------
- * Build a VSB on a workspace.
- * Usage pattern:
- *
- * struct vsb vsb[1];
- * char *p;
- *
- * WS_VSB_new(vsb, ctx->ws);
- * VSB_printf(vsb, "blablabla");
- * p = WS_VSB_finish(vsb, ctx->ws, NULL);
- * if (p == NULL)
- * return (FAILURE);
- */
-
-void
-WS_VSB_new(struct vsb *vsb, struct ws *ws)
-{
- unsigned u;
- static char bogus[2]; // Smallest possible vsb
-
- AN(vsb);
- WS_Assert(ws);
- u = WS_ReserveAll(ws);
- if (WS_Overflowed(ws) || u < 2)
- AN(VSB_init(vsb, bogus, sizeof bogus));
- else
- AN(VSB_init(vsb, WS_Reservation(ws), u));
-}
-
-char *
-WS_VSB_finish(struct vsb *vsb, struct ws *ws, size_t *szp)
-{
- char *p;
-
- AN(vsb);
- WS_Assert(ws);
- if (!VSB_finish(vsb)) {
- p = VSB_data(vsb);
- if (p == ws->f) {
- WS_Release(ws, VSB_len(vsb) + 1);
- if (szp != NULL)
- *szp = VSB_len(vsb);
- VSB_fini(vsb);
- return (p);
- }
- }
- WS_MarkOverflow(ws);
- VSB_fini(vsb);
- WS_Release(ws, 0);
- if (szp)
- *szp = 0;
- return (NULL);
-}
-
/*--------------------------------------------------------------------*/
unsigned
diff --git a/bin/varnishd/cache/cache_ws_common.c b/bin/varnishd/cache/cache_ws_common.c
new file mode 100644
index 000000000..a23cd06af
--- /dev/null
+++ b/bin/varnishd/cache/cache_ws_common.c
@@ -0,0 +1,171 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2021 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ * Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * 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.
+ *
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+
+#include "cache_varnishd.h"
+
+void
+WS_Id(const struct ws *ws, char *id)
+{
+
+ WS_Assert(ws);
+ AN(id);
+ memcpy(id, ws->id, WS_ID_SIZE);
+ id[0] |= 0x20; // cheesy tolower()
+}
+
+void
+WS_MarkOverflow(struct ws *ws)
+{
+ CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
+
+ ws->id[0] &= ~0x20; // cheesy toupper()
+}
+
+static void
+ws_ClearOverflow(struct ws *ws)
+{
+ CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
+
+ ws->id[0] |= 0x20; // cheesy tolower()
+}
+
+int
+WS_Overflowed(const struct ws *ws)
+{
+ CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
+ AN(ws->id[0]);
+
+ if (ws->id[0] & 0x20) // cheesy islower()
+ return (0);
+ return (1);
+}
+
+/*
+ * Reset the WS to a cookie or its start and clears any overflow
+ *
+ * for varnishd internal use only
+ */
+
+void
+WS_Rollback(struct ws *ws, uintptr_t pp)
+{
+
+ WS_Assert(ws);
+
+ if (pp == 0)
+ pp = (uintptr_t)ws->s;
+ ws_ClearOverflow(ws);
+ WS_Reset(ws, pp);
+}
+
+/*--------------------------------------------------------------------*/
+
+const char *
+WS_Printf(struct ws *ws, const char *fmt, ...)
+{
+ unsigned u, v;
+ va_list ap;
+ char *p;
+
+ u = WS_ReserveAll(ws);
+ p = ws->f;
+ va_start(ap, fmt);
+ v = vsnprintf(p, u, fmt, ap);
+ va_end(ap);
+ if (v >= u) {
+ WS_Release(ws, 0);
+ WS_MarkOverflow(ws);
+ p = NULL;
+ } else {
+ WS_Release(ws, v + 1);
+ }
+ return (p);
+}
+
+/*---------------------------------------------------------------------
+ * Build a VSB on a workspace.
+ * Usage pattern:
+ *
+ * struct vsb vsb[1];
+ * char *p;
+ *
+ * WS_VSB_new(vsb, ctx->ws);
+ * VSB_printf(vsb, "blablabla");
+ * p = WS_VSB_finish(vsb, ctx->ws, NULL);
+ * if (p == NULL)
+ * return (FAILURE);
+ */
+
+void
+WS_VSB_new(struct vsb *vsb, struct ws *ws)
+{
+ unsigned u;
+ static char bogus[2]; // Smallest possible vsb
+
+ AN(vsb);
+ WS_Assert(ws);
+ u = WS_ReserveAll(ws);
+ if (WS_Overflowed(ws) || u < 2)
+ AN(VSB_init(vsb, bogus, sizeof bogus));
+ else
+ AN(VSB_init(vsb, WS_Reservation(ws), u));
+}
+
+char *
+WS_VSB_finish(struct vsb *vsb, struct ws *ws, size_t *szp)
+{
+ char *p;
+
+ AN(vsb);
+ WS_Assert(ws);
+ if (!VSB_finish(vsb)) {
+ p = VSB_data(vsb);
+ if (p == ws->f) {
+ WS_Release(ws, VSB_len(vsb) + 1);
+ if (szp != NULL)
+ *szp = VSB_len(vsb);
+ VSB_fini(vsb);
+ return (p);
+ }
+ }
+ WS_MarkOverflow(ws);
+ VSB_fini(vsb);
+ WS_Release(ws, 0);
+ if (szp)
+ *szp = 0;
+ return (NULL);
+}
diff --git a/bin/varnishd/cache/cache_ws_emu.c b/bin/varnishd/cache/cache_ws_emu.c
index 631045bdd..95cb80800 100644
--- a/bin/varnishd/cache/cache_ws_emu.c
+++ b/bin/varnishd/cache/cache_ws_emu.c
@@ -39,7 +39,6 @@
#include "cache_varnishd.h"
-#include <stdio.h>
#include <stdlib.h>
struct ws_alloc {
@@ -182,32 +181,6 @@ WS_Init(struct ws *ws, const char *id, void *space, unsigned len)
WS_Assert(ws);
}
-void
-WS_Id(const struct ws *ws, char *id)
-{
-
- WS_Assert(ws);
- AN(id);
- memcpy(id, ws->id, WS_ID_SIZE);
- id[0] |= 0x20; // cheesy tolower()
-}
-
-void
-WS_MarkOverflow(struct ws *ws)
-{
- CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
-
- ws->id[0] &= ~0x20; // cheesy toupper()
-}
-
-static void
-ws_ClearOverflow(struct ws *ws)
-{
- CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
-
- ws->id[0] |= 0x20; // cheesy tolower()
-}
-
static void
ws_alloc_free(struct ws_emu *we, struct ws_alloc **wap)
{
@@ -248,18 +221,6 @@ WS_Reset(struct ws *ws, uintptr_t pp)
WS_Assert(ws);
}
-void
-WS_Rollback(struct ws *ws, uintptr_t pp)
-{
-
- WS_Assert(ws);
-
- if (pp == 0)
- pp = (uintptr_t)ws->s;
- ws_ClearOverflow(ws);
- WS_Reset(ws, pp);
-}
-
unsigned
WS_ReqPipeline(struct ws *ws, const void *b, const void *e)
{
@@ -375,28 +336,6 @@ WS_Copy(struct ws *ws, const void *str, int len)
return (NULL);
}
-const char *
-WS_Printf(struct ws *ws, const char *fmt, ...)
-{
- unsigned u, v;
- va_list ap;
- char *p;
-
- u = WS_ReserveAll(ws);
- p = ws->f;
- va_start(ap, fmt);
- v = vsnprintf(p, u, fmt, ap);
- va_end(ap);
- if (v >= u) {
- WS_Release(ws, 0);
- WS_MarkOverflow(ws);
- p = NULL;
- } else {
- WS_Release(ws, v + 1);
- }
- return (p);
-}
-
uintptr_t
WS_Snapshot(struct ws *ws)
{
@@ -464,12 +403,6 @@ WS_ReserveSize(struct ws *ws, unsigned bytes)
return (bytes);
}
-unsigned
-WS_ReserveLumps(struct ws *ws, size_t sz)
-{
- return (WS_ReserveAll(ws) / sz);
-}
-
static void
ws_release(struct ws *ws, unsigned bytes)
{
@@ -520,17 +453,6 @@ WS_ReleaseP(struct ws *ws, const char *ptr)
DSL(DBG_WORKSPACE, 0, "WS_ReleaseP(%p, %p (%u))", ws, ptr, l);
}
-int
-WS_Overflowed(const struct ws *ws)
-{
- CHECK_OBJ_NOTNULL(ws, WS_MAGIC);
- AN(ws->id[0]);
-
- if (ws->id[0] & 0x20) // cheesy islower()
- return (0);
- return (1);
-}
-
void *
WS_AtOffset(const struct ws *ws, unsigned off, unsigned len)
{
@@ -566,46 +488,6 @@ WS_ReservationOffset(const struct ws *ws)
return (wa->off);
}
-void
-WS_VSB_new(struct vsb *vsb, struct ws *ws)
-{
- unsigned u;
- static char bogus[2]; // Smallest possible vsb
-
- AN(vsb);
- WS_Assert(ws);
- u = WS_ReserveAll(ws);
- if (WS_Overflowed(ws) || u < 2)
- AN(VSB_init(vsb, bogus, sizeof bogus));
- else
- AN(VSB_init(vsb, WS_Reservation(ws), u));
-}
-
-char *
-WS_VSB_finish(struct vsb *vsb, struct ws *ws, size_t *szp)
-{
- char *p;
-
- AN(vsb);
- WS_Assert(ws);
- if (!VSB_finish(vsb)) {
- p = VSB_data(vsb);
- if (p == ws->f) {
- WS_Release(ws, VSB_len(vsb) + 1);
- if (szp != NULL)
- *szp = VSB_len(vsb);
- VSB_fini(vsb);
- return (p);
- }
- }
- WS_MarkOverflow(ws);
- VSB_fini(vsb);
- WS_Release(ws, 0);
- if (szp)
- *szp = 0;
- return (NULL);
-}
-
unsigned
WS_Dump(const struct ws *ws, char where, size_t off, void *buf, size_t len)
{
More information about the varnish-commit
mailing list