[BACK]Return to wsevent.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / wscons

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/dev/wscons/wsevent.c between version 1.17 and 1.17.6.1

version 1.17, 2005/12/11 12:24:12 version 1.17.6.1, 2006/04/22 11:39:44
Line 1 
Line 1 
 /* $NetBSD$ */  /* $NetBSD$ */
   
   /*-
    * Copyright (c) 2006 The NetBSD Foundation, Inc.
    * All rights reserved.
    *
    * This code is derived from software contributed to The NetBSD Foundation
    * by Julio M. Merino Vidal.
    *
    * 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) 1996, 1997 Christopher G. Demetriou.  All rights reserved.   * Copyright (c) 1996, 1997 Christopher G. Demetriou.  All rights reserved.
  *   *
Line 78 
Line 114 
 __KERNEL_RCSID(0, "$NetBSD$");  __KERNEL_RCSID(0, "$NetBSD$");
   
 #include <sys/param.h>  #include <sys/param.h>
   #include <sys/kernel.h>
 #include <sys/fcntl.h>  #include <sys/fcntl.h>
 #include <sys/malloc.h>  #include <sys/malloc.h>
 #include <sys/proc.h>  #include <sys/proc.h>
Line 90  __KERNEL_RCSID(0, "$NetBSD$");
Line 127  __KERNEL_RCSID(0, "$NetBSD$");
 #include <dev/wscons/wseventvar.h>  #include <dev/wscons/wseventvar.h>
   
 /*  /*
    * Size of a wsevent queue (measured in number of events).
    * Should be a power of two so that `%' is fast.
    * At the moment, the value below makes the queues use 2 Kbytes each; this
    * value may need tuning.
    */
   #define WSEVENT_QSIZE   256
   
   /*
    * Priority of code managing wsevent queues.  PWSEVENT is set just above
    * PSOCK, which is just above TTIPRI, on the theory that mouse and keyboard
    * `user' input should be quick.
    */
   #define PWSEVENT        23
   #define splwsevent()    spltty()
   
   /*
  * Initialize a wscons_event queue.   * Initialize a wscons_event queue.
  */   */
 void  void
 wsevent_init(struct wseventvar *ev)  wsevent_init(struct wseventvar *ev, struct proc *p)
 {  {
   
         if (ev->q != NULL) {          if (ev->q != NULL) {
Line 105  wsevent_init(struct wseventvar *ev)
Line 158  wsevent_init(struct wseventvar *ev)
         ev->get = ev->put = 0;          ev->get = ev->put = 0;
         ev->q = malloc((u_long)WSEVENT_QSIZE * sizeof(struct wscons_event),          ev->q = malloc((u_long)WSEVENT_QSIZE * sizeof(struct wscons_event),
                        M_DEVBUF, M_WAITOK|M_ZERO);                         M_DEVBUF, M_WAITOK|M_ZERO);
           ev->io = p;
 }  }
   
 /*  /*
Line 256  wsevent_kqfilter(struct wseventvar *ev, 
Line 310  wsevent_kqfilter(struct wseventvar *ev, 
   
         return (0);          return (0);
 }  }
   
   /*
    * Wakes up all listener of the 'ev' queue.
    */
   void
   wsevent_wakeup(struct wseventvar *ev)
   {
   
           selnotify(&ev->sel, 0);
   
           if (ev->wanted) {
                   ev->wanted = 0;
                   wakeup(ev);
           }
   
           if (ev->async)
                   psignal(ev->io, SIGIO);
   }
   
   /*
    * Injects the set of events given in 'events', whose size is 'nevenets',
    * into the 'ev' queue.  If there is not enough free space to inject them
    * all, returns ENOSPC and the queue is left intact; otherwise returns 0
    * and wakes up all listeners.
    */
   int
   wsevent_inject(struct wseventvar *ev, struct wscons_event *events,
       size_t nevents)
   {
           int oldspl;
           size_t avail, i;
           struct timespec t;
   
           /* Calculate number of free slots in the queue. */
           if (ev->put < ev->get)
                   avail = ev->get - ev->put;
           else
                   avail = WSEVENT_QSIZE - (ev->put - ev->get);
           KASSERT(avail <= WSEVENT_QSIZE);
   
           /* Fail if there is all events will not fit in the queue. */
           if (avail < nevents)
                   return ENOSPC;
   
           /* Use the current time for all events. */
           oldspl = splhigh();
           TIMEVAL_TO_TIMESPEC(&time, &t);
           splx(oldspl);
   
           /* Inject the events. */
           for (i = 0; i < nevents; i++) {
                   struct wscons_event *we;
   
                   we = &ev->q[ev->put];
                   we->type = events[i].type;
                   we->value = events[i].value;
                   we->time = t;
   
                   ev->put = (ev->put + 1) % WSEVENT_QSIZE;
           }
   
           wsevent_wakeup(ev);
   
           return 0;
   }

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.17.6.1

CVSweb <webmaster@jp.NetBSD.org>