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