コード例 #1
0
ファイル: jz_ts.c プロジェクト: YJBeetle/virtualnoah
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;
}
コード例 #2
0
ファイル: adapter.c プロジェクト: leonsh/eldk30ppc
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;
}
コード例 #3
0
ファイル: lnative.c プロジェクト: StarChasers/LuPI2
static int l_pull (lua_State *L) {
  lua_pushnumber(L, event_pull(lua_tonumber(L, 1)));
  return 1;
}