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:
parent
3177d246be
commit
18b0669383
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user