mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-02 17:26:42 +09:00
staging: comedi: serial2002: factor (*poll) busy wait out of tty_read()
Factor the (*poll) busy wait code out of tty_read() so the indent level can be reduced and tty_read() is a bit cleaner. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
32ef0e3e30
commit
0a245982e6
@@ -102,6 +102,33 @@ static int __tty_readb(struct file *f, unsigned char *buf)
|
||||
return f->f_op->read(f, p, 1, &f->f_pos);
|
||||
}
|
||||
|
||||
static void tty_read_poll_wait(struct file *f, int timeout)
|
||||
{
|
||||
struct poll_wqueues table;
|
||||
struct timeval start, now;
|
||||
|
||||
do_gettimeofday(&start);
|
||||
poll_initwait(&table);
|
||||
while (1) {
|
||||
long elapsed;
|
||||
int mask;
|
||||
|
||||
mask = f->f_op->poll(f, &table.pt);
|
||||
if (mask & (POLLRDNORM | POLLRDBAND | POLLIN |
|
||||
POLLHUP | POLLERR)) {
|
||||
break;
|
||||
}
|
||||
do_gettimeofday(&now);
|
||||
elapsed = (1000000 * (now.tv_sec - start.tv_sec) +
|
||||
now.tv_usec - start.tv_usec);
|
||||
if (elapsed > timeout)
|
||||
break;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(((timeout - elapsed) * HZ) / 10000);
|
||||
}
|
||||
poll_freewait(&table);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* On 2.6.26.3 this occaisonally gave me page faults, worked around by
|
||||
@@ -132,31 +159,7 @@ static int tty_read(struct file *f, int timeout)
|
||||
oldfs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
if (f->f_op->poll) {
|
||||
struct poll_wqueues table;
|
||||
struct timeval start, now;
|
||||
|
||||
do_gettimeofday(&start);
|
||||
poll_initwait(&table);
|
||||
while (1) {
|
||||
long elapsed;
|
||||
int mask;
|
||||
|
||||
mask = f->f_op->poll(f, &table.pt);
|
||||
if (mask & (POLLRDNORM | POLLRDBAND | POLLIN |
|
||||
POLLHUP | POLLERR)) {
|
||||
break;
|
||||
}
|
||||
do_gettimeofday(&now);
|
||||
elapsed =
|
||||
(1000000 * (now.tv_sec - start.tv_sec) +
|
||||
now.tv_usec - start.tv_usec);
|
||||
if (elapsed > timeout)
|
||||
break;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(((timeout -
|
||||
elapsed) * HZ) / 10000);
|
||||
}
|
||||
poll_freewait(&table);
|
||||
tty_read_poll_wait(f, timeout);
|
||||
|
||||
if (__tty_readb(f, &ch) == 1)
|
||||
result = ch;
|
||||
|
||||
Reference in New Issue
Block a user