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$
3413549Sjulian *
3513549Sjulian * Description : Basic timers header.
3613549Sjulian */
3713549Sjulian
3813549Sjulian#ifndef _SYS_TIMERS_H_
3913549Sjulian#define _SYS_TIMERS_H_
4013549Sjulian
41151581Sdavidxu#include <sys/time.h>
42151581Sdavidxu
43151581Sdavidxu#ifdef _KERNEL
44151576Sdavidxu/*
45151576Sdavidxu * Structures used to manage POSIX timers in a process.
46151576Sdavidxu */
47151576Sdavidxustruct itimer {
48151576Sdavidxu	struct mtx  		it_mtx;
49151576Sdavidxu	struct sigevent		it_sigev;
50151869Sdavidxu	struct itimerspec	it_time;
51151576Sdavidxu	struct proc 		*it_proc;
52151576Sdavidxu	int	it_flags;
53151576Sdavidxu	int	it_usecount;
54151576Sdavidxu	int	it_overrun;		/* Overruns currently accumulating */
55151576Sdavidxu	int	it_overrun_last;	/* Overruns associated w/ a delivery */
56151576Sdavidxu	int	it_clockid;
57151576Sdavidxu	int	it_timerid;
58151576Sdavidxu	ksiginfo_t	it_ksi;
59151576Sdavidxu	union {
60151576Sdavidxu		/* realtime */
61151576Sdavidxu		struct {
62151576Sdavidxu			struct callout it_callout;
63151576Sdavidxu		} _rt;
6413549Sjulian
65151576Sdavidxu		/* cpu timer */
66151576Sdavidxu		struct {
67151576Sdavidxu			LIST_ENTRY(itimer)	it_link;
68151576Sdavidxu			TAILQ_ENTRY(itimer)	it_worklink;
69151576Sdavidxu			int			it_active;
70151576Sdavidxu			int			it_cflags;
71151576Sdavidxu		} _cpu;
72151576Sdavidxu	} _data;
73151576Sdavidxu};
74151576Sdavidxu
75151576Sdavidxu#define it_callout	_data._rt.it_callout
76151576Sdavidxu#define it_link		_data._cpu.it_link
77151576Sdavidxu#define it_active	_data._cpu.it_active
78151576Sdavidxu#define	it_worklink	_data._cpu.it_worklink
79151576Sdavidxu#define	it_cflags	_data._cpu.it_cflags
80151576Sdavidxu
81151576Sdavidxu#define	ITF_DELETING	0x01
82151576Sdavidxu#define	ITF_WANTED	0x02
83151576Sdavidxu
84151576Sdavidxu#define	ITCF_ONWORKLIST	0x01
85151576Sdavidxu
86151576Sdavidxu#define	TIMER_MAX	32
87151576Sdavidxu
88151576Sdavidxu#define	ITIMER_LOCK(it)		mtx_lock(&(it)->it_mtx)
89151576Sdavidxu#define	ITIMER_UNLOCK(it)	mtx_unlock(&(it)->it_mtx)
90151576Sdavidxu
91151576SdavidxuLIST_HEAD(itimerlist, itimer);
92151576Sdavidxu
93151576Sdavidxustruct	itimers {
94151576Sdavidxu	struct itimerlist	its_virtual;
95151576Sdavidxu	struct itimerlist	its_prof;
96151576Sdavidxu	TAILQ_HEAD(, itimer)	its_worklist;
97151585Sdavidxu	struct itimer		*its_timers[TIMER_MAX];
98151576Sdavidxu};
99151576Sdavidxu
100151576Sdavidxustruct	kclock {
101151576Sdavidxu	int (*timer_create)(struct itimer *timer);
102151576Sdavidxu	int (*timer_settime)(struct itimer * timer, int flags,
103151576Sdavidxu		struct itimerspec * new_value,
104151576Sdavidxu		struct itimerspec * old_value);
105151576Sdavidxu	int (*timer_delete)(struct itimer * timer);
106151576Sdavidxu	int (*timer_gettime)(struct itimer * timer,
107151576Sdavidxu		struct itimerspec * cur_value);
108151576Sdavidxu	void (*event_hook)(struct proc *p, clockid_t clock_id, int event);
109151576Sdavidxu};
110151576Sdavidxu
111151576Sdavidxu/* Event values for event_hook() */
112151576Sdavidxu#define	ITIMER_EV_EXEC	0
113151576Sdavidxu#define	ITIMER_EV_EXIT	1
114151576Sdavidxu
115156137Sdavidxuint	itimer_accept(struct proc *p, int tid, ksiginfo_t *ksi);
116151581Sdavidxu#endif
117151576Sdavidxu#endif /* !_SYS_TIMERS_H_ */
118