4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $NetBSD: callout.h,v 1.22 2005/12/11 12:25:20 christos Exp $ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*-
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This code is derived from software contributed to The NetBSD Foundation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * NASA Ames Research Center.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are met:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 1. Redistributions of source code must retain the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 2. Redistributions in binary form must reproduce the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * documentation and/or other materials provided with the distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 3. All advertising materials mentioning features or use of this software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * must display the following acknowledgement:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This product includes software developed by the NetBSD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, Inc. and its contributors.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 4. Neither the name of The NetBSD Foundation nor the names of its
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * contributors may be used to endorse or promote products derived
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * from this software without specific prior written permission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * POSSIBILITY OF SUCH DAMAGE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (c) 2000-2001 Artur Grabowski <art@openbsd.org>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are met:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 1. Redistributions of source code must retain the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 2. Redistributions in binary form must reproduce the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * documentation and/or other materials provided with the distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 3. The name of the author may not be used to endorse or promote products
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * derived from this software without specific prior written permission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef _SYS_CALLOUT_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _SYS_CALLOUT_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The following funkyness is to appease gcc3's strict aliasing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct callout;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct callout_circq {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* next element */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync union {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct callout *elem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct callout_circq *list;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } cq_next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* previous element */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync union {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct callout *elem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct callout_circq *list;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } cq_prev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define cq_next_e cq_next.elem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define cq_prev_e cq_prev.elem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define cq_next_l cq_next.list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define cq_prev_l cq_prev.list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct callout {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct callout_circq c_list; /* linkage on queue */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void (*c_func)(void *); /* function to call */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *c_arg; /* function argument */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int c_time; /* when callout fires */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int c_flags; /* state of this entry */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CALLOUT_PENDING 0x0002 /* callout is on the queue */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CALLOUT_FIRED 0x0004 /* callout has fired */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CALLOUT_INVOKING 0x0008 /* callout function is being invoked */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CALLOUT_INITIALIZER_SETFUNC(func, arg) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { {{NULL}, {NULL}}, func, arg, 0, 0 }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CALLOUT_INITIALIZER CALLOUT_INITIALIZER_SETFUNC(NULL, NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef _KERNEL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid callout_startup(void);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid callout_init(struct callout *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid callout_setfunc(struct callout *, void (*)(void *), void *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid callout_reset(struct callout *, int, void (*)(void *), void *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid callout_schedule(struct callout *, int);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid callout_stop(struct callout *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint callout_hardclock(void);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define callout_setfunc(c, f, a) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdo { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (c)->c_func = (f); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (c)->c_arg = (a); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} while (/*CONSTCOND*/0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define callout_pending(c) ((c)->c_flags & CALLOUT_PENDING)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define callout_expired(c) ((c)->c_flags & CALLOUT_FIRED)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define callout_active(c) ((c)->c_flags & (CALLOUT_PENDING|CALLOUT_FIRED))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define callout_invoking(c) ((c)->c_flags & CALLOUT_INVOKING)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define callout_ack(c) ((c)->c_flags &= ~CALLOUT_INVOKING)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* _KERNEL */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* !_SYS_CALLOUT_H_ */