Commit b78cb58a authored by Dridi Boukelmoune's avatar Dridi Boukelmoune

vsc: Fold the include and exclude lists together

Instead we now have a single list that works on a first-match basis,
slightly changing the previous outcome where all exclusions were
checked before inclusions as illustrated by the u5 VTC.

To add insult to the injury the precedence of exclusive patterns over
inclusive patterns was documented backwards.
parent 6351aac3
......@@ -19,8 +19,8 @@ shell "grep -q vbe ${p1_out}"
shell "grep -q LCK.mempool.creat ${p1_out}"
shell -err "grep -q LCK.vbe.destroy ${p1_out}"
process p2 {varnishstat -1 -n ${v1_name} -f *vbe* \
-f ^*vbe.destroy -f LCK.mempool.c* | tr '[1-9]' '0'} -run
process p2 {varnishstat -1 -n ${v1_name} -f ^*vbe.destroy -f *vbe* \
-f LCK.mempool.c* | tr '[1-9]' '0'} -run
shell "cmp -s ${p1_out} ${p2_out}"
......
......@@ -132,6 +132,6 @@
"Field inclusion glob." \
" Use backslash to escape characters. If the argument" \
" starts with '^' it is used as an exclusive glob." \
" Multiple -f arguments may be given. Inclusive globs" \
" are accumulative and are run before exclusive ones." \
" Multiple -f arguments may be given. Filtering globs" \
" are run in order on a first-match basis." \
)
......@@ -53,12 +53,23 @@
#include "vapi/vsc.h"
#include "vapi/vsm.h"
struct vsc_sf_mode {
const char *name;
unsigned include;
unsigned fail;
};
static struct vsc_sf_mode VSC_SF_INCLUDE[1] = {{"include", 1, 1}};
static struct vsc_sf_mode VSC_SF_EXCLUDE[1] = {{"exclude", 0, 0}};
struct vsc_sf {
unsigned magic;
#define VSC_SF_MAGIC 0x558478dd
VTAILQ_ENTRY(vsc_sf) list;
char *pattern;
unsigned magic;
#define VSC_SF_MAGIC 0x558478dd
VTAILQ_ENTRY(vsc_sf) list;
char *pattern;
const struct vsc_sf_mode *mode;
};
VTAILQ_HEAD(vsc_sf_head, vsc_sf);
struct vsc_pt {
......@@ -85,8 +96,7 @@ struct vsc {
unsigned magic;
#define VSC_MAGIC 0x3373554a
struct vsc_sf_head sf_list_include;
struct vsc_sf_head sf_list_exclude;
struct vsc_sf_head sf_list;
VTAILQ_HEAD(,vsc_seg) segs;
VSC_new_f *fnew;
......@@ -120,8 +130,7 @@ VSC_New(void)
ALLOC_OBJ(vsc, VSC_MAGIC);
if (vsc == NULL)
return (vsc);
VTAILQ_INIT(&vsc->sf_list_include);
VTAILQ_INIT(&vsc->sf_list_exclude);
VTAILQ_INIT(&vsc->sf_list);
VTAILQ_INIT(&vsc->segs);
return (vsc);
}
......@@ -132,7 +141,6 @@ static int
vsc_f_arg(struct vsc *vsc, const char *opt)
{
struct vsc_sf *sf;
unsigned exclude = 0;
AN(opt);
......@@ -140,18 +148,14 @@ vsc_f_arg(struct vsc *vsc, const char *opt)
AN(sf);
if (opt[0] == '^') {
exclude = 1;
sf->mode = VSC_SF_EXCLUDE;
opt++;
} else {
sf->mode = VSC_SF_INCLUDE;
}
sf->pattern = strdup(opt);
AN(sf->pattern);
if (exclude)
VTAILQ_INSERT_TAIL(&vsc->sf_list_exclude, sf, list);
else
VTAILQ_INSERT_TAIL(&vsc->sf_list_include, sf, list);
REPLACE(sf->pattern, opt);
VTAILQ_INSERT_TAIL(&vsc->sf_list, sf, list);
return (1);
}
......@@ -177,17 +181,15 @@ static int
vsc_filter(const struct vsc *vsc, const char *nm)
{
struct vsc_sf *sf;
unsigned res = 0;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
VTAILQ_FOREACH(sf, &vsc->sf_list_exclude, list)
VTAILQ_FOREACH(sf, &vsc->sf_list, list) {
if (!fnmatch(sf->pattern, nm, 0))
return (1);
if (VTAILQ_EMPTY(&vsc->sf_list_include))
return (0);
VTAILQ_FOREACH(sf, &vsc->sf_list_include, list)
if (!fnmatch(sf->pattern, nm, 0))
return (0);
return (1);
return (!sf->mode->include);
res |= sf->mode->fail;
}
return (res);
}
/*--------------------------------------------------------------------
......@@ -516,29 +518,21 @@ VSC_ChangeLevel(const struct VSC_level_desc *old, int chg)
/*--------------------------------------------------------------------*/
static void
vsc_delete_sf_list(struct vsc_sf_head *head)
{
struct vsc_sf *sf;
while (!VTAILQ_EMPTY(head)) {
sf = VTAILQ_FIRST(head);
CHECK_OBJ_NOTNULL(sf, VSC_SF_MAGIC);
VTAILQ_REMOVE(head, sf, list);
free(sf->pattern);
FREE_OBJ(sf);
}
}
void
VSC_Destroy(struct vsc **vscp, struct vsm *vsm)
{
struct vsc *vsc;
struct vsc_sf *sf, *sf2;
struct vsc_seg *sp, *sp2;
TAKE_OBJ_NOTNULL(vsc, vscp, VSC_MAGIC);
vsc_delete_sf_list(&vsc->sf_list_include);
vsc_delete_sf_list(&vsc->sf_list_exclude);
VTAILQ_FOREACH_SAFE(sf, &vsc->sf_list, list, sf2) {
CHECK_OBJ_NOTNULL(sf, VSC_SF_MAGIC);
VTAILQ_REMOVE(&vsc->sf_list, sf, list);
free(sf->pattern);
FREE_OBJ(sf);
}
VTAILQ_FOREACH_SAFE(sp, &vsc->segs, list, sp2) {
VTAILQ_REMOVE(&vsc->segs, sp, list);
vsc_expose(vsc, sp, 1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment