Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 250493
b: refs/heads/master
c: cdda911
h: refs/heads/master
i:
  250491: 590fc5e
v: v3
  • Loading branch information
Jeff Brown authored and Dmitry Torokhov committed Apr 27, 2011
1 parent 110c1a0 commit e061b33
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 03351ff4d897098a590cb247b6eebc470b8ecb5a
refs/heads/master: cdda911c34006f1089f3c87b1a1f31ab3a4722f2
17 changes: 11 additions & 6 deletions trunk/drivers/input/evdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct evdev {
struct evdev_client {
unsigned int head;
unsigned int tail;
unsigned int packet_head; /* [future] position of the first element of next packet */
spinlock_t buffer_lock; /* protects access to buffer, head and tail */
struct fasync_struct *fasync;
struct evdev *evdev;
Expand Down Expand Up @@ -72,12 +73,16 @@ static void evdev_pass_event(struct evdev_client *client,
client->buffer[client->tail].type = EV_SYN;
client->buffer[client->tail].code = SYN_DROPPED;
client->buffer[client->tail].value = 0;
}

spin_unlock(&client->buffer_lock);
client->packet_head = client->tail;
}

if (event->type == EV_SYN)
if (event->type == EV_SYN && event->code == SYN_REPORT) {
client->packet_head = client->head;
kill_fasync(&client->fasync, SIGIO, POLL_IN);
}

spin_unlock(&client->buffer_lock);
}

/*
Expand Down Expand Up @@ -387,12 +392,12 @@ static ssize_t evdev_read(struct file *file, char __user *buffer,
if (count < input_event_size())
return -EINVAL;

if (client->head == client->tail && evdev->exist &&
if (client->packet_head == client->tail && evdev->exist &&
(file->f_flags & O_NONBLOCK))
return -EAGAIN;

retval = wait_event_interruptible(evdev->wait,
client->head != client->tail || !evdev->exist);
client->packet_head != client->tail || !evdev->exist);
if (retval)
return retval;

Expand Down Expand Up @@ -421,7 +426,7 @@ static unsigned int evdev_poll(struct file *file, poll_table *wait)
poll_wait(file, &evdev->wait, wait);

mask = evdev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR;
if (client->head != client->tail)
if (client->packet_head != client->tail)
mask |= POLLIN | POLLRDNORM;

return mask;
Expand Down

0 comments on commit e061b33

Please sign in to comment.