Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1475 → Rev 1476

/uspace/trunk/kbd/include/key_buffer.h
31,7 → 31,8
 
#include <types.h>
 
#define KEYBUFFER_SIZE 128 /**< Size of buffer for pressed keys */
/** Size of buffer for pressed keys */
#define KEYBUFFER_SIZE 128
 
typedef struct {
char fifo[KEYBUFFER_SIZE];
/uspace/trunk/kbd/generic/key_buffer.c
27,14 → 27,19
*/
 
#include <key_buffer.h>
#include <futex.h>
 
atomic_t keybuffer_futex = FUTEX_INITIALIZER;
 
/** Clear key buffer.
*/
void keybuffer_free(keybuffer_t *keybuffer)
{
 
futex_down(&keybuffer_futex);
keybuffer->head = 0;
keybuffer->tail = 0;
keybuffer->items = 0;
keybuffer->head = keybuffer->tail = keybuffer->items = 0;
futex_up(&keybuffer_futex);
}
 
/** Key buffer initialization.
69,10 → 74,13
*/
void keybuffer_push(keybuffer_t *keybuffer, char key)
{
futex_down(&keybuffer_futex);
if (keybuffer->items < KEYBUFFER_SIZE) {
keybuffer->fifo[keybuffer->tail = (keybuffer->tail + 1) < keybuffer->items ? (keybuffer->tail + 1) : 0] = (key);
keybuffer->fifo[keybuffer->tail] = key;
keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE;
keybuffer->items++;
}
futex_up(&keybuffer_futex);
}
 
/** Pop character from buffer.
81,11 → 89,15
*/
int keybuffer_pop(keybuffer_t *keybuffer, char *c)
{
futex_down(&keybuffer_futex);
if (keybuffer->items > 0) {
keybuffer->items--;
*c = keybuffer->fifo[keybuffer->head = (keybuffer->head + 1) < keybuffer->items ? (keybuffer->head + 1) : 0];
*c = keybuffer->fifo[keybuffer->head];
keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
futex_up(&keybuffer_futex);
return 1;
}
futex_up(&keybuffer_futex);
return 0;
}