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

Firmly split manager and child views of hashing.

parent a37d3cc1
......@@ -54,6 +54,7 @@ varnishd_SOURCES = \
cache_ws.c \
hash/hash_classic.c \
hash/hash_critbit.c \
hash/hash_mgt.c \
hash/hash_simple_list.c \
mgt/mgt_child.c \
mgt/mgt_cli.c \
......
......@@ -59,7 +59,6 @@
#include "cache.h"
#include "hash/hash_slinger.h"
#include "vav.h"
#include "vsha256.h"
static const struct hash_slinger *hash;
......@@ -743,53 +742,11 @@ HSH_Deref(struct worker *w, struct objcore *oc, struct object **oo)
}
void
HSH_Init(void)
HSH_Init(const struct hash_slinger *slinger)
{
assert(DIGEST_LEN == SHA256_LEN); /* avoid #include pollution */
hash = heritage.hash;
hash = slinger;
if (hash->start != NULL)
hash->start();
}
static const struct choice hsh_choice[] = {
{ "classic", &hcl_slinger },
{ "simple", &hsl_slinger },
{ "simple_list", &hsl_slinger }, /* backwards compat */
{ "critbit", &hcb_slinger },
{ NULL, NULL }
};
/*--------------------------------------------------------------------*/
void
HSH_config(const char *h_arg)
{
char **av;
int ac;
const struct hash_slinger *hp;
ASSERT_MGT();
av = VAV_Parse(h_arg, NULL, ARGV_COMMA);
AN(av);
if (av[0] != NULL)
ARGV_ERR("%s\n", av[0]);
if (av[1] == NULL)
ARGV_ERR("-h argument is empty\n");
for (ac = 0; av[ac + 2] != NULL; ac++)
continue;
hp = pick(hsh_choice, av[1], "hash");
CHECK_OBJ_NOTNULL(hp, SLINGER_MAGIC);
VSB_printf(vident, ",-h%s", av[1]);
heritage.hash = hp;
if (hp->init != NULL)
hp->init(ac, av + 2);
else if (ac > 0)
ARGV_ERR("Hash method \"%s\" takes no arguments\n",
hp->name);
}
......@@ -120,7 +120,7 @@ child_main(void)
Pool_Init();
EXP_Init();
HSH_Init();
HSH_Init(heritage.hash);
BAN_Init();
VCA_Init();
......
/*-
* Copyright (c) 2006 Verdens Gang AS
* Copyright (c) 2006-2011 Varnish Software AS
* All rights reserved.
*
* Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#include "config.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "mgt/mgt.h"
#include "heritage.h"
#include "hash/hash_slinger.h"
#include "vav.h"
static const struct choice hsh_choice[] = {
{ "classic", &hcl_slinger },
{ "simple", &hsl_slinger },
{ "simple_list", &hsl_slinger }, /* backwards compat */
{ "critbit", &hcb_slinger },
{ NULL, NULL }
};
/*--------------------------------------------------------------------*/
void
HSH_config(const char *h_arg)
{
char **av;
int ac;
const struct hash_slinger *hp;
ASSERT_MGT();
av = VAV_Parse(h_arg, NULL, ARGV_COMMA);
AN(av);
if (av[0] != NULL)
ARGV_ERR("%s\n", av[0]);
if (av[1] == NULL)
ARGV_ERR("-h argument is empty\n");
for (ac = 0; av[ac + 2] != NULL; ac++)
continue;
hp = pick(hsh_choice, av[1], "hash");
CHECK_OBJ_NOTNULL(hp, SLINGER_MAGIC);
VSB_printf(vident, ",-h%s", av[1]);
heritage.hash = hp;
if (hp->init != NULL)
hp->init(ac, av + 2);
else if (ac > 0)
ARGV_ERR("Hash method \"%s\" takes no arguments\n",
hp->name);
}
......@@ -57,7 +57,7 @@ struct objcore *HSH_Lookup(struct sess *sp, struct objhead **poh);
void HSH_Unbusy(const struct sess *sp);
void HSH_Ref(struct objcore *o);
void HSH_Drop(struct sess *sp);
void HSH_Init(void);
void HSH_Init(const struct hash_slinger *slinger);
void HSH_AddString(const struct sess *sp, const char *str);
struct objcore *HSH_Insert(const struct sess *sp);
void HSH_Purge(const struct sess *, struct objhead *, double ttl, double grace);
......
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