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/dev/sound/midi/midiq.h

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 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2003 Mathew Kanner
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   26  * SUCH DAMAGE.
   27  *
   28  * $FreeBSD$
   29  */
   30 
   31 #ifndef MIDIQ_H
   32 #define MIDIQ_H
   33 
   34 #define MIDIQ_MOVE(a,b,c) bcopy(b,a,c)
   35 
   36 #define MIDIQ_HEAD(name, type)          \
   37 struct name {                           \
   38         int h, t, s;                    \
   39         type * b;                        \
   40 }
   41 
   42 #define MIDIQ_INIT(head, buf, size) do {                \
   43         (head).h=(head).t=0;                          \
   44         (head).s=size;                                 \
   45         (head).b=buf;                                  \
   46 } while (0)
   47 
   48 #define MIDIQ_EMPTY(head)       ((head).h == (head).t )
   49 
   50 #define MIDIQ_LENBASE(head)         ((head).h - (head).t < 0 ? \
   51                                         (head).h - (head).t + (head).s : \
   52                                         (head).h - (head).t)
   53 
   54 #define MIDIQ_FULL(head)        ((head).h == -1)
   55 #define MIDIQ_AVAIL(head)       (MIDIQ_FULL(head) ? 0 : (head).s - MIDIQ_LENBASE(head))
   56 #define MIDIQ_LEN(head)         ((head).s - MIDIQ_AVAIL(head))
   57 #define MIDIQ_DEBUG 0
   58 /*
   59  * No protection against overflow, underflow
   60  */
   61 #define MIDIQ_ENQ(head, buf, size) do {                                                                 \
   62                 if(MIDIQ_DEBUG)\
   63                         printf("#1 %p %p bytes copied %jd tran req s %d h %d t %d\n",            \
   64                                &(head).b[(head).h], (buf),                                        \
   65                                (intmax_t)(sizeof(*(head).b) *                                     \
   66                                           MIN( (size), (head).s - (head).h) ),                   \
   67                                (size), (head).h, (head).t);               \
   68                 MIDIQ_MOVE(&(head).b[(head).h], (buf), sizeof(*(head).b) * MIN((size), (head).s - (head).h));                       \
   69                 if( (head).s - (head).h < (size) ) {                                                    \
   70                         if(MIDIQ_DEBUG) \
   71                                 printf("#2 %p %p bytes copied %jd\n",  (head).b, (buf) + (head).s - (head).h, (intmax_t)sizeof(*(head).b) * ((size) - (head).s + (head).h) );      \
   72                         MIDIQ_MOVE((head).b, (buf) + (head).s - (head).h, sizeof(*(head).b) * ((size) - (head).s + (head).h) );      \
   73                 } \
   74                 (head).h+=(size);                                                                         \
   75                 (head).h%=(head).s;                                                                     \
   76                 if(MIDIQ_EMPTY(head)) (head).h=-1; \
   77                 if(MIDIQ_DEBUG)\
   78                         printf("#E h %d t %d\n", (head).h, (head).t);                       \
   79 } while (0)
   80 
   81 #define MIDIQ_DEQ_I(head, buf, size, move, update) do {                                                                 \
   82                 if(MIDIQ_FULL(head)) (head).h=(head).t; \
   83                 if(MIDIQ_DEBUG)\
   84                         printf("#1 %p %p bytes copied %jd tran req s %d h %d t %d\n", &(head).b[(head).t], (buf), (intmax_t)sizeof(*(head).b) * MIN((size), (head).s - (head).t), (size), (head).h, (head).t);                       \
   85                 if (move) MIDIQ_MOVE((buf), &(head).b[(head).t], sizeof(*(head).b) * MIN((size), (head).s - (head).t));                       \
   86                 if( (head).s - (head).t < (size) ) {                                                    \
   87                         if(MIDIQ_DEBUG) \
   88                                 printf("#2 %p %p bytes copied %jd\n",  (head).b, (buf) + (head).s - (head).t, (intmax_t)sizeof(*(head).b) * ((size) - (head).s + (head).t) );      \
   89                         if (move) MIDIQ_MOVE((buf) + (head).s - (head).t, (head).b, sizeof(*(head).b) * ((size) - (head).s + (head).t) );      \
   90                 } \
   91                 if (update) { \
   92                 (head).t+=(size);                                                                         \
   93                 (head).t%=(head).s;                                                                     \
   94                 } else { \
   95                   if (MIDIQ_EMPTY(head)) (head).h=-1; \
   96                 } \
   97                 if(MIDIQ_DEBUG)\
   98                         printf("#E h %d t %d\n", (head).h, (head).t);                       \
   99 } while (0)
  100 
  101 #define MIDIQ_SIZE(head) ((head).s)
  102 #define MIDIQ_CLEAR(head) ((head).h = (head).t = 0)
  103 #define MIDIQ_BUF(head) ((head).b)
  104 #define MIDIQ_DEQ(head, buf, size) MIDIQ_DEQ_I(head, buf, size, 1, 1)
  105 #define MIDIQ_PEEK(head, buf, size) MIDIQ_DEQ_I(head, buf, size, 1, 0)
  106 #define MIDIQ_POP(head, size) MIDIQ_DEQ_I(head, &head, size, 0, 1)
  107 
  108 #endif

Cache object: 09fe474deb19ec3c3a057cacc327be96


[ 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.