source: bin/varnishd/cache_hash.c @ 83286c

Revision 83286c, 2.8 KB checked in by Poul-Henning Kamp <phk@…>, 8 years ago (diff)

Sanitize #includes a bit in the cache process by moving fundamental
#includes to cache.h

git-svn-id:  http://www.varnish-cache.org/svn/trunk@382 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 <string.h>
8#include <sys/types.h>
9#include <fcntl.h>
10
11#include "libvarnish.h"
12#include "shmlog.h"
13#include "heritage.h"
14#include "cache.h"
15
16static struct hash_slinger      *hash;
17
18struct object *
19HSH_Lookup(struct worker *w, struct http *h)
20{
21        struct objhead *oh;
22        struct object *o;
23        char *b;
24
25        assert(hash != NULL);
26        /* Precreate an objhead and object in case we need them */
27        if (w->nobjhead == NULL) {
28                w->nobjhead = calloc(sizeof *w->nobjhead, 1);
29                assert(w->nobjhead != NULL);
30                TAILQ_INIT(&w->nobjhead->objects);
31                AZ(pthread_mutex_init(&w->nobjhead->mtx, NULL));
32                VSL_stats->n_objecthead++;
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                AZ(pthread_cond_init(&w->nobj->cv, NULL));
40                VSL_stats->n_object++;
41        }
42
43        assert(http_GetURL(h, &b));
44        oh = hash->lookup(b, w->nobjhead);
45        if (oh == w->nobjhead)
46                w->nobjhead = NULL;
47        AZ(pthread_mutex_lock(&oh->mtx));
48        TAILQ_FOREACH(o, &oh->objects, list) {
49                o->refcnt++;
50                if (o->busy)
51                        AZ(pthread_cond_wait(&o->cv, &oh->mtx));
52                /* XXX: check TTL */
53                if (o->ttl == 0) {
54                        /* Object banned but not reaped yet */
55                } else if (BAN_CheckObject(o, b)) {
56                        o->ttl = 0;
57                        VSL(SLT_ExpBan, 0, "%u was banned", o->xid);
58                        EXP_TTLchange(o);
59                } else 
60                        break;
61                o->refcnt--;
62        }
63        if (o != NULL) {
64                AZ(pthread_mutex_unlock(&oh->mtx));
65                hash->deref(oh);
66                return (o);
67        }
68
69        /* Insert (precreated) object in objecthead */
70        o = w->nobj;
71        w->nobj = NULL;
72        o->refcnt = 1;
73        o->objhead = oh;
74        TAILQ_INSERT_TAIL(&oh->objects, o, list);
75        /* NB: do not deref objhead the new object inherits our reference */
76        AZ(pthread_mutex_unlock(&oh->mtx));
77        BAN_NewObj(o);
78        return (o);
79}
80
81void
82HSH_Unbusy(struct object *o)
83{
84
85        AZ(pthread_mutex_lock(&o->objhead->mtx));
86        o->busy = 0;
87        AZ(pthread_mutex_unlock(&o->objhead->mtx));
88        AZ(pthread_cond_broadcast(&o->cv));
89}
90
91void
92HSH_Deref(struct object *o)
93{
94        struct objhead *oh;
95        struct storage *st, *stn;
96
97        oh = o->objhead;
98
99        /* drop ref on object */
100        AZ(pthread_mutex_lock(&oh->mtx));
101        if (--o->refcnt == 0)
102                TAILQ_REMOVE(&oh->objects, o, list);
103        else 
104                o = NULL;
105        AZ(pthread_mutex_unlock(&oh->mtx));
106
107        /* If still referenced, done */
108        if (o == NULL)
109                return;
110
111        if (o->header != NULL) {
112                free(o->header);
113                VSL_stats->n_header--;
114        }
115        AZ(pthread_cond_destroy(&o->cv));
116
117        TAILQ_FOREACH_SAFE(st, &o->store, list, stn) {
118                TAILQ_REMOVE(&o->store, st, list);
119                st->stevedore->free(st);
120        }
121        free(o);
122        VSL_stats->n_object--;
123
124        /* Drop our ref on the objhead */
125        if (hash->deref(oh))
126                return;
127        assert(TAILQ_EMPTY(&oh->objects));
128        AZ(pthread_mutex_destroy(&oh->mtx));
129        VSL_stats->n_objecthead--;
130        free(oh);
131}
132
133void
134HSH_Init(void)
135{
136
137        hash = heritage.hash;
138        if (hash->start != NULL)
139                hash->start();
140}
Note: See TracBrowser for help on using the repository browser.