| 655 | } |
| 656 | |
| 657 | static int ttydev_poll(struct lwp_tty *tp, rt_pollreq_t *req, struct rt_thread *td) |
| 658 | { |
| 659 | int events = req->_key; |
| 660 | int error, revents = 0; |
| 661 | |
| 662 | error = ttydev_enter(tp); |
| 663 | if (error) |
| 664 | return ((events & (POLLIN | POLLRDNORM)) | POLLHUP); |
| 665 | |
| 666 | if (events & (POLLIN | POLLRDNORM)) |
| 667 | { |
| 668 | /* See if we can read something. */ |
| 669 | if (ttydisc_read_poll(tp) > 0) |
| 670 | revents |= events & (POLLIN | POLLRDNORM); |
| 671 | } |
| 672 | |
| 673 | if (tp->t_flags & TF_ZOMBIE) |
| 674 | { |
| 675 | /* Hangup flag on zombie state. */ |
| 676 | revents |= POLLHUP; |
| 677 | } |
| 678 | else if (events & (POLLOUT | POLLWRNORM)) |
| 679 | { |
| 680 | /* See if we can write something. */ |
| 681 | if (ttydisc_write_poll(tp) > 0) |
| 682 | revents |= events & (POLLOUT | POLLWRNORM); |
| 683 | } |
| 684 | |
| 685 | if (revents == 0) |
| 686 | { |
| 687 | if (events & (POLLIN | POLLRDNORM)) |
| 688 | rt_poll_add(&tp->t_inpoll, req); |
| 689 | if (events & (POLLOUT | POLLWRNORM)) |
| 690 | rt_poll_add(&tp->t_outpoll, req); |
| 691 | } |
| 692 | |
| 693 | tty_unlock(tp); |
| 694 | |
| 695 | return revents; |
| 696 | } |
| 697 | |
| 698 | static struct cdevsw ttydev_cdevsw = { |
| 699 | .d_open = ttydev_open, |
nothing calls this directly
no test coverage detected