When poll(2)'ing for readability or writability of a file descriptor

on behalf of a thread, we should check the POLLERR, POLLHUP, and
POLLNVAL flags as well to wake up the thread in these cases.

Suggested by:	deischen
MFC after:	3 days
This commit is contained in:
Archie Cobbs 2002-08-29 00:44:11 +00:00
parent bdb9312632
commit ccde72a411
3 changed files with 18 additions and 6 deletions

View file

@ -880,7 +880,9 @@ thread_kern_poll(int wait_reqd)
/* File descriptor read wait: */
case PS_FDR_WAIT:
if ((nfds < _thread_dtablesize) &&
(_thread_pfd_table[nfds].revents & POLLRDNORM)) {
(_thread_pfd_table[nfds].revents
& (POLLRDNORM|POLLERR|POLLHUP|POLLNVAL))
!= 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
PTHREAD_NEW_STATE(pthread,PS_RUNNING);
@ -892,7 +894,9 @@ thread_kern_poll(int wait_reqd)
/* File descriptor write wait: */
case PS_FDW_WAIT:
if ((nfds < _thread_dtablesize) &&
(_thread_pfd_table[nfds].revents & POLLWRNORM)) {
(_thread_pfd_table[nfds].revents
& (POLLWRNORM|POLLERR|POLLHUP|POLLNVAL))
!= 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
PTHREAD_NEW_STATE(pthread,PS_RUNNING);

View file

@ -880,7 +880,9 @@ thread_kern_poll(int wait_reqd)
/* File descriptor read wait: */
case PS_FDR_WAIT:
if ((nfds < _thread_dtablesize) &&
(_thread_pfd_table[nfds].revents & POLLRDNORM)) {
(_thread_pfd_table[nfds].revents
& (POLLRDNORM|POLLERR|POLLHUP|POLLNVAL))
!= 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
PTHREAD_NEW_STATE(pthread,PS_RUNNING);
@ -892,7 +894,9 @@ thread_kern_poll(int wait_reqd)
/* File descriptor write wait: */
case PS_FDW_WAIT:
if ((nfds < _thread_dtablesize) &&
(_thread_pfd_table[nfds].revents & POLLWRNORM)) {
(_thread_pfd_table[nfds].revents
& (POLLWRNORM|POLLERR|POLLHUP|POLLNVAL))
!= 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
PTHREAD_NEW_STATE(pthread,PS_RUNNING);

View file

@ -880,7 +880,9 @@ thread_kern_poll(int wait_reqd)
/* File descriptor read wait: */
case PS_FDR_WAIT:
if ((nfds < _thread_dtablesize) &&
(_thread_pfd_table[nfds].revents & POLLRDNORM)) {
(_thread_pfd_table[nfds].revents
& (POLLRDNORM|POLLERR|POLLHUP|POLLNVAL))
!= 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
PTHREAD_NEW_STATE(pthread,PS_RUNNING);
@ -892,7 +894,9 @@ thread_kern_poll(int wait_reqd)
/* File descriptor write wait: */
case PS_FDW_WAIT:
if ((nfds < _thread_dtablesize) &&
(_thread_pfd_table[nfds].revents & POLLWRNORM)) {
(_thread_pfd_table[nfds].revents
& (POLLWRNORM|POLLERR|POLLHUP|POLLNVAL))
!= 0) {
PTHREAD_WAITQ_CLEARACTIVE();
PTHREAD_WORKQ_REMOVE(pthread);
PTHREAD_NEW_STATE(pthread,PS_RUNNING);