12aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* $NetBSD: callout.h,v 1.22 2005/12/11 12:25:20 christos Exp $ */ 22aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 32aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/*- 42aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc. 52aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * All rights reserved. 62aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 72aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * This code is derived from software contributed to The NetBSD Foundation 82aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 92aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * NASA Ames Research Center. 102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * Redistribution and use in source and binary forms, with or without 122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * modification, are permitted provided that the following conditions 132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * are met: 142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 1. Redistributions of source code must retain the above copyright 152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * notice, this list of conditions and the following disclaimer. 162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 2. Redistributions in binary form must reproduce the above copyright 172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * notice, this list of conditions and the following disclaimer in the 182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * documentation and/or other materials provided with the distribution. 192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 3. All advertising materials mentioning features or use of this software 202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * must display the following acknowledgement: 212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * This product includes software developed by the NetBSD 222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * Foundation, Inc. and its contributors. 232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 4. Neither the name of The NetBSD Foundation nor the names of its 242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * contributors may be used to endorse or promote products derived 252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * from this software without specific prior written permission. 262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * POSSIBILITY OF SUCH DAMAGE. 382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* 412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * Copyright (c) 2000-2001 Artur Grabowski <art@openbsd.org> 422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * All rights reserved. 432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * Redistribution and use in source and binary forms, with or without 452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * modification, are permitted provided that the following conditions 462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * are met: 472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 1. Redistributions of source code must retain the above copyright 492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * notice, this list of conditions and the following disclaimer. 502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 2. Redistributions in binary form must reproduce the above copyright 512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * notice, this list of conditions and the following disclaimer in the 522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * documentation and/or other materials provided with the distribution. 532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 3. The name of the author may not be used to endorse or promote products 542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * derived from this software without specific prior written permission. 552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * 562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef _SYS_CALLOUT_H_ 692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define _SYS_CALLOUT_H_ 702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* 722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm * The following funkyness is to appease gcc3's strict aliasing. 732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmstruct callout; 752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmstruct callout_circq { 762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* next element */ 772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm union { 782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm struct callout *elem; 792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm struct callout_circq *list; 802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } cq_next; 812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* previous element */ 822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm union { 832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm struct callout *elem; 842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm struct callout_circq *list; 852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } cq_prev; 862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}; 872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define cq_next_e cq_next.elem 882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define cq_prev_e cq_prev.elem 892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define cq_next_l cq_next.list 902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define cq_prev_l cq_prev.list 912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmstruct callout { 932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm struct callout_circq c_list; /* linkage on queue */ 942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm void (*c_func)(void *); /* function to call */ 952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm void *c_arg; /* function argument */ 962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int c_time; /* when callout fires */ 972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int c_flags; /* state of this entry */ 982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm}; 992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CALLOUT_PENDING 0x0002 /* callout is on the queue */ 1012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CALLOUT_FIRED 0x0004 /* callout has fired */ 1022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CALLOUT_INVOKING 0x0008 /* callout function is being invoked */ 1032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CALLOUT_INITIALIZER_SETFUNC(func, arg) \ 1052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { {{NULL}, {NULL}}, func, arg, 0, 0 } 1062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CALLOUT_INITIALIZER CALLOUT_INITIALIZER_SETFUNC(NULL, NULL) 1082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef _KERNEL 1102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmvoid callout_startup(void); 1112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmvoid callout_init(struct callout *); 1122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmvoid callout_setfunc(struct callout *, void (*)(void *), void *); 1132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmvoid callout_reset(struct callout *, int, void (*)(void *), void *); 1142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmvoid callout_schedule(struct callout *, int); 1152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmvoid callout_stop(struct callout *); 1162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint callout_hardclock(void); 1172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define callout_setfunc(c, f, a) \ 1192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmdo { \ 1202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (c)->c_func = (f); \ 1212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (c)->c_arg = (a); \ 1222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} while (/*CONSTCOND*/0) 1232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define callout_pending(c) ((c)->c_flags & CALLOUT_PENDING) 1252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define callout_expired(c) ((c)->c_flags & CALLOUT_FIRED) 1262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define callout_active(c) ((c)->c_flags & (CALLOUT_PENDING|CALLOUT_FIRED)) 1272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define callout_invoking(c) ((c)->c_flags & CALLOUT_INVOKING) 1282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define callout_ack(c) ((c)->c_flags &= ~CALLOUT_INVOKING) 1292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* _KERNEL */ 1302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* !_SYS_CALLOUT_H_ */ 132