[master] 0933928 Call VTCP_open/close through method pointers
Poul-Henning Kamp
phk at FreeBSD.org
Thu Mar 8 00:40:07 UTC 2018
commit 0933928075d0d29b692975f72319687e3eb48aa3
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Mar 7 23:19:58 2018 +0000
Call VTCP_open/close through method pointers
diff --git a/bin/varnishd/cache/cache_tcp_pool.c b/bin/varnishd/cache/cache_tcp_pool.c
index 1c0ca90..fff58c0 100644
--- a/bin/varnishd/cache/cache_tcp_pool.c
+++ b/bin/varnishd/cache/cache_tcp_pool.c
@@ -44,31 +44,83 @@
#include "cache_tcp_pool.h"
#include "cache_pool.h"
+typedef int cp_open_f(const struct tcp_pool *, double tmo, const void **privp);
+typedef void cp_close_f(struct pfd *);
+
+struct cp_methods {
+ cp_open_f *open;
+ cp_close_f *close;
+};
+
struct tcp_pool {
- unsigned magic;
-#define TCP_POOL_MAGIC 0x28b0e42a
+ unsigned magic;
+#define TCP_POOL_MAGIC 0x28b0e42a
+
+ const struct cp_methods *methods;
- const void *id;
- struct suckaddr *ip4;
- struct suckaddr *ip6;
+ const void *id;
+ struct suckaddr *ip4;
+ struct suckaddr *ip6;
- VTAILQ_ENTRY(tcp_pool) list;
- int refcnt;
- struct lock mtx;
+ VTAILQ_ENTRY(tcp_pool) list;
+ int refcnt;
+ struct lock mtx;
- VTAILQ_HEAD(, pfd) connlist;
- int n_conn;
+ VTAILQ_HEAD(, pfd) connlist;
+ int n_conn;
- VTAILQ_HEAD(, pfd) killlist;
- int n_kill;
+ VTAILQ_HEAD(, pfd) killlist;
+ int n_kill;
- int n_used;
+ int n_used;
};
static struct lock tcp_pools_mtx;
static VTAILQ_HEAD(, tcp_pool) tcp_pools = VTAILQ_HEAD_INITIALIZER(tcp_pools);
/*--------------------------------------------------------------------
+ */
+
+static int v_matchproto_(cp_open_f)
+vtp_open(const struct tcp_pool *tp, double tmo, const void **privp)
+{
+ int s;
+ int msec;
+
+ CHECK_OBJ_NOTNULL(tp, TCP_POOL_MAGIC);
+
+ msec = (int)floor(tmo * 1000.0);
+ if (cache_param->prefer_ipv6) {
+ *privp = tp->ip6;
+ s = VTCP_connect(tp->ip6, msec);
+ if (s >= 0)
+ return (s);
+ }
+ *privp = tp->ip4;
+ s = VTCP_connect(tp->ip4, msec);
+ if (s >= 0)
+ return (s);
+ if (!cache_param->prefer_ipv6) {
+ *privp = tp->ip6;
+ s = VTCP_connect(tp->ip6, msec);
+ }
+ return (s);
+}
+
+static void v_matchproto_(cp_close_f)
+vtp_close(struct pfd *pfd)
+{
+
+ CHECK_OBJ_NOTNULL(pfd, PFD_MAGIC);
+ VTCP_close(&pfd->fd);
+}
+
+static const struct cp_methods vtp_methods = {
+ .open = vtp_open,
+ .close = vtp_close,
+};
+
+/*--------------------------------------------------------------------
* Waiter-handler
*/
@@ -94,13 +146,13 @@ tcp_handle(struct waited *w, enum wait_event ev, double now)
AZ(pthread_cond_signal(pfd->cond));
break;
case PFD_STATE_AVAIL:
- VTCP_close(&pfd->fd);
+ tp->methods->close(pfd);
VTAILQ_REMOVE(&tp->connlist, pfd, list);
tp->n_conn--;
FREE_OBJ(pfd);
break;
case PFD_STATE_CLEANUP:
- VTCP_close(&pfd->fd);
+ tp->methods->close(pfd);
tp->n_kill--;
VTAILQ_REMOVE(&tp->killlist, pfd, list);
memset(pfd, 0x11, sizeof *pfd);
@@ -154,6 +206,7 @@ VTP_Ref(const struct suckaddr *ip4, const struct suckaddr *ip6, const void *id)
ALLOC_OBJ(tp, TCP_POOL_MAGIC);
AN(tp);
+ tp->methods = &vtp_methods;
if (ip4 != NULL)
tp->ip4 = VSA_Clone(ip4);
if (ip6 != NULL)
@@ -241,27 +294,8 @@ VTP_Rel(struct tcp_pool **tpp)
int
VTP_Open(const struct tcp_pool *tp, double tmo, const void **privp)
{
- int s;
- int msec;
- CHECK_OBJ_NOTNULL(tp, TCP_POOL_MAGIC);
-
- msec = (int)floor(tmo * 1000.0);
- if (cache_param->prefer_ipv6) {
- *privp = tp->ip6;
- s = VTCP_connect(tp->ip6, msec);
- if (s >= 0)
- return (s);
- }
- *privp = tp->ip4;
- s = VTCP_connect(tp->ip4, msec);
- if (s >= 0)
- return (s);
- if (!cache_param->prefer_ipv6) {
- *privp = tp->ip6;
- s = VTCP_connect(tp->ip6, msec);
- }
- return (s);
+ return (vtp_open(tp, tmo, privp));
}
/*--------------------------------------------------------------------
@@ -295,7 +329,7 @@ VTP_Recycle(const struct worker *wrk, struct pfd **pfdp)
pfd->waited->func = tcp_handle;
pfd->waited->tmo = &cache_param->backend_idle_timeout;
if (Wait_Enter(wrk->pool->waiter, pfd->waited)) {
- VTCP_close(&pfd->fd);
+ tp->methods->close(pfd);
memset(pfd, 0x33, sizeof *pfd);
free(pfd);
// XXX: stats
@@ -356,7 +390,7 @@ VTP_Close(struct pfd **pfdp)
tp->n_kill++;
} else {
assert(pfd->state == PFD_STATE_USED);
- VTCP_close(&pfd->fd);
+ tp->methods->close(pfd);
memset(pfd, 0x44, sizeof *pfd);
free(pfd);
}
@@ -402,7 +436,7 @@ VTP_Get(struct tcp_pool *tp, double tmo, struct worker *wrk,
INIT_OBJ(pfd->waited, WAITED_MAGIC);
pfd->state = PFD_STATE_USED;
pfd->tcp_pool = tp;
- pfd->fd = VTP_Open(tp, tmo, &pfd->priv);
+ pfd->fd = tp->methods->open(tp, tmo, &pfd->priv);
if (pfd->fd < 0) {
FREE_OBJ(pfd);
Lck_Lock(&tp->mtx);
More information about the varnish-commit
mailing list