varnish-cache/bin/varnishd/waiter/waiter_priv.h
1
/*-
2
 * Copyright (c) 2006 Verdens Gang AS
3
 * Copyright (c) 2006-2011 Varnish Software AS
4
 * All rights reserved.
5
 *
6
 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
 * SUCH DAMAGE.
28
 *
29
 * Private interfaces
30
 */
31
32
struct waited;
33
struct binheap;
34
35
struct waiter {
36
        unsigned                        magic;
37
#define WAITER_MAGIC                    0x17c399db
38
        const struct waiter_impl        *impl;
39
        VTAILQ_ENTRY(waiter)            list;
40
        VTAILQ_HEAD(,waited)            waithead;
41
42
        void                            *priv;
43
        struct binheap                  *heap;
44
};
45
46
typedef void waiter_init_f(struct waiter *);
47
typedef void waiter_fini_f(struct waiter *);
48
typedef int waiter_enter_f(void *priv, struct waited *);
49
typedef void waiter_inject_f(const struct waiter *, struct waited *);
50
typedef void waiter_evict_f(const struct waiter *, struct waited *);
51
52
struct waiter_impl {
53
        const char                      *name;
54
        waiter_init_f                   *init;
55
        waiter_fini_f                   *fini;
56
        waiter_enter_f                  *enter;
57
        waiter_inject_f                 *inject;
58
        size_t                          size;
59
};
60
61
static inline double
62
Wait_Tmo(const struct waited *wp)
63
{
64
        CHECK_OBJ_ORNULL(wp, WAITED_MAGIC);
65
        AN(wp->tmo);
66
        return (*wp->tmo);
67
}
68
69
static inline double
70 2132
Wait_When(const struct waited *wp)
71
{
72 2132
        CHECK_OBJ_ORNULL(wp, WAITED_MAGIC);
73 2132
        AN(wp->tmo);
74 2132
        return (wp->idle + *wp->tmo);
75
}
76
77
void Wait_Call(const struct waiter *, struct waited *,
78
    enum wait_event ev, double now);
79
void Wait_HeapInsert(const struct waiter *, struct waited *);
80
int Wait_HeapDelete(const struct waiter *, const struct waited *);
81
double Wait_HeapDue(const struct waiter *, struct waited **);