timers.h revision 151576
1139825Simp/*-
2151576Sdavidxu * Copyright (c) 2005 David Xu <davidxu@freebsd.org>
313549Sjulian * Copyright (c) 1994 by Chris Provenzano, proven@mit.edu
413549Sjulian * All rights reserved.
513549Sjulian *
613549Sjulian * Redistribution and use in source and binary forms, with or without
713549Sjulian * modification, are permitted provided that the following conditions
813549Sjulian * are met:
913549Sjulian * 1. Redistributions of source code must retain the above copyright
1013549Sjulian *    notice, this list of conditions and the following disclaimer.
1113549Sjulian * 2. Redistributions in binary form must reproduce the above copyright
1213549Sjulian *    notice, this list of conditions and the following disclaimer in the
1313549Sjulian *    documentation and/or other materials provided with the distribution.
1413549Sjulian * 3. All advertising materials mentioning features or use of this software
1513549Sjulian *    must display the following acknowledgement:
1613549Sjulian *  This product includes software developed by Chris Provenzano.
1713549Sjulian * 4. The name of Chris Provenzano may not be used to endorse or promote
1813549Sjulian *    products derived from this software without specific prior written
1913549Sjulian *    permission.
2013549Sjulian *
2113549Sjulian * THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
2213549Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2313549Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2413549Sjulian * ARE DISCLAIMED.  IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
2513549Sjulian * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2613549Sjulian * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2713549Sjulian * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2813549Sjulian * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2913549Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3013549Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3113549Sjulian * SUCH DAMAGE.
3213549Sjulian *
3350477Speter * $FreeBSD: head/sys/sys/timers.h 151576 2005-10-23 04:22:56Z davidxu $
3413549Sjulian *
3513549Sjulian * Description : Basic timers header.
3613549Sjulian */
3713549Sjulian
3813549Sjulian#ifndef _SYS_TIMERS_H_
3913549Sjulian#define _SYS_TIMERS_H_
4013549Sjulian
41151576Sdavidxu/*
42151576Sdavidxu * Structures used to manage POSIX timers in a process.
43151576Sdavidxu */
44151576Sdavidxustruct itimer {
45151576Sdavidxu	struct mtx  		it_mtx;
46151576Sdavidxu	struct sigevent		it_sigev;
47151576Sdavidxu	struct itimerval	it_time;
48151576Sdavidxu	struct proc 		*it_proc;
49151576Sdavidxu	int	it_flags;
50151576Sdavidxu	int	it_usecount;
51151576Sdavidxu	int	it_overrun;		/* Overruns currently accumulating */
52151576Sdavidxu	int	it_overrun_last;	/* Overruns associated w/ a delivery */
53151576Sdavidxu	int	it_clockid;
54151576Sdavidxu	int	it_timerid;
55151576Sdavidxu	ksiginfo_t	it_ksi;
56151576Sdavidxu	union {
57151576Sdavidxu		/* realtime */
58151576Sdavidxu		struct {
59151576Sdavidxu			struct callout it_callout;
60151576Sdavidxu		} _rt;
6113549Sjulian
62151576Sdavidxu		/* cpu timer */
63151576Sdavidxu		struct {
64151576Sdavidxu			LIST_ENTRY(itimer)	it_link;
65151576Sdavidxu			TAILQ_ENTRY(itimer)	it_worklink;
66151576Sdavidxu			int			it_active;
67151576Sdavidxu			int			it_cflags;
68151576Sdavidxu		} _cpu;
69151576Sdavidxu	} _data;
70151576Sdavidxu};
71151576Sdavidxu
72151576Sdavidxu#define it_callout	_data._rt.it_callout
73151576Sdavidxu#define it_link		_data._cpu.it_link
74151576Sdavidxu#define it_active	_data._cpu.it_active
75151576Sdavidxu#define	it_worklink	_data._cpu.it_worklink
76151576Sdavidxu#define	it_cflags	_data._cpu.it_cflags
77151576Sdavidxu
78151576Sdavidxu#define	ITF_DELETING	0x01
79151576Sdavidxu#define	ITF_WANTED	0x02
80151576Sdavidxu
81151576Sdavidxu#define	ITCF_ONWORKLIST	0x01
82151576Sdavidxu
83151576Sdavidxu#define	TIMER_MAX	32
84151576Sdavidxu
85151576Sdavidxu#define	ITIMER_LOCK(it)		mtx_lock(&(it)->it_mtx)
86151576Sdavidxu#define	ITIMER_UNLOCK(it)	mtx_unlock(&(it)->it_mtx)
87151576Sdavidxu
88151576SdavidxuLIST_HEAD(itimerlist, itimer);
89151576Sdavidxu
90151576Sdavidxustruct	itimers {
91151576Sdavidxu	struct itimerlist	its_virtual;
92151576Sdavidxu	struct itimerlist	its_prof;
93151576Sdavidxu	TAILQ_HEAD(, itimer)	its_worklist;
94151576Sdavidxu	struct itimer		**its_timers;
95151576Sdavidxu};
96151576Sdavidxu
97151576Sdavidxustruct	kclock {
98151576Sdavidxu	int (*timer_create)(struct itimer *timer);
99151576Sdavidxu	int (*timer_settime)(struct itimer * timer, int flags,
100151576Sdavidxu		struct itimerspec * new_value,
101151576Sdavidxu		struct itimerspec * old_value);
102151576Sdavidxu	int (*timer_delete)(struct itimer * timer);
103151576Sdavidxu	int (*timer_gettime)(struct itimer * timer,
104151576Sdavidxu		struct itimerspec * cur_value);
105151576Sdavidxu	void (*event_hook)(struct proc *p, clockid_t clock_id, int event);
106151576Sdavidxu};
107151576Sdavidxu
108151576Sdavidxu/* Event values for event_hook() */
109151576Sdavidxu#define	ITIMER_EV_EXEC	0
110151576Sdavidxu#define	ITIMER_EV_EXIT	1
111151576Sdavidxu
112151576Sdavidxuvoid	itimers_init(struct itimers *its);
113151576Sdavidxuvoid	itimers_event_hook(struct proc *p, int event);
114151576Sdavidxu
115151576Sdavidxu#endif /* !_SYS_TIMERS_H_ */
116