[master] 6361987 Use a static jump table for the cursors.
Martin Blix Grydeland
martin at varnish-cache.org
Wed May 15 14:46:14 CEST 2013
commit 636198778809de2098cfe7357a055618d70d4e79
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date: Wed May 1 18:05:07 2013 +0200
Use a static jump table for the cursors.
diff --git a/lib/libvarnishapi/vsl_api.h b/lib/libvarnishapi/vsl_api.h
index 039d57b..eb9e543 100644
--- a/lib/libvarnishapi/vsl_api.h
+++ b/lib/libvarnishapi/vsl_api.h
@@ -51,11 +51,7 @@ typedef int vslc_skip_f(void *, ssize_t words);
typedef int vslc_ref_f(void *, struct vslc_shmptr *ptr);
typedef int vslc_check_f(const void *, const struct VSLC_ptr *ptr);
-struct vslc {
- struct VSL_cursor c;
- unsigned magic;
-#define VSLC_MAGIC 0x5007C0DE
-
+struct vslc_tbl {
vslc_delete_f *delete;
vslc_next_f *next;
vslc_reset_f *reset;
@@ -63,6 +59,14 @@ struct vslc {
vslc_check_f *check;
};
+struct vslc {
+ struct VSL_cursor c;
+ unsigned magic;
+#define VSLC_MAGIC 0x5007C0DE
+
+ const struct vslc_tbl *tbl;
+};
+
struct VSL_data {
unsigned magic;
#undef VSL_MAGIC
diff --git a/lib/libvarnishapi/vsl_cursor.c b/lib/libvarnishapi/vsl_cursor.c
index 1712ade..f4a7738 100644
--- a/lib/libvarnishapi/vsl_cursor.c
+++ b/lib/libvarnishapi/vsl_cursor.c
@@ -212,6 +212,14 @@ vslc_vsm_skip(void *cursor, ssize_t words)
return (0);
}
+static struct vslc_tbl vslc_vsm_tbl = {
+ .delete = vslc_vsm_delete,
+ .next = vslc_vsm_next,
+ .reset = vslc_vsm_reset,
+ .skip = vslc_vsm_skip,
+ .check = vslc_vsm_check,
+};
+
struct VSL_cursor *
VSL_CursorVSM(struct VSL_data *vsl, struct VSM_data *vsm, int tail)
{
@@ -245,11 +253,7 @@ VSL_CursorVSM(struct VSL_data *vsl, struct VSM_data *vsm, int tail)
c->c.c.vxid = -1; /* N/A to this cursor type */
c->c.c.shmptr_ok = 1;
c->c.magic = VSLC_MAGIC;
- c->c.delete = vslc_vsm_delete;
- c->c.next = vslc_vsm_next;
- c->c.reset = vslc_vsm_reset;
- c->c.skip = vslc_vsm_skip;
- c->c.check = vslc_vsm_check;
+ c->c.tbl = & vslc_vsm_tbl;
c->vsm = vsm;
c->vf = vf;
@@ -356,6 +360,14 @@ vslc_file_reset(void *cursor)
return (-1);
}
+static struct vslc_tbl vslc_file_tbl = {
+ .delete = vslc_file_delete,
+ .next = vslc_file_next,
+ .reset = vslc_file_reset,
+ .skip = NULL,
+ .check = NULL,
+};
+
struct VSL_cursor *
VSL_CursorFile(struct VSL_data *vsl, const char *name)
{
@@ -399,9 +411,7 @@ VSL_CursorFile(struct VSL_data *vsl, const char *name)
}
c->c.c.vxid = -1; /* N/A to this cursor type */
c->c.magic = VSLC_MAGIC;
- c->c.delete = vslc_file_delete;
- c->c.next = vslc_file_next;
- c->c.reset = vslc_file_reset;
+ c->c.tbl = &vslc_file_tbl;
c->fd = fd;
c->buflen = BUFSIZ;
@@ -417,9 +427,9 @@ VSL_DeleteCursor(struct VSL_cursor *cursor)
struct vslc *c;
CAST_OBJ_NOTNULL(c, (void *)cursor, VSLC_MAGIC);
- if (c->delete == NULL)
+ if (c->tbl->delete == NULL)
return;
- (c->delete)(c);
+ (c->tbl->delete)(c);
}
int
@@ -428,9 +438,9 @@ VSL_ResetCursor(struct VSL_cursor *cursor)
struct vslc *c;
CAST_OBJ_NOTNULL(c, (void *)cursor, VSLC_MAGIC);
- if (c->reset == NULL)
+ if (c->tbl->reset == NULL)
return (-1);
- return ((c->reset)(c));
+ return ((c->tbl->reset)(c));
}
int
@@ -439,8 +449,8 @@ VSL_Next(struct VSL_cursor *cursor)
struct vslc *c;
CAST_OBJ_NOTNULL(c, (void *)cursor, VSLC_MAGIC);
- AN(c->next);
- return ((c->next)(c));
+ AN(c->tbl->next);
+ return ((c->tbl->next)(c));
}
int
@@ -449,9 +459,9 @@ vsl_skip(struct VSL_cursor *cursor, ssize_t words)
struct vslc *c;
CAST_OBJ_NOTNULL(c, (void *)cursor, VSLC_MAGIC);
- if (c->skip == NULL)
+ if (c->tbl->skip == NULL)
return (-1);
- return ((c->skip)(c, words));
+ return ((c->tbl->skip)(c, words));
}
int
@@ -460,7 +470,7 @@ VSL_Check(const struct VSL_cursor *cursor, const struct VSLC_ptr *ptr)
const struct vslc *c;
CAST_OBJ_NOTNULL(c, (const void *)cursor, VSLC_MAGIC);
- if (c->check == NULL)
+ if (c->tbl->check == NULL)
return (-1);
- return ((c->check)(c, ptr));
+ return ((c->tbl->check)(c, ptr));
}
diff --git a/lib/libvarnishapi/vsl_dispatch.c b/lib/libvarnishapi/vsl_dispatch.c
index c5389b9..265e1e5 100644
--- a/lib/libvarnishapi/vsl_dispatch.c
+++ b/lib/libvarnishapi/vsl_dispatch.c
@@ -203,6 +203,14 @@ vslc_raw_reset(void *cursor)
return (0);
}
+static struct vslc_tbl vslc_raw_tbl = {
+ .delete = NULL,
+ .next = vslc_raw_next,
+ .reset = vslc_raw_reset,
+ .skip = NULL,
+ .check = NULL,
+};
+
static int
vslc_vtx_next(void *cursor)
{
@@ -235,6 +243,14 @@ vslc_vtx_reset(void *cursor)
return (0);
}
+static struct vslc_tbl vslc_vtx_tbl = {
+ .delete = NULL,
+ .next = vslc_vtx_next,
+ .reset = vslc_vtx_reset,
+ .skip = NULL,
+ .check = NULL,
+};
+
static void
vslc_vtx_setup(struct vslc_vtx *c, struct vtx *vtx, unsigned level)
{
@@ -245,8 +261,7 @@ vslc_vtx_setup(struct vslc_vtx *c, struct vtx *vtx, unsigned level)
c->c.c.vxid = vtx->key.vxid;
c->c.c.level = level;
c->c.magic = VSLC_MAGIC;
- c->c.next = vslc_vtx_next;
- c->c.reset = vslc_vtx_reset;
+ c->c.tbl = &vslc_vtx_tbl;
c->magic = VSLC_VTX_MAGIC;
c->vtx = vtx;
@@ -780,8 +795,7 @@ vslq_raw(struct VSLQ *vslq, VSLQ_dispatch_f *func, void *priv)
memset(&rawc, 0, sizeof rawc);
rawc.c.c.vxid = -1;
rawc.c.magic = VSLC_MAGIC;
- rawc.c.next = vslc_raw_next;
- rawc.c.reset = vslc_raw_reset;
+ rawc.c.tbl = &vslc_raw_tbl;
rawc.magic = VSLC_RAW_MAGIC;
pc[0] = &rawc.c.c;
pc[1] = NULL;
More information about the varnish-commit
mailing list