root / lab4 / .minix-src / include / sys / callout.h @ 13
History | View | Annotate | Download (4.24 KB)
1 |
/* $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_ */ |