mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
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
bdb9312632
commit
ccde72a411
3 changed files with 18 additions and 6 deletions
|
|
@ -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…
Reference in a new issue