key_buffer.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 
00036 #include <key_buffer.h>
00037 #include <futex.h>
00038 
00039 atomic_t keybuffer_futex = FUTEX_INITIALIZER;
00040 
00043 void keybuffer_free(keybuffer_t *keybuffer) 
00044 {
00045         futex_down(&keybuffer_futex);
00046         keybuffer->head = 0;
00047         keybuffer->tail = 0;
00048         keybuffer->items = 0;
00049         futex_up(&keybuffer_futex);
00050 }
00051 
00055 void keybuffer_init(keybuffer_t *keybuffer)
00056 {
00057         keybuffer_free(keybuffer);
00058 }
00059 
00065 int keybuffer_available(keybuffer_t *keybuffer)
00066 {
00067         return KEYBUFFER_SIZE - keybuffer->items;
00068 }
00069 
00073 int keybuffer_empty(keybuffer_t *keybuffer)
00074 {
00075         return (keybuffer->items == 0);
00076 }
00077 
00082 void keybuffer_push(keybuffer_t *keybuffer, int key)
00083 {
00084         futex_down(&keybuffer_futex);
00085         if (keybuffer->items < KEYBUFFER_SIZE) {
00086                 keybuffer->fifo[keybuffer->tail] = key;
00087                 keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE;
00088                 keybuffer->items++;
00089         }
00090         futex_up(&keybuffer_futex);
00091 }
00092 
00097 int keybuffer_pop(keybuffer_t *keybuffer, int *c)
00098 {
00099         futex_down(&keybuffer_futex);
00100         if (keybuffer->items > 0) {
00101                 keybuffer->items--;
00102                 *c = (keybuffer->fifo[keybuffer->head]) ;
00103                 keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
00104                 futex_up(&keybuffer_futex);
00105                 return 1;
00106         }
00107         futex_up(&keybuffer_futex);
00108         return 0;
00109 }
00110 

Generated on Sun Jun 18 18:00:18 2006 for HelenOS Userspace (ia64) by  doxygen 1.4.6