[BACK]Return to wsevent.c CVS log [TXT][DIR] Up to [local] / sys / dev / wscons

Annotation of sys/dev/wscons/wsevent.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: wsevent.c,v 1.5 2005/11/21 18:16:45 millert Exp $ */
                      2: /* $NetBSD: wsevent.c,v 1.16 2003/08/07 16:31:29 agc Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1996, 1997 Christopher G. Demetriou.  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:  * 3. All advertising materials mentioning features or use of this software
                     16:  *    must display the following acknowledgement:
                     17:  *      This product includes software developed by Christopher G. Demetriou
                     18:  *     for the NetBSD Project.
                     19:  * 4. The name of the author may not be used to endorse or promote products
                     20:  *    derived from this software without specific prior written permission
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32:  */
                     33:
                     34: #include <sys/cdefs.h>
                     35:
                     36: /*
                     37:  * Copyright (c) 1992, 1993
                     38:  *     The Regents of the University of California.  All rights reserved.
                     39:  *
                     40:  * This software was developed by the Computer Systems Engineering group
                     41:  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
                     42:  * contributed to Berkeley.
                     43:  *
                     44:  * All advertising materials mentioning features or use of this software
                     45:  * must display the following acknowledgement:
                     46:  *     This product includes software developed by the University of
                     47:  *     California, Lawrence Berkeley Laboratory.
                     48:  *
                     49:  * Redistribution and use in source and binary forms, with or without
                     50:  * modification, are permitted provided that the following conditions
                     51:  * are met:
                     52:  * 1. Redistributions of source code must retain the above copyright
                     53:  *    notice, this list of conditions and the following disclaimer.
                     54:  * 2. Redistributions in binary form must reproduce the above copyright
                     55:  *    notice, this list of conditions and the following disclaimer in the
                     56:  *    documentation and/or other materials provided with the distribution.
                     57:  * 3. Neither the name of the University nor the names of its contributors
                     58:  *    may be used to endorse or promote products derived from this software
                     59:  *    without specific prior written permission.
                     60:  *
                     61:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     62:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     63:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     64:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     65:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     66:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     67:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     68:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     69:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     70:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     71:  * SUCH DAMAGE.
                     72:  *
                     73:  *     @(#)event.c     8.1 (Berkeley) 6/11/93
                     74:  */
                     75:
                     76: /*
                     77:  * Internal "wscons_event" queue interface for the keyboard and mouse drivers.
                     78:  */
                     79:
                     80: #include <sys/param.h>
                     81: #include <sys/fcntl.h>
                     82: #include <sys/malloc.h>
                     83: #include <sys/proc.h>
                     84: #include <sys/systm.h>
                     85: #include <sys/vnode.h>
                     86: #include <sys/selinfo.h>
                     87: #include <sys/poll.h>
                     88:
                     89: #include <dev/wscons/wsconsio.h>
                     90: #include <dev/wscons/wseventvar.h>
                     91:
                     92: /*
                     93:  * Initialize a wscons_event queue.
                     94:  */
                     95: void
                     96: wsevent_init(struct wseventvar *ev)
                     97: {
                     98:
                     99:        if (ev->q != NULL) {
                    100: #ifdef DIAGNOSTIC
                    101:                printf("wsevent_init: already initialized\n");
                    102: #endif
                    103:                return;
                    104:        }
                    105:        ev->get = ev->put = 0;
                    106:        ev->q = malloc((u_long)WSEVENT_QSIZE * sizeof(struct wscons_event),
                    107:            M_DEVBUF, M_WAITOK);
                    108:        bzero((caddr_t)ev->q, WSEVENT_QSIZE * sizeof(struct wscons_event));
                    109: }
                    110:
                    111: /*
                    112:  * Tear down a wscons_event queue.
                    113:  */
                    114: void
                    115: wsevent_fini(struct wseventvar *ev)
                    116: {
                    117:        if (ev->q == NULL) {
                    118: #ifdef DIAGNOSTIC
                    119:                printf("wsevent_fini: already invoked\n");
                    120: #endif
                    121:                return;
                    122:        }
                    123:        free(ev->q, M_DEVBUF);
                    124:        ev->q = NULL;
                    125: }
                    126:
                    127: /*
                    128:  * User-level interface: read, poll.
                    129:  * (User cannot write an event queue.)
                    130:  */
                    131: int
                    132: wsevent_read(struct wseventvar *ev, struct uio *uio, int flags)
                    133: {
                    134:        int s, n, cnt, error;
                    135:
                    136:        /*
                    137:         * Make sure we can return at least 1.
                    138:         */
                    139:        if (uio->uio_resid < sizeof(struct wscons_event))
                    140:                return (EMSGSIZE);      /* ??? */
                    141:        s = splwsevent();
                    142:        while (ev->get == ev->put) {
                    143:                if (flags & IO_NDELAY) {
                    144:                        splx(s);
                    145:                        return (EWOULDBLOCK);
                    146:                }
                    147:                ev->wanted = 1;
                    148:                error = tsleep(ev, PWSEVENT | PCATCH,
                    149:                    "wsevent_read", 0);
                    150:                if (error) {
                    151:                        splx(s);
                    152:                        return (error);
                    153:                }
                    154:        }
                    155:        /*
                    156:         * Move wscons_event from tail end of queue (there is at least one
                    157:         * there).
                    158:         */
                    159:        if (ev->put < ev->get)
                    160:                cnt = WSEVENT_QSIZE - ev->get;  /* events in [get..QSIZE) */
                    161:        else
                    162:                cnt = ev->put - ev->get;        /* events in [get..put) */
                    163:        splx(s);
                    164:        n = howmany(uio->uio_resid, sizeof(struct wscons_event));
                    165:        if (cnt > n)
                    166:                cnt = n;
                    167:        error = uiomove((caddr_t)&ev->q[ev->get],
                    168:            cnt * sizeof(struct wscons_event), uio);
                    169:        n -= cnt;
                    170:        /*
                    171:         * If we do not wrap to 0, used up all our space, or had an error,
                    172:         * stop.  Otherwise move from front of queue to put index, if there
                    173:         * is anything there to move.
                    174:         */
                    175:        if ((ev->get = (ev->get + cnt) % WSEVENT_QSIZE) != 0 ||
                    176:            n == 0 || error || (cnt = ev->put) == 0)
                    177:                return (error);
                    178:        if (cnt > n)
                    179:                cnt = n;
                    180:        error = uiomove((caddr_t)&ev->q[0],
                    181:            cnt * sizeof(struct wscons_event), uio);
                    182:        ev->get = cnt;
                    183:        return (error);
                    184: }
                    185:
                    186: int
                    187: wsevent_poll(struct wseventvar *ev, int events, struct proc *p)
                    188: {
                    189:        int revents = 0;
                    190:        int s = splwsevent();
                    191:
                    192:        if (events & (POLLIN | POLLRDNORM)) {
                    193:                if (ev->get != ev->put)
                    194:                        revents |= events & (POLLIN | POLLRDNORM);
                    195:                else
                    196:                        selrecord(p, &ev->sel);
                    197:        }
                    198:
                    199:        splx(s);
                    200:        return (revents);
                    201: }

CVSweb