The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/kern_rate.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: kern_rate.c,v 1.1 2008/09/25 17:17:10 pooka Exp $      */
    2 
    3 /*-
    4  * Copyright (c) 2000, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Christopher G. Demetriou.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 
   32 #include <sys/cdefs.h>
   33 __KERNEL_RCSID(0, "$NetBSD: kern_rate.c,v 1.1 2008/09/25 17:17:10 pooka Exp $");
   34 
   35 #include <sys/param.h>
   36 #include <sys/time.h>
   37 
   38 /*
   39  * ratecheck(): simple time-based rate-limit checking.  see ratecheck(9)
   40  * for usage and rationale.
   41  */
   42 int
   43 ratecheck(struct timeval *lasttime, const struct timeval *mininterval)
   44 {
   45         struct timeval tv, delta;
   46         int rv = 0;
   47 
   48         getmicrouptime(&tv);
   49         timersub(&tv, lasttime, &delta);
   50 
   51         /*
   52          * check for 0,0 is so that the message will be seen at least once,
   53          * even if interval is huge.
   54          */
   55         if (timercmp(&delta, mininterval, >=) ||
   56             (lasttime->tv_sec == 0 && lasttime->tv_usec == 0)) {
   57                 *lasttime = tv;
   58                 rv = 1;
   59         }
   60 
   61         return (rv);
   62 }
   63 
   64 /*
   65  * ppsratecheck(): packets (or events) per second limitation.
   66  */
   67 int
   68 ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
   69 {
   70         struct timeval tv, delta;
   71         int rv;
   72 
   73         getmicrouptime(&tv);
   74         timersub(&tv, lasttime, &delta);
   75 
   76         /*
   77          * check for 0,0 is so that the message will be seen at least once.
   78          * if more than one second have passed since the last update of
   79          * lasttime, reset the counter.
   80          *
   81          * we do increment *curpps even in *curpps < maxpps case, as some may
   82          * try to use *curpps for stat purposes as well.
   83          */
   84         if ((lasttime->tv_sec == 0 && lasttime->tv_usec == 0) ||
   85             delta.tv_sec >= 1) {
   86                 *lasttime = tv;
   87                 *curpps = 0;
   88         }
   89         if (maxpps < 0)
   90                 rv = 1;
   91         else if (*curpps < maxpps)
   92                 rv = 1;
   93         else
   94                 rv = 0;
   95 
   96 #if 1 /*DIAGNOSTIC?*/
   97         /* be careful about wrap-around */
   98         if (*curpps + 1 > *curpps)
   99                 *curpps = *curpps + 1;
  100 #else
  101         /*
  102          * assume that there's not too many calls to this function.
  103          * not sure if the assumption holds, as it depends on *caller's*
  104          * behavior, not the behavior of this function.
  105          * IMHO it is wrong to make assumption on the caller's behavior,
  106          * so the above #if is #if 1, not #ifdef DIAGNOSTIC.
  107          */
  108         *curpps = *curpps + 1;
  109 #endif
  110 
  111         return (rv);
  112 }

Cache object: 4a0f221fa9afb1c993fc75cc698a3bac


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.