Implement ratecheck(), a function which can help programmers implement

rate-limited actions.  See ratecheck(9) for details of its use.
This commit is contained in:
cgd 2000-02-03 23:04:45 +00:00
parent 606920c890
commit dd84ecc7ac
2 changed files with 68 additions and 2 deletions

View File

@ -1,4 +1,40 @@
/* $NetBSD: kern_time.c,v 1.41 1999/10/10 18:41:53 hwr Exp $ */
/* $NetBSD: kern_time.c,v 1.42 2000/02/03 23:04:46 cgd Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christopher G. Demetriou.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright (c) 1982, 1986, 1989, 1993
@ -589,3 +625,32 @@ expire:
itp->it_value.tv_usec = 0; /* sec is already 0 */
return (0);
}
/*
* ratecheck(): simple time-based rate-limit checking. see ratecheck(9)
* for usage and rationale.
*/
int
ratecheck(lasttime, mininterval)
struct timeval *lasttime;
const struct timeval *mininterval;
{
struct timeval delta;
int s, rv = 0;
s = splclock();
timersub(lasttime, &mono_time, &delta);
/*
* check for 0,0 is so that the message will be seen at least once,
* even if interval is huge.
*/
if (timercmp(&delta, mininterval, >=) ||
(lasttime->tv_sec == 0 && lasttime->tv_usec == 0)) {
*lasttime = mono_time;
rv = 1;
}
splx(s);
return (rv);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: time.h,v 1.28 1999/08/16 18:42:25 tron Exp $ */
/* $NetBSD: time.h,v 1.29 2000/02/03 23:04:45 cgd Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@ -163,6 +163,7 @@ int itimerfix __P((struct timeval *tv));
int itimerdecr __P((struct itimerval *itp, int usec));
void microtime __P((struct timeval *tv));
int settime __P((struct timeval *));
int ratecheck __P((struct timeval *, const struct timeval *));
#else /* !_KERNEL */
#ifndef _STANDALONE