add the 'y' and 'Y' options to ps, and add the 'iac' keyword. The 'y'
[dragonfly.git] / sys / dev / usbmisc / ugen / ugenbuf.c
1 /*
2  * Copyright (c) 2004 The DragonFly Project.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to The DragonFly Project
6  * by Matthew Dillon <dillon@backplane.com>.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  * 3. Neither the name of The DragonFly Project nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific, prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
26  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  * $DragonFly: src/sys/dev/usbmisc/ugen/ugenbuf.c,v 1.2 2004/07/08 16:18:10 dillon Exp $
36  */
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/kernel.h>
41 #include <sys/malloc.h>
42 #include <sys/sysctl.h>
43 #include "ugenbuf.h"
44
45 static MALLOC_DEFINE(M_UGENBUF, "ugenbufs", "Temporary buffer space");
46 static void *ugencache_buf;
47 static int ugencache_size;
48
49 /*
50  * getugenbuf()
51  *
52  *      Allocate a temporary buffer for UGEN.  This routine is called from
53  *      mainline code only and the BGL is held.
54  */
55 void *
56 getugenbuf(int reqsize, int *bsize)
57 {
58     void *buf;
59
60     if (reqsize < 256)
61         reqsize = 256;
62     if (reqsize > 262144)
63         reqsize = 262144;
64     *bsize = reqsize;
65
66     buf = ugencache_buf;
67     if (buf == NULL) {
68         buf = malloc(reqsize, M_UGENBUF, M_WAITOK);
69     } else if (ugencache_size != reqsize) {
70         ugencache_buf = NULL;
71         free(buf, M_UGENBUF);
72         buf = malloc(reqsize, M_UGENBUF, M_WAITOK);
73     } else {
74         buf = ugencache_buf;
75         ugencache_buf = NULL;
76     }
77     return(buf);
78 }
79
80 /*
81  * relugenbuf()
82  *
83  *      Release a temporary buffer for UGEN.  This routine is called from
84  *      mainline code only and the BGL is held.
85  */
86 void
87 relugenbuf(void *buf, int bsize)
88 {
89     if (ugencache_buf == NULL) {
90         ugencache_buf = buf;
91         ugencache_size = bsize;
92     } else {
93         free(buf, M_UGENBUF);
94     }
95 }
96