X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/786c7d54e8d820e89997e507c29ea716c0d55fd9..2827b727d2910a3b48f9de7d67b3a67f59e256c7:/lincan/src/select.c diff --git a/lincan/src/select.c b/lincan/src/select.c index 27b2d22..894214d 100644 --- a/lincan/src/select.c +++ b/lincan/src/select.c @@ -1,56 +1,67 @@ /* select.c * Header file for the Linux CAN-bus driver. * Written by Arnaud Westenberg email:arnaud@wanadoo.nl + * Added by Pavel Pisa - OCERA team member + * email:pisa@cmp.felk.cvut.cz * This software is released under the GPL-License. - * Version 0.7.1-pi2 15 Nov 2002 - * - * added by Pavel Pisa pisa@cmp.felk.cvut.cz + * Version lincan-0.2 9 Jul 2003 */ -#include -#if defined (CONFIG_MODVERSIONS) && !defined (MODVERSIONS) -#define MODVERSIONS -#endif - -#if defined (MODVERSIONS) -#include -#endif +#include "../include/can.h" +#include "../include/can_sysdep.h" +#include "../include/main.h" -#include #include - -#include "../include/main.h" #include "../include/select.h" unsigned int can_poll(struct file *file, poll_table *wait) { - unsigned int mask = 0; + struct canuser_t *canuser = (struct canuser_t*)(file->private_data); + struct canque_ends_t *qends; struct msgobj_t *obj; - struct canfifo_t *fifo; + unsigned int mask = 0; + struct canque_edge_t *edge; + int full=0; + int i; - /* Initialize hardware pointers */ - if ( (obj = objects_p[MINOR_NR]) == NULL) { - CANMSG("Could not assign buffer structure\n"); - return 0; - } - if ( (fifo = obj->fifo) == NULL) { - CANMSG("Could not assign buffer memory.\n"); - return 0; + if(!canuser || (canuser->magic != CAN_USER_MAGIC)){ + CANMSG("can_close: bad canuser magic\n"); + return -ENODEV; } + + obj = canuser->msgobj; + qends = canuser->qends; - if (file->f_mode & FMODE_WRITE) { - poll_wait(file, &fifo->writeq, wait); - } if (file->f_mode & FMODE_READ) { - poll_wait(file, &fifo->readq, wait); + poll_wait(file, &qends->endinfo.fileinfo.readq, wait); + for(i=CANQUEUE_PRIO_NR;--i>=0;) { + if(!list_empty(&qends->active[i])) + mask |= POLLIN | POLLRDNORM; + } } - if ((file->f_mode & FMODE_READ)&& - (fifo->rx_readp != fifo->rx_writep)) { - mask |= POLLIN | POLLRDNORM; - } - if ((file->f_mode & FMODE_WRITE)&& - (fifo->tx_readp == fifo->tx_writep)) { - mask |= POLLOUT | POLLWRNORM; + + if ((file->f_mode & FMODE_WRITE) && !(file->f_flags & O_SYNC)) { + poll_wait(file, &qends->endinfo.fileinfo.writeq, wait); + + canque_for_each_inedge(qends, edge) { + if(canque_fifo_test_fl(&edge->fifo,FULL)) + full=1; + } + + if(!full) + mask |= POLLOUT | POLLWRNORM; + } + + if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_SYNC)) { + poll_wait(file, &qends->endinfo.fileinfo.emptyq, wait); + + canque_for_each_inedge(qends, edge) { + if(!canque_fifo_test_fl(&edge->fifo,EMPTY)) + full=1; + } + + if(!full) + mask |= POLLOUT | POLLWRNORM; } return mask; }