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