Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / callout.h @ 13

History | View | Annotate | Download (4.24 KB)

1 13 up20180614
/*        $NetBSD: callout.h,v 1.32 2015/02/07 19:36:42 christos Exp $        */
2
3
/*-
4
 * Copyright (c) 2000, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc.
5
 * All rights reserved.
6
 *
7
 * This code is derived from software contributed to The NetBSD Foundation
8
 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9
 * NASA Ames Research Center, and by Andrew Doran.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
14
 * 1. Redistributions of source code must retain the above copyright
15
 *    notice, this list of conditions and the following disclaimer.
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in the
18
 *    documentation and/or other materials provided with the distribution.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
 * POSSIBILITY OF SUCH DAMAGE.
31
 */
32
33
#ifndef _SYS_CALLOUT_H_
34
#define _SYS_CALLOUT_H_
35
36
#include <sys/types.h>
37
38
/*
39
 * The callout implementation is private to kern_timeout.c yet uses
40
 * caller-supplied storage, as lightweight callout operations are
41
 * critical to system performance.
42
 *
43
 * The size of callout_t must remain constant in order to ensure ABI
44
 * compatibility for kernel modules: it may become smaller, but must
45
 * not grow.  If more space is required, rearrange the members of
46
 * callout_impl_t.
47
 */
48
typedef struct callout {
49
        void        *_c_store[10];
50
} callout_t;
51
52
/* Internal flags. */
53
#define        CALLOUT_BOUND                0x0001        /* bound to a specific CPU */
54
#define        CALLOUT_PENDING                0x0002        /* callout is on the queue */
55
#define        CALLOUT_FIRED                0x0004        /* callout has fired */
56
#define        CALLOUT_INVOKING        0x0008        /* callout function is being invoked */
57
58
/* End-user flags. */
59
#define        CALLOUT_MPSAFE                0x0100        /* does not need kernel_lock */
60
#define        CALLOUT_FLAGMASK        0xff00
61
62
#define CALLOUT_FMT        "\177\020\
63
b\00BOUND\0\
64
b\01PENDING\0\
65
b\02FIRED\0\
66
b\03INVOKING\0\
67
b\10MPSAFE\0"
68
69
#ifdef _CALLOUT_PRIVATE
70
71
/* The following funkyness is to appease gcc3's strict aliasing. */
72
struct callout_circq {
73
        /* next element */
74
        union {
75
                struct callout_impl        *elem;
76
                struct callout_circq        *list;
77
        } cq_next;
78
        /* previous element */
79
        union {
80
                struct callout_impl        *elem;
81
                struct callout_circq        *list;
82
        } cq_prev;
83
};
84
#define        cq_next_e        cq_next.elem
85
#define        cq_prev_e        cq_prev.elem
86
#define        cq_next_l        cq_next.list
87
#define        cq_prev_l        cq_prev.list
88
89
struct callout_cpu;
90
91
typedef struct callout_impl {
92
        struct callout_circq c_list;                /* linkage on queue */
93
        void        (*c_func)(void *);                /* function to call */
94
        void        *c_arg;                                /* function argument */
95
        struct callout_cpu * volatile c_cpu;        /* associated CPU */
96
        int        c_time;                                /* when callout fires */
97
        u_int        c_flags;                        /* state of this entry */
98
        u_int        c_magic;                        /* magic number */
99
} callout_impl_t;
100
#define        CALLOUT_MAGIC                0x11deeba1
101
102
#endif        /* _CALLOUT_PRIVATE */
103
104
#ifdef _KERNEL
105
struct cpu_info;
106
107
void        callout_startup(void);
108
void        callout_init_cpu(struct cpu_info *);
109
void        callout_hardclock(void);
110
111
void        callout_init(callout_t *, u_int);
112
void        callout_destroy(callout_t *);
113
void        callout_setfunc(callout_t *, void (*)(void *), void *);
114
void        callout_reset(callout_t *, int, void (*)(void *), void *);
115
void        callout_schedule(callout_t *, int);
116
bool        callout_stop(callout_t *);
117
bool        callout_halt(callout_t *, void *);
118
bool        callout_pending(callout_t *);
119
bool        callout_expired(callout_t *);
120
bool        callout_active(callout_t *);
121
bool        callout_invoking(callout_t *);
122
void        callout_ack(callout_t *);
123
void        callout_bind(callout_t *, struct cpu_info *);
124
#endif        /* _KERNEL */
125
126
#endif /* !_SYS_CALLOUT_H_ */