Commit 5cbd8caa authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make Varnish API aware of the new structure and make everything compile

again.  Much still outstanding.
parent 9aaaf23a
...@@ -289,6 +289,7 @@ main(int argc, char * const *argv) ...@@ -289,6 +289,7 @@ main(int argc, char * const *argv)
exit(1); exit(1);
VSC_C_main = VSC_Main(vd); VSC_C_main = VSC_Main(vd);
AN(VSC_C_main);
if (!(xml || json || once)) { if (!(xml || json || once)) {
do_curses(vd, VSC_C_main, delay); do_curses(vd, VSC_C_main, delay);
......
...@@ -42,11 +42,14 @@ struct VSM_data; ...@@ -42,11 +42,14 @@ struct VSM_data;
void VSC_Setup(struct VSM_data *vd); void VSC_Setup(struct VSM_data *vd);
/* /*
* Setup vd for use with VSC functions. * Setup vd for use with VSC functions.
* Must be called once before any other VSC function is called
*/ */
#define VSC_ARGS "f:n:" #define VSC_ARGS "f:n:"
#define VSC_n_USAGE VSM_n_USAGE #define VSC_n_USAGE VSM_n_USAGE
#define VSC_USAGE VSC_N_USAGE #define VSC_f_USAGE "[-f field_name,...]"
#define VSC_USAGE VSC_n_USAGE \
VSC_f_USAGE
int VSC_Arg(struct VSM_data *vd, int arg, const char *opt); int VSC_Arg(struct VSM_data *vd, int arg, const char *opt);
/* /*
...@@ -66,6 +69,7 @@ int VSC_Open(struct VSM_data *vd, int diag); ...@@ -66,6 +69,7 @@ int VSC_Open(struct VSM_data *vd, int diag);
struct VSC_C_main *VSC_Main(struct VSM_data *vd); struct VSC_C_main *VSC_Main(struct VSM_data *vd);
/* /*
* return Main stats structure * return Main stats structure
* returns NULL until child has been started.
*/ */
struct VSC_point { struct VSC_point {
......
...@@ -42,11 +42,12 @@ struct VSM_data; ...@@ -42,11 +42,12 @@ struct VSM_data;
void VSL_Setup(struct VSM_data *vd); void VSL_Setup(struct VSM_data *vd);
/* /*
* Setup vd for use with VSL functions. * Setup vd for use with VSL functions.
* Must be called once before any other VSL function is called.
*/ */
int VSL_Open(struct VSM_data *vd, int diag); int VSL_Open(struct VSM_data *vd, int diag);
/* /*
* Attempt to open and map the shared memory file. * Attempt to open the VSM (unless -r given)
* If diag is non-zero, diagnostics are emitted. * If diag is non-zero, diagnostics are emitted.
* Returns: * Returns:
* 0 on success * 0 on success
......
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This is the public API for the VSM/VSC/VSL access.
*
*/ */
#ifndef VAPI_VSM_H_INCLUDED #ifndef VAPI_VSM_H_INCLUDED
...@@ -35,10 +37,14 @@ struct VSM_head; ...@@ -35,10 +37,14 @@ struct VSM_head;
struct VSM_chunk; struct VSM_chunk;
struct VSM_data; struct VSM_data;
/*
* This structure is used to reference a VSM chunk
*/
struct VSM_fantom { struct VSM_fantom {
struct VSM_chunk *chunk; struct VSM_chunk *chunk;
void *b; void *b; /* first byte of payload */
void *e; void *e; /* first byte past payload */
uintptr_t priv; uintptr_t priv;
}; };
...@@ -120,12 +126,31 @@ struct VSM_head *VSM_Head(const struct VSM_data *vd); ...@@ -120,12 +126,31 @@ struct VSM_head *VSM_Head(const struct VSM_data *vd);
* Return the head of the VSM. * Return the head of the VSM.
*/ */
void *VSM_Find_Chunk(struct VSM_data *vd, const char *class, void VSM__iter0(struct VSM_data *vd, struct VSM_fantom *vf);
const char *type, const char *ident, unsigned *lenp); int VSM__itern(struct VSM_data *vd, struct VSM_fantom *vf);
#define VSM_FOREACH_SAFE(vf, vd) \
for(VSM__iter0((vd), (vf)); VSM__itern((vd), (vf));)
/* /*
* Find a given chunk in the shared memory. * Iterate over all chunks in shared memory
* Returns pointer or NULL. * vf = "struct VSM_fantom *"
* Lenp, if non-NULL, is set to length of chunk. * vd = "struct VSM_data *"
*/
int VSM_StillValid(struct VSM_data *vd, struct VSM_fantom *vf);
/*
* Return:
* 0: fantom is invalid now.
* 1: fantom is still the same.
* 2: a fantom with same dimensions exist, check class/type/ident
*/
int VSM_Get(struct VSM_data *vd, struct VSM_fantom *vf, const char *class,
const char *type, const char *ident);
/*
* Find a chunk, produce fantom for it.
* Returns zero on failure.
* class is mandatory, type and ident optional.
*/ */
void VSM_Close(struct VSM_data *vd); void VSM_Close(struct VSM_data *vd);
...@@ -134,9 +159,28 @@ void VSM_Close(struct VSM_data *vd); ...@@ -134,9 +159,28 @@ void VSM_Close(struct VSM_data *vd);
* Deallocate all storage (including VSC and VSL allocations) * Deallocate all storage (including VSC and VSL allocations)
*/ */
/**********************************************************************
* These are old API functions which are less safe because there is
* fantom protecting the chunks worked on.
* They will g
*/
/* OBSOLETE: Will disappear from Varnish 4.x */
void *VSM_Find_Chunk(struct VSM_data *vd, const char *class,
const char *type, const char *ident, unsigned *lenp);
/*
* Find a given chunk in the shared memory.
* Returns pointer or NULL.
* Lenp, if non-NULL, is set to length of chunk.
*/
/* OBSOLETE: Will disappear from Varnish 4.x */
struct VSM_chunk *VSM_iter0(struct VSM_data *vd); struct VSM_chunk *VSM_iter0(struct VSM_data *vd);
void VSM_itern(const struct VSM_data *vd, struct VSM_chunk **pp);
/* OBSOLETE: Will disappear from Varnish 4.x */
void VSM_itern(struct VSM_data *vd, struct VSM_chunk **pp);
/* OBSOLETE: Will disappear from Varnish 4.x */
#define VSM_FOREACH(var, vd) \ #define VSM_FOREACH(var, vd) \
for((var) = VSM_iter0((vd)); (var) != NULL; VSM_itern((vd), &(var))) for((var) = VSM_iter0((vd)); (var) != NULL; VSM_itern((vd), &(var)))
......
...@@ -79,7 +79,6 @@ VSC_Setup(struct VSM_data *vd) ...@@ -79,7 +79,6 @@ VSC_Setup(struct VSM_data *vd)
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AZ(vd->vsc); AZ(vd->vsc);
AZ(vd->vsl);
ALLOC_OBJ(vd->vsc, VSC_MAGIC); ALLOC_OBJ(vd->vsc, VSC_MAGIC);
AN(vd->vsc); AN(vd->vsc);
VTAILQ_INIT(&vd->vsc->sf_list); VTAILQ_INIT(&vd->vsc->sf_list);
...@@ -225,14 +224,14 @@ VSC_Open(struct VSM_data *vd, int diag) ...@@ -225,14 +224,14 @@ VSC_Open(struct VSM_data *vd, int diag)
struct VSC_C_main * struct VSC_C_main *
VSC_Main(struct VSM_data *vd) VSC_Main(struct VSM_data *vd)
{ {
struct VSM_chunk *sha; struct VSM_fantom vf;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
CHECK_OBJ_NOTNULL(vd->vsc, VSC_MAGIC); CHECK_OBJ_NOTNULL(vd->vsc, VSC_MAGIC);
sha = VSM_find_alloc(vd, VSC_CLASS, "", ""); if (!VSM_Get(vd, &vf, VSC_CLASS, "", ""))
assert(sha != NULL); return (NULL);
return (VSM_PTR(sha)); return ((void*)vf.b);
} }
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
...@@ -285,7 +284,7 @@ iter_call(const struct vsc *vsc, VSC_iter_f *func, void *priv, ...@@ -285,7 +284,7 @@ iter_call(const struct vsc *vsc, VSC_iter_f *func, void *priv,
#define VSC_DO(U,l,t) \ #define VSC_DO(U,l,t) \
static int \ static int \
iter_##l(const struct vsc *vsc, struct VSM_chunk *sha, \ iter_##l(const struct vsc *vsc, struct VSM_fantom *vf, \
VSC_iter_f *func, void *priv) \ VSC_iter_f *func, void *priv) \
{ \ { \
struct VSC_C_##l *st; \ struct VSC_C_##l *st; \
...@@ -293,10 +292,9 @@ iter_call(const struct vsc *vsc, VSC_iter_f *func, void *priv, ...@@ -293,10 +292,9 @@ iter_call(const struct vsc *vsc, VSC_iter_f *func, void *priv,
int i; \ int i; \
\ \
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC); \ CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC); \
CHECK_OBJ_NOTNULL(sha, VSM_CHUNK_MAGIC); \ st = vf->b; \
st = VSM_PTR(sha); \
sp.class = t; \ sp.class = t; \
sp.ident = sha->ident; sp.ident = vf->chunk->ident;
#define VSC_F(nn,tt,ll,ff,dd,ee) \ #define VSC_F(nn,tt,ll,ff,dd,ee) \
sp.name = #nn; \ sp.name = #nn; \
...@@ -321,24 +319,22 @@ int ...@@ -321,24 +319,22 @@ int
VSC_Iter(struct VSM_data *vd, VSC_iter_f *func, void *priv) VSC_Iter(struct VSM_data *vd, VSC_iter_f *func, void *priv)
{ {
struct vsc *vsc; struct vsc *vsc;
struct VSM_chunk *sha; struct VSM_fantom vf;
int i; int i;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
vsc = vd->vsc; vsc = vd->vsc;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC); CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
i = 0; i = 0;
VSM_FOREACH(sha, vd) { VSM_FOREACH_SAFE(&vf, vd) {
CHECK_OBJ_NOTNULL(sha, VSM_CHUNK_MAGIC); if (strcmp(vf.chunk->class, VSC_CLASS))
if (strcmp(sha->class, VSC_CLASS))
continue; continue;
/*lint -save -e525 -e539 */ /*lint -save -e525 -e539 */
#define VSC_F(n,t,l,f,d,e) #define VSC_F(n,t,l,f,d,e)
#define VSC_DONE(a,b,c) #define VSC_DONE(a,b,c)
#define VSC_DO(U,l,t) \ #define VSC_DO(U,l,t) \
if (!strcmp(sha->type, t)) { \ if (!strcmp(vf.chunk->type, t)) { \
i = iter_##l(vsc, sha, func, priv); \ i = iter_##l(vsc, &vf, func, priv); \
if (!i) \ if (!i) \
continue; \ continue; \
} }
......
...@@ -67,25 +67,14 @@ VSL_Setup(struct VSM_data *vd) ...@@ -67,25 +67,14 @@ VSL_Setup(struct VSM_data *vd)
struct vsl *vsl; struct vsl *vsl;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AZ(vd->vsc);
AZ(vd->vsl); AZ(vd->vsl);
ALLOC_OBJ(vsl, VSL_MAGIC); ALLOC_OBJ(vd->vsl, VSL_MAGIC);
AN(vsl); AN(vd->vsl);
vsl = vd->vsl;
vd->vsl = vsl;
vsl->regflags = 0; vsl->regflags = 0;
/* XXX: Allocate only if log access */
vsl->vbm_supress = vbit_init(256); vsl->vbm_supress = vbit_init(256);
vsl->vbm_select = vbit_init(256); vsl->vbm_select = vbit_init(256);
vsl->r_fd = -1; vsl->r_fd = -1;
/* XXX: Allocate only if -r option given ? */
vsl->rbuflen = 256; /* XXX ?? */
vsl->rbuf = malloc(vsl->rbuflen * 4L);
assert(vsl->rbuf != NULL);
vsl->num_matchers = 0; vsl->num_matchers = 0;
VTAILQ_INIT(&vsl->matchers); VTAILQ_INIT(&vsl->matchers);
} }
...@@ -343,28 +332,6 @@ VSL_H_Print(void *priv, enum VSL_tag_e tag, unsigned fd, unsigned len, ...@@ -343,28 +332,6 @@ VSL_H_Print(void *priv, enum VSL_tag_e tag, unsigned fd, unsigned len,
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
void
VSL_Open_CallBack(struct VSM_data *vd)
{
struct vsl *vsl;
struct VSM_chunk *sha;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
vsl = vd->vsl;
CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC);
sha = VSM_find_alloc(vd, VSL_CLASS, "", "");
assert(sha != NULL);
vsl->log_start = VSM_PTR(sha);
vsl->log_end = VSM_NEXT(sha);
vsl->log_ptr = vsl->log_start + 1;
vsl->last_seq = vsl->log_start[0];
VRMB();
}
/*--------------------------------------------------------------------*/
int int
VSL_Open(struct VSM_data *vd, int diag) VSL_Open(struct VSM_data *vd, int diag)
{ {
...@@ -379,11 +346,21 @@ VSL_Open(struct VSM_data *vd, int diag) ...@@ -379,11 +346,21 @@ VSL_Open(struct VSM_data *vd, int diag)
i = VSM_Open(vd, diag); i = VSM_Open(vd, diag);
if (i) if (i)
return (i); return (i);
} if (!VSM_Get(vd, &vsl->vf, VSL_CLASS, NULL, NULL)) {
VSM_Close(vd);
if (!vsl->d_opt && vsl->r_fd == -1) { if (diag)
while (*vsl->log_ptr != VSL_ENDMARKER) vd->diag(vd->priv,
vsl->log_ptr = VSL_NEXT(vsl->log_ptr); "No VSL chunk found "
" (child not started ?)\n");
return (1);
}
vsl->log_start = vsl->vf.b;
vsl->log_end = vsl->vf.e;
vsl->log_ptr = vsl->log_start + 1;
if (!vsl->d_opt) {
while (*vsl->log_ptr != VSL_ENDMARKER)
vsl->log_ptr = VSL_NEXT(vsl->log_ptr);
}
} }
return (0); return (0);
} }
......
...@@ -30,6 +30,10 @@ ...@@ -30,6 +30,10 @@
#include "vqueue.h" #include "vqueue.h"
#define SLEEP_USEC (50*1000)
#define TIMEOUT_USEC (5*1000*1000)
struct vsl_re_match { struct vsl_re_match {
unsigned magic; unsigned magic;
#define VSL_RE_MATCH_MAGIC 0x4013151e #define VSL_RE_MATCH_MAGIC 0x4013151e
...@@ -42,6 +46,8 @@ struct vsl { ...@@ -42,6 +46,8 @@ struct vsl {
unsigned magic; unsigned magic;
#define VSL_MAGIC 0x7a31db38 #define VSL_MAGIC 0x7a31db38
struct VSM_fantom vf;
/* Stuff relating the log records below here */ /* Stuff relating the log records below here */
volatile uint32_t *log_start; volatile uint32_t *log_start;
......
...@@ -141,7 +141,7 @@ VSM_Delete(struct VSM_data *vd) ...@@ -141,7 +141,7 @@ VSM_Delete(struct VSM_data *vd)
* *
* Return: * Return:
* 0 = sucess * 0 = sucess
* 1 = failure * <0 = failure
* *
*/ */
...@@ -150,9 +150,10 @@ vsm_open(struct VSM_data *vd, int diag) ...@@ -150,9 +150,10 @@ vsm_open(struct VSM_data *vd, int diag)
{ {
int i; int i;
struct VSM_head slh; struct VSM_head slh;
void *v;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AZ(vd->VSM_head); AZ(vd->head);
AN(vd->fname); AN(vd->fname);
vd->vsm_fd = open(vd->fname, O_RDONLY); vd->vsm_fd = open(vd->fname, O_RDONLY);
...@@ -160,7 +161,7 @@ vsm_open(struct VSM_data *vd, int diag) ...@@ -160,7 +161,7 @@ vsm_open(struct VSM_data *vd, int diag)
if (diag) if (diag)
vd->diag(vd->priv, "Cannot open %s: %s\n", vd->diag(vd->priv, "Cannot open %s: %s\n",
vd->fname, strerror(errno)); vd->fname, strerror(errno));
return (1); return (-1);
} }
AZ(fstat(vd->vsm_fd, &vd->fstat)); AZ(fstat(vd->vsm_fd, &vd->fstat));
...@@ -170,7 +171,7 @@ vsm_open(struct VSM_data *vd, int diag) ...@@ -170,7 +171,7 @@ vsm_open(struct VSM_data *vd, int diag)
vd->fname); vd->fname);
AZ(close(vd->vsm_fd)); AZ(close(vd->vsm_fd));
vd->vsm_fd = -1; vd->vsm_fd = -1;
return (1); return (-1);
} }
i = read(vd->vsm_fd, &slh, sizeof slh); i = read(vd->vsm_fd, &slh, sizeof slh);
...@@ -180,33 +181,33 @@ vsm_open(struct VSM_data *vd, int diag) ...@@ -180,33 +181,33 @@ vsm_open(struct VSM_data *vd, int diag)
vd->fname, strerror(errno)); vd->fname, strerror(errno));
AZ(close(vd->vsm_fd)); AZ(close(vd->vsm_fd));
vd->vsm_fd = -1; vd->vsm_fd = -1;
return (1); return (-1);
} }
if (slh.magic != VSM_HEAD_MAGIC || slh.alloc_seq == 0) {
if (memcmp(slh.marker, VSM_HEAD_MARKER, sizeof slh.marker) ||
slh.alloc_seq == 0) {
if (diag) if (diag)
vd->diag(vd->priv, "Not a ready VSM file %s\n", vd->diag(vd->priv, "Not a VSM file %s\n",
vd->fname); vd->fname);
AZ(close(vd->vsm_fd)); AZ(close(vd->vsm_fd));
vd->vsm_fd = -1; vd->vsm_fd = -1;
return (1); return (-1);
} }
vd->VSM_head = mmap(NULL, slh.shm_size, v = mmap(NULL, slh.shm_size,
PROT_READ, MAP_SHARED|MAP_HASSEMAPHORE, vd->vsm_fd, 0); PROT_READ, MAP_SHARED|MAP_HASSEMAPHORE, vd->vsm_fd, 0);
if (vd->VSM_head == MAP_FAILED) { if (v == MAP_FAILED) {
if (diag) if (diag)
vd->diag(vd->priv, "Cannot mmap %s: %s\n", vd->diag(vd->priv, "Cannot mmap %s: %s\n",
vd->fname, strerror(errno)); vd->fname, strerror(errno));
AZ(close(vd->vsm_fd)); AZ(close(vd->vsm_fd));
vd->vsm_fd = -1; vd->vsm_fd = -1;
vd->VSM_head = NULL; return (-1);
return (1);
} }
vd->vsm_end = (uint8_t *)vd->VSM_head + slh.shm_size; vd->head = v;
vd->my_alloc_seq = vd->VSM_head->alloc_seq; vd->b = v;
vd->e = vd->b + slh.shm_size;
if (vd->vsl != NULL)
VSL_Open_CallBack(vd);
return (0); return (0);
} }
...@@ -218,7 +219,7 @@ VSM_Open(struct VSM_data *vd, int diag) ...@@ -218,7 +219,7 @@ VSM_Open(struct VSM_data *vd, int diag)
{ {
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AZ(vd->VSM_head); AZ(vd->head);
if (!vd->n_opt) if (!vd->n_opt)
(void)VSM_n_Arg(vd, ""); (void)VSM_n_Arg(vd, "");
return (vsm_open(vd, diag)); return (vsm_open(vd, diag));
...@@ -231,11 +232,14 @@ VSM_Close(struct VSM_data *vd) ...@@ -231,11 +232,14 @@ VSM_Close(struct VSM_data *vd)
{ {
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
if (vd->VSM_head == NULL) if (vd->head == NULL)
return; return;
AZ(munmap((void*)vd->VSM_head, vd->VSM_head->shm_size));
vd->VSM_head = NULL;
assert(vd->vsm_fd >= 0); assert(vd->vsm_fd >= 0);
AZ(munmap((void*)vd->b, vd->e - vd->b));
vd->b = NULL;
vd->e = NULL;
vd->head = NULL;
AZ(close(vd->vsm_fd)); AZ(close(vd->vsm_fd));
vd->vsm_fd = -1; vd->vsm_fd = -1;
} }
...@@ -246,25 +250,28 @@ int ...@@ -246,25 +250,28 @@ int
VSM_ReOpen(struct VSM_data *vd, int diag) VSM_ReOpen(struct VSM_data *vd, int diag)
{ {
struct stat st; struct stat st;
int i;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AN(vd->VSM_head); AN(vd->head);
if (stat(vd->fname, &st))
return (0);
if (st.st_dev == vd->fstat.st_dev && st.st_ino == vd->fstat.st_ino) if (vd->head->alloc_seq &&
!stat(vd->fname, &st) &&
st.st_dev == vd->fstat.st_dev &&
st.st_ino == vd->fstat.st_ino)
return (0); return (0);
VSM_Close(vd); VSM_Close(vd);
for (i = 0; i < 5; i++) { /* XXX param */ return (vsm_open(vd, diag));
if (!vsm_open(vd, 0)) }
return (1);
} /*--------------------------------------------------------------------*/
if (vsm_open(vd, diag))
return (-1); unsigned
return (1); VSM_Seq(const struct VSM_data *vd)
{
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
return (vd->head->alloc_seq);
} }
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
...@@ -274,31 +281,87 @@ VSM_Head(const struct VSM_data *vd) ...@@ -274,31 +281,87 @@ VSM_Head(const struct VSM_data *vd)
{ {
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AN(vd->VSM_head); AN(vd->head);
return(vd->VSM_head); return(vd->head);
}
/*--------------------------------------------------------------------*/
void
VSM__iter0(struct VSM_data *vd, struct VSM_fantom *vf)
{
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
memset(vf, 0, sizeof *vf);
} }
int
VSM__itern(struct VSM_data *vd, struct VSM_fantom *vf)
{
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
if (vf->priv != 0) {
if (vf->priv != vd->head->alloc_seq)
return (0);
if (vf->chunk->len == 0)
return (0);
if (vf->chunk->next == 0)
return (0);
vf->chunk = (void*)(vd->b + vf->chunk->next);
} else if (vd->head->first == 0) {
return (0);
} else {
vf->chunk = (void*)(vd->b + vd->head->first);
}
if (memcmp(vf->chunk->marker, VSM_CHUNK_MARKER,
sizeof vf->chunk->marker))
return (0);
vf->priv = vd->head->alloc_seq;
vf->b = (void*)(vf->chunk + 1);
vf->e = (char*)vf->b + vf->chunk->len;
if (vf->b == vf->e)
return (0);
return (1);
}
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
struct VSM_chunk * int
VSM_find_alloc(struct VSM_data *vd, const char *class, const char *type, const char *ident) VSM_StillValid(struct VSM_data *vd, struct VSM_fantom *vf)
{
struct VSM_fantom f2;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
if (vf->priv == vd->head->alloc_seq)
return (1);
VSM_FOREACH_SAFE(&f2, vd) {
if (f2.chunk == vf->chunk &&
f2.b == vf->b &&
f2.e == vf->e) {
vf->priv = vd->head->alloc_seq;
return (2);
}
}
return (0);
}
int
VSM_Get(struct VSM_data *vd, struct VSM_fantom *vf, const char *class,
const char *type, const char *ident)
{ {
struct VSM_chunk *sha;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AN(vd->VSM_head); VSM_FOREACH_SAFE(vf, vd) {
VSM_FOREACH(sha, vd) { if (strcmp(vf->chunk->class, class))
CHECK_OBJ_NOTNULL(sha, VSM_CHUNK_MAGIC);
if (strcmp(sha->class, class))
continue; continue;
if (type != NULL && strcmp(sha->type, type)) if (type != NULL && strcmp(vf->chunk->type, type))
continue; continue;
if (ident != NULL && strcmp(sha->ident, ident)) if (ident != NULL && strcmp(vf->chunk->ident, ident))
continue; continue;
return (sha); return (1);
} }
return (NULL); memset(vf, 0, sizeof *vf);
return (0);
} }
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
...@@ -307,15 +370,16 @@ void * ...@@ -307,15 +370,16 @@ void *
VSM_Find_Chunk(struct VSM_data *vd, const char *class, const char *type, VSM_Find_Chunk(struct VSM_data *vd, const char *class, const char *type,
const char *ident, unsigned *lenp) const char *ident, unsigned *lenp)
{ {
struct VSM_chunk *sha; struct VSM_fantom vf;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); if (VSM_Get(vd, &vf, class, type, ident)) {
sha = VSM_find_alloc(vd, class, type, ident); if (lenp != NULL)
if (sha == NULL) *lenp = (char*)vf.e - (char*)vf.b;
return (NULL); return (vf.chunk);
}
if (lenp != NULL) if (lenp != NULL)
*lenp = sha->len - sizeof *sha; *lenp = 0;
return (VSM_PTR(sha)); return (NULL);
} }
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
...@@ -325,38 +389,19 @@ VSM_iter0(struct VSM_data *vd) ...@@ -325,38 +389,19 @@ VSM_iter0(struct VSM_data *vd)
{ {
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
vd->my_alloc_seq = vd->VSM_head->alloc_seq; VSM__iter0(vd, &vd->compat_vf);
while (vd->my_alloc_seq == 0) { if (VSM__itern(vd, &vd->compat_vf))
(void)usleep(50000); return(vd->compat_vf.chunk);
vd->my_alloc_seq = vd->VSM_head->alloc_seq; return (NULL);
}
CHECK_OBJ_NOTNULL(&vd->VSM_head->head, VSM_CHUNK_MAGIC);
return (&vd->VSM_head->head);
} }
void void
VSM_itern(const struct VSM_data *vd, struct VSM_chunk **pp) VSM_itern(struct VSM_data *vd, struct VSM_chunk **pp)
{ {
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC); CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
if (vd->my_alloc_seq != vd->VSM_head->alloc_seq) { if (VSM__itern(vd, &vd->compat_vf))
*pp = NULL; *pp = vd->compat_vf.chunk;
return; else
}
CHECK_OBJ_NOTNULL(*pp, VSM_CHUNK_MAGIC);
*pp = VSM_NEXT(*pp);
if ((void*)(*pp) >= vd->vsm_end) {
*pp = NULL; *pp = NULL;
return;
}
CHECK_OBJ_NOTNULL(*pp, VSM_CHUNK_MAGIC);
}
/*--------------------------------------------------------------------*/
unsigned
VSM_Seq(const struct VSM_data *vd)
{
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
return (vd->VSM_head->alloc_seq);
} }
...@@ -28,10 +28,6 @@ ...@@ -28,10 +28,6 @@
* *
*/ */
/* Parameters */
#define SLEEP_USEC (50*1000)
#define TIMEOUT_USEC (5*1000*1000)
struct vsc; struct vsc;
struct VSM_data { struct VSM_data {
...@@ -47,9 +43,12 @@ struct VSM_data { ...@@ -47,9 +43,12 @@ struct VSM_data {
struct stat fstat; struct stat fstat;
int vsm_fd; int vsm_fd;
struct VSM_head *VSM_head; struct VSM_head *head;
void *vsm_end; char *b;
unsigned my_alloc_seq; char *e;
/* Stuff for backwards compat */
struct VSM_fantom compat_vf;
/* Stuff relating the stats fields start here */ /* Stuff relating the stats fields start here */
...@@ -62,4 +61,3 @@ struct VSM_chunk *VSM_find_alloc(struct VSM_data *vd, const char *class, ...@@ -62,4 +61,3 @@ struct VSM_chunk *VSM_find_alloc(struct VSM_data *vd, const char *class,
void VSC_Delete(struct VSM_data *vd); void VSC_Delete(struct VSM_data *vd);
void VSL_Delete(struct VSM_data *vd); void VSL_Delete(struct VSM_data *vd);
void VSL_Open_CallBack(struct VSM_data *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