Commit 3af1809d authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Redo the VSC api new-style.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@4937 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent c13eae40
......@@ -197,6 +197,7 @@ main(int argc, char * const *argv)
int delay = 1, once = 0, xml = 0;
vd = VSM_New();
VSC_Setup(vd);
while ((c = getopt(argc, argv, VSL_STAT_ARGS "1f:lVw:x")) != -1) {
switch (c) {
......@@ -207,7 +208,7 @@ main(int argc, char * const *argv)
(void)VSC_Arg(vd, c, optarg);
break;
case 'l':
if (VSM_Open(vd, 1))
if (VSC_Open(vd, 1))
exit(1);
list_fields(vd);
exit(0);
......@@ -227,11 +228,10 @@ main(int argc, char * const *argv)
}
}
if (VSM_Open(vd, 1))
if (VSC_Open(vd, 1))
exit(1);
if ((VSL_stats = VSM_OpenStats(vd)) == NULL)
exit(1);
VSL_stats = VSC_Main(vd);
if (xml)
do_xml(vd);
......
......@@ -67,8 +67,6 @@ struct varnish {
struct vtclog *vl1;
VTAILQ_ENTRY(varnish) list;
struct vsc_main *stats;
struct vsb *storage;
struct vsb *args;
......@@ -262,6 +260,7 @@ varnish_launch(struct varnish *v)
char *r;
v->vd = VSM_New();
VSC_Setup(v->vd);
/* Create listener socket */
nap = VSS_resolve("127.0.0.1", "0", &ap);
......@@ -362,11 +361,8 @@ varnish_launch(struct varnish *v)
vtc_log(v->vl, 0, "CLI auth command failed: %u %s", u, r);
free(r);
if (v->stats != NULL)
VSM_Close(v->vd);
(void)VSL_Log_Arg(v->vd, 'n', v->workdir);
AZ(VSM_Open(v->vd, 1));
v->stats = VSM_OpenStats(v->vd);
AZ(VSC_Open(v->vd, 1));
}
/**********************************************************************
......
......@@ -125,8 +125,11 @@ void vsm_itern(const struct VSM_data *vd, struct vsm_chunk **pp);
* VSC level access functions
*/
void VSC_Setup(struct VSM_data *vd);
int VSC_Arg(struct VSM_data *vd, int arg, const char *opt);
struct vsc_main *VSM_OpenStats(struct VSM_data *vd);
int VSC_Open(struct VSM_data *vd, int diag);
struct vsc_main *VSC_Main(struct VSM_data *vd);
struct vsc_point {
const char *class; /* stat struct type */
......@@ -146,7 +149,6 @@ int VSC_Iter(const struct VSM_data *vd, vsc_iter_f *func, void *priv);
* VSL level access functions
*/
/* shmlog.c */
typedef int vsl_handler(void *priv, enum vsl_tag tag, unsigned fd,
unsigned len, unsigned spec, const char *ptr);
#define VSL_S_CLIENT (1 << 0)
......
......@@ -49,20 +49,75 @@ SVNID("$Id$")
#include "vslapi.h"
struct vsc_sf {
unsigned magic;
#define VSL_SF_MAGIC 0x558478dd
VTAILQ_ENTRY(vsc_sf) next;
int flags;
#define VSL_SF_EXCL (1 << 0)
#define VSL_SF_CL_WC (1 << 1)
#define VSL_SF_ID_WC (1 << 2)
#define VSL_SF_NM_WC (1 << 3)
char *class;
char *ident;
char *name;
};
struct vsc {
unsigned magic;
#define VSC_MAGIC 0x3373554a
int sf_init;
VTAILQ_HEAD(, vsc_sf) sf_list;
};
/*--------------------------------------------------------------------*/
void
VSC_Setup(struct VSM_data *vd)
{
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AZ(vd->vsc);
// XXX: AZ(vd->vsm);
ALLOC_OBJ(vd->vsc, VSC_MAGIC);
AN(vd->vsc);
VTAILQ_INIT(&vd->vsc->sf_list);
}
void
vsc_delete(struct VSM_data *vd)
{
struct vsc_sf *sf;
struct vsc *vsc = vd->vsc;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
while(!VTAILQ_EMPTY(&vsc->sf_list)) {
sf = VTAILQ_FIRST(&vsc->sf_list);
VTAILQ_REMOVE(&vsc->sf_list, sf, next);
free(sf->class);
free(sf->ident);
free(sf->name);
free(sf);
}
}
/*--------------------------------------------------------------------*/
static int
vsc_sf_arg(struct VSM_data *vd, const char *opt)
vsc_sf_arg(struct vsc *vsc, const char *opt)
{
struct vsc_sf *sf;
char **av, *q, *p;
int i;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
if (VTAILQ_EMPTY(&vd->sf_list)) {
if (VTAILQ_EMPTY(&vsc->sf_list)) {
if (*opt == '^')
vd->sf_init = 1;
vsc->sf_init = 1;
}
av = ParseArgv(opt, ARGV_COMMA);
......@@ -74,7 +129,7 @@ vsc_sf_arg(struct VSM_data *vd, const char *opt)
for (i = 1; av[i] != NULL; i++) {
ALLOC_OBJ(sf, VSL_SF_MAGIC);
AN(sf);
VTAILQ_INSERT_TAIL(&vd->sf_list, sf, next);
VTAILQ_INSERT_TAIL(&vsc->sf_list, sf, next);
p = av[i];
if (*p == '^') {
......@@ -134,10 +189,13 @@ vsc_sf_arg(struct VSM_data *vd, const char *opt)
int
VSC_Arg(struct VSM_data *vd, int arg, const char *opt)
{
struct vsc *vsc;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
vsc = vd->vsc;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
switch (arg) {
case 'f': return (vsc_sf_arg(vd, opt));
case 'f': return (vsc_sf_arg(vsc, opt));
case 'n': return (VSM_n_Arg(vd, opt));
default:
return (0);
......@@ -146,12 +204,27 @@ VSC_Arg(struct VSM_data *vd, int arg, const char *opt)
/*--------------------------------------------------------------------*/
int
VSC_Open(struct VSM_data *vd, int diag)
{
int i;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AN(vd->vsc);
i = VSM_Open(vd, diag);
return (i);
}
/*--------------------------------------------------------------------*/
struct vsc_main *
VSM_OpenStats(struct VSM_data *vd)
VSC_Main(struct VSM_data *vd)
{
struct vsm_chunk *sha;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
CHECK_OBJ_NOTNULL(vd->vsc, VSC_MAGIC);
sha = vsm_find_alloc(vd, VSC_CLASS, "", "");
assert(sha != NULL);
......@@ -176,16 +249,20 @@ iter_test(const char *s1, const char *s2, int wc)
}
static int
iter_call(const struct VSM_data *vd, vsc_iter_f *func, void *priv,
iter_call(const struct vsc *vsc, vsc_iter_f *func, void *priv,
const struct vsc_point *const sp)
{
struct vsc_sf *sf;
int good = vd->sf_init;
int good;
if (VTAILQ_EMPTY(&vd->sf_list))
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
if (VTAILQ_EMPTY(&vsc->sf_list))
return (func(priv, sp));
VTAILQ_FOREACH(sf, &vd->sf_list, next) {
good = vsc->sf_init;
VTAILQ_FOREACH(sf, &vsc->sf_list, next) {
if (iter_test(sf->class, sp->class, sf->flags & VSL_SF_CL_WC))
continue;
if (iter_test(sf->ident, sp->ident, sf->flags & VSL_SF_ID_WC))
......@@ -203,13 +280,17 @@ iter_call(const struct VSM_data *vd, vsc_iter_f *func, void *priv,
}
static int
iter_main(const struct VSM_data *vd, struct vsm_chunk *sha, vsc_iter_f *func,
iter_main(const struct vsc *vsc, struct vsm_chunk *sha, vsc_iter_f *func,
void *priv)
{
struct vsc_main *st = VSM_PTR(sha);
struct vsc_main *st;
struct vsc_point sp;
int i;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
CHECK_OBJ_NOTNULL(sha, VSM_CHUNK_MAGIC);
st = VSM_PTR(sha);
sp.class = "";
sp.ident = "";
#define VSC_F_MAIN(nn, tt, ll, ff, dd) \
......@@ -218,7 +299,7 @@ iter_main(const struct VSM_data *vd, struct vsm_chunk *sha, vsc_iter_f *func,
sp.flag = ff; \
sp.desc = dd; \
sp.ptr = &st->nn; \
i = iter_call(vd, func, priv, &sp); \
i = iter_call(vsc, func, priv, &sp); \
if (i) \
return(i);
#include "vsc_fields.h"
......@@ -227,13 +308,17 @@ iter_main(const struct VSM_data *vd, struct vsm_chunk *sha, vsc_iter_f *func,
}
static int
iter_sma(const struct VSM_data *vd, struct vsm_chunk *sha, vsc_iter_f *func,
iter_sma(const struct vsc *vsc, struct vsm_chunk *sha, vsc_iter_f *func,
void *priv)
{
struct vsc_sma *st = VSM_PTR(sha);
struct vsc_sma *st;
struct vsc_point sp;
int i;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
CHECK_OBJ_NOTNULL(sha, VSM_CHUNK_MAGIC);
st = VSM_PTR(sha);
sp.class = VSC_TYPE_SMA;
sp.ident = sha->ident;
#define VSC_F_SMA(nn, tt, ll, ff, dd) \
......@@ -242,7 +327,7 @@ iter_sma(const struct VSM_data *vd, struct vsm_chunk *sha, vsc_iter_f *func,
sp.flag = ff; \
sp.desc = dd; \
sp.ptr = &st->nn; \
i = iter_call(vd, func, priv, &sp); \
i = iter_call(vsc, func, priv, &sp); \
if (i) \
return(i);
#include "vsc_fields.h"
......@@ -253,18 +338,23 @@ iter_sma(const struct VSM_data *vd, struct vsm_chunk *sha, vsc_iter_f *func,
int
VSC_Iter(const struct VSM_data *vd, vsc_iter_f *func, void *priv)
{
struct vsc *vsc;
struct vsm_chunk *sha;
int i;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
vsc = vd->vsc;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
i = 0;
VSM_FOREACH(sha, vd) {
CHECK_OBJ_NOTNULL(sha, VSM_CHUNK_MAGIC);
if (strcmp(sha->class, VSC_CLASS))
continue;
if (!strcmp(sha->type, VSC_TYPE_MAIN))
i = iter_main(vd, sha, func, priv);
i = iter_main(vsc, sha, func, priv);
else if (!strcmp(sha->type, VSC_TYPE_SMA))
i = iter_sma(vd, sha, func, priv);
i = iter_sma(vsc, sha, func, priv);
else
i = -1;
if (i != 0)
......
......@@ -33,19 +33,7 @@
#define SLEEP_USEC (50*1000)
#define TIMEOUT_USEC (5*1000*1000)
struct vsc_sf {
unsigned magic;
#define VSL_SF_MAGIC 0x558478dd
VTAILQ_ENTRY(vsc_sf) next;
int flags;
#define VSL_SF_EXCL (1 << 0)
#define VSL_SF_CL_WC (1 << 1)
#define VSL_SF_ID_WC (1 << 2)
#define VSL_SF_NM_WC (1 << 3)
char *class;
char *ident;
char *name;
};
struct vsc;
struct VSM_data {
unsigned magic;
......@@ -67,8 +55,7 @@ struct VSM_data {
/* Stuff relating the stats fields start here */
int sf_init;
VTAILQ_HEAD(, vsc_sf) sf_list;
struct vsc *vsc;
/* Stuff relating the log records below here */
......@@ -119,3 +106,6 @@ struct VSM_data {
struct vsm_chunk *vsm_find_alloc(const struct VSM_data *vd, const char *class,
const char *type, const char *ident);
void vsc_delete(struct VSM_data *vd);
......@@ -87,8 +87,6 @@ VSM_New(void)
vd->rbuf = malloc(vd->rbuflen * 4);
assert(vd->rbuf != NULL);
VTAILQ_INIT(&vd->sf_list);
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
return (vd);
}
......@@ -139,7 +137,6 @@ VSM_Name(const struct VSM_data *vd)
void
VSM_Delete(struct VSM_data *vd)
{
struct vsc_sf *sf;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
VSM_Close(vd);
......@@ -151,14 +148,7 @@ VSM_Delete(struct VSM_data *vd)
free(vd->rbuf);
free(vd->fname);
while(!VTAILQ_EMPTY(&vd->sf_list)) {
sf = VTAILQ_FIRST(&vd->sf_list);
VTAILQ_REMOVE(&vd->sf_list, sf, next);
free(sf->class);
free(sf->ident);
free(sf->name);
free(sf);
}
vsc_delete(vd);
free(vd);
}
......
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