keybuffer.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2006 Josef Cejka
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * - Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer.
00011  * - Redistributions in binary form must reproduce the above copyright
00012  *   notice, this list of conditions and the following disclaimer in the
00013  *   documentation and/or other materials provided with the distribution.
00014  * - The name of the author may not be used to endorse or promote products
00015  *   derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00028 
00037 #include <futex.h>
00038 #include "keybuffer.h"
00039 
00040 atomic_t keybuffer_futex = FUTEX_INITIALIZER;
00041 
00044 void keybuffer_free(keybuffer_t *keybuffer)
00045 {
00046         futex_down(&keybuffer_futex);
00047         keybuffer->head = 0;
00048         keybuffer->tail = 0;
00049         keybuffer->items = 0;
00050         futex_up(&keybuffer_futex);
00051 }
00052 
00056 void keybuffer_init(keybuffer_t *keybuffer)
00057 {
00058         keybuffer_free(keybuffer);
00059 }
00060 
00069 size_t keybuffer_available(keybuffer_t *keybuffer)
00070 {
00071         return KEYBUFFER_SIZE - keybuffer->items;
00072 }
00073 
00079 bool keybuffer_empty(keybuffer_t *keybuffer)
00080 {
00081         return (keybuffer->items == 0);
00082 }
00083 
00092 void keybuffer_push(keybuffer_t *keybuffer, const console_event_t *ev)
00093 {
00094         futex_down(&keybuffer_futex);
00095         
00096         if (keybuffer->items < KEYBUFFER_SIZE) {
00097                 keybuffer->fifo[keybuffer->tail] = *ev;
00098                 keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE;
00099                 keybuffer->items++;
00100         }
00101         
00102         futex_up(&keybuffer_futex);
00103 }
00104 
00112 bool keybuffer_pop(keybuffer_t *keybuffer, console_event_t *edst)
00113 {
00114         futex_down(&keybuffer_futex);
00115         
00116         if (keybuffer->items > 0) {
00117                 keybuffer->items--;
00118                 *edst = (keybuffer->fifo[keybuffer->head]);
00119                 keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
00120                 futex_up(&keybuffer_futex);
00121                 
00122                 return true;
00123         }
00124         
00125         futex_up(&keybuffer_futex);
00126         
00127         return false;
00128 }
00129 

Generated on Thu Jun 2 07:45:49 2011 for HelenOS/USB by  doxygen 1.4.7