source: bin/varnishd/cache_hash.c @ 7899ba

Revision 7899ba, 1.7 KB checked in by Poul-Henning Kamp <phk@…>, 8 years ago (diff)

Move a bit more responsibility into the hash-slinger to get a cleaner
interface.

git-svn-id:  http://www.varnish-cache.org/svn/trunk@234 d4fa192b-c00b-0410-8231-f00ffab90ce4

  • Property mode set to 100644
Line 
1/*
2 * $Id$
3 */
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <assert.h>
8#include <string.h>
9#include <sys/types.h>
10#include <fcntl.h>
11#include <event.h>
12#include <pthread.h>
13
14#include "libvarnish.h"
15#include "cache.h"
16
17static struct hash_slinger      *hash;
18
19
20struct object *
21HSH_Lookup(struct worker *w, struct http *h)
22{
23        struct objhead *oh;
24        struct object *o;
25        char *b;
26
27        assert(hash != NULL);
28        /* Make sure we have both a new objhead and object if we need them */
29        if (w->nobjhead == NULL) {
30                w->nobjhead = calloc(sizeof *w->nobjhead, 1);
31                assert(w->nobjhead != NULL);
32                TAILQ_INIT(&w->nobjhead->objects);
33        }
34        if (w->nobj == NULL) {
35                w->nobj = calloc(sizeof *w->nobj, 1);
36                assert(w->nobj != NULL);
37                w->nobj->busy = 1;
38                TAILQ_INIT(&w->nobj->store);
39                pthread_cond_init(&w->nobj->cv, NULL);
40        }
41
42        assert(http_GetURL(h, &b));
43        oh = hash->lookup(b, w->nobjhead);
44        if (oh == w->nobjhead)
45                w->nobjhead = NULL;
46        AZ(pthread_mutex_lock(&oh->mtx));
47        TAILQ_FOREACH(o, &oh->objects, list) {
48                o->refcnt++;
49                if (o->busy)
50                        AZ(pthread_cond_wait(&o->cv, &oh->mtx));
51                /* XXX: do Vary: comparison */
52                if (1)
53                        break;
54                o->refcnt--;
55        }
56        if (o == NULL) {
57                o = w->nobj;
58                w->nobj = NULL;
59                TAILQ_INSERT_TAIL(&oh->objects, o, list);
60        }
61        AZ(pthread_mutex_unlock(&oh->mtx));
62        return (o);
63}
64
65void
66HSH_Unbusy(struct object *o)
67{
68
69        AZ(pthread_mutex_lock(&o->objhead->mtx));
70        o->busy = 0;
71        AZ(pthread_mutex_unlock(&o->objhead->mtx));
72        AZ(pthread_cond_broadcast(&o->cv));
73}
74
75void
76HSH_Unref(struct object *o)
77{
78
79        AZ(pthread_mutex_lock(&o->objhead->mtx));
80        o->refcnt--;
81        AZ(pthread_mutex_unlock(&o->objhead->mtx));
82}
83
84void
85HSH_Init(void)
86{
87
88        hash = &hsl_slinger;
89        if (hash->init != NULL)
90                hash->init();
91}
Note: See TracBrowser for help on using the repository browser.