source: bin/varnishd/cache_hash.c @ 656105

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

Add more stats

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