[master] cb339b61b vsc: Keep track of doc segments in an additional list
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Wed Jul 3 10:04:06 UTC 2024
commit cb339b61b59ee45fa72b137a5f6d2c088ef6ff49
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Tue Jun 4 14:33:14 2024 +0200
vsc: Keep track of doc segments in an additional list
This avoids iterating over all segments when we are looking for a
specific doc_id.
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 25f9680c0..015872bf4 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -89,6 +89,7 @@ struct vsc_seg {
#define VSC_SEG_MAGIC 0x801177d4
enum vsc_seg_type type;
VTAILQ_ENTRY(vsc_seg) list;
+ VTAILQ_ENTRY(vsc_seg) doc_list;
struct vsm_fantom fantom[1];
const struct vsc_head *head;
const char *body;
@@ -110,6 +111,7 @@ struct vsc {
unsigned raw;
struct vsc_sf_head sf_list;
struct vsc_seg_head segs;
+ struct vsc_seg_head docs;
VSC_new_f *fnew;
VSC_destroy_f *fdestroy;
@@ -144,6 +146,7 @@ VSC_New(void)
return (vsc);
VTAILQ_INIT(&vsc->sf_list);
VTAILQ_INIT(&vsc->segs);
+ VTAILQ_INIT(&vsc->docs);
return (vsc);
}
@@ -425,10 +428,9 @@ vsc_map_seg(const struct vsc *vsc, struct vsm *vsm, struct vsc_seg *sp)
* read and match on the doc_id until the DOCS section is
* mapped. Iterate over all the DOCS sections, attempt to
* map if needed, and then check the doc_id. */
- VTAILQ_FOREACH(spd, &vsc->segs, list) {
+ VTAILQ_FOREACH(spd, &vsc->docs, doc_list) {
CHECK_OBJ_NOTNULL(spd, VSC_SEG_MAGIC);
- if (spd->type != VSC_SEG_DOCS)
- continue;
+ assert(spd->type == VSC_SEG_DOCS);
if (!spd->mapped && vsc_map_seg(vsc, vsm, spd))
continue; /* Failed to map it */
AN(spd->mapped);
@@ -508,6 +510,8 @@ vsc_del_segs(struct vsc *vsc, struct vsm *vsm, struct vsc_seg_head *head)
VTAILQ_FOREACH_SAFE(sp, head, list, sp2) {
CHECK_OBJ(sp, VSC_SEG_MAGIC);
VTAILQ_REMOVE(head, sp, list);
+ if (sp->type == VSC_SEG_DOCS)
+ VTAILQ_REMOVE(&vsc->docs, sp, doc_list);
vsc_expose(vsc, sp, 1);
vsc_unmap_seg(vsc, vsm, sp);
FREE_OBJ(sp);
@@ -589,6 +593,8 @@ VSC_Iter(struct vsc *vsc, struct vsm *vsm, VSC_iter_f *fiter, void *priv)
sp = vsc_new_seg(&ifantom, type);
AN(sp);
VTAILQ_INSERT_TAIL(&vsc->segs, sp, list);
+ if (type == VSC_SEG_DOCS)
+ VTAILQ_INSERT_TAIL(&vsc->docs, sp, doc_list);
}
assert(sp->type == type);
@@ -693,5 +699,6 @@ VSC_Destroy(struct vsc **vscp, struct vsm *vsm)
}
vsc_del_segs(vsc, vsm, &vsc->segs);
+ assert(VTAILQ_EMPTY(&vsc->docs));
FREE_OBJ(vsc);
}
More information about the varnish-commit
mailing list