static ssize_t jz_read(struct file * filp, char * buffer, size_t count, loff_t * ppos) { DECLARE_WAITQUEUE(wait, current); struct jz_ts_t* ts = (struct jz_ts_t*)filp->private_data; char *ptr = buffer; struct ts_event event; int err = 0; dbg("jz_read"); add_wait_queue(&ts->wait, &wait); while (count >= sizeof(struct ts_event)) { err = -ERESTARTSYS; if (signal_pending(current)) break; if (event_pull(ts, &event)) { err = copy_to_user(ptr, &event, sizeof(struct ts_event)); if (err) break; ptr += sizeof(struct ts_event); count -= sizeof(struct ts_event); } else { set_current_state(TASK_INTERRUPTIBLE); err = -EAGAIN; if (filp->f_flags & O_NONBLOCK) break; schedule(); } } current->state = TASK_RUNNING; remove_wait_queue(&ts->wait, &wait); return ptr == buffer ? err : ptr - buffer; }
static ssize_t xts_read(struct file *filp, char *buffer, size_t count, loff_t * ppos) { DECLARE_WAITQUEUE(wait, current); struct xts_dev *dev = filp->private_data; char *ptr = buffer; int err = 0; add_wait_queue(&dev->read_wait, &wait); while (count >= sizeof (struct ts_event)) { err = -ERESTARTSYS; if (signal_pending(current)) break; if (event_pending(dev)) { struct ts_event *evt = event_get(dev); err = copy_to_user(ptr, evt, sizeof (struct ts_event)); event_pull(dev); if (err) break; ptr += sizeof (struct ts_event); count -= sizeof (struct ts_event); continue; } set_current_state(TASK_INTERRUPTIBLE); err = -EAGAIN; if (filp->f_flags & O_NONBLOCK) break; schedule(); } current->state = TASK_RUNNING; remove_wait_queue(&dev->read_wait, &wait); return ptr == buffer ? err : ptr - buffer; }
static int l_pull (lua_State *L) { lua_pushnumber(L, event_pull(lua_tonumber(L, 1))); return 1; }