@@ -480,6 +480,9 @@ NetHandler::mainNetEvent(int event, Event *e)
480480 vc = epd->data .vc ;
481481 if (get_ev_events (pd, x) & (EVENTIO_READ | EVENTIO_ERROR)) {
482482 vc->read .triggered = 1 ;
483+ if (get_ev_events (pd, x) & EVENTIO_ERROR) {
484+ vc->read .error = 1 ;
485+ }
483486 if (!read_ready_list.in (vc)) {
484487 read_ready_list.enqueue (vc);
485488 } else if (get_ev_events (pd, x) & EVENTIO_ERROR) {
@@ -491,6 +494,9 @@ NetHandler::mainNetEvent(int event, Event *e)
491494 vc = epd->data .vc ;
492495 if (get_ev_events (pd, x) & (EVENTIO_WRITE | EVENTIO_ERROR)) {
493496 vc->write .triggered = 1 ;
497+ if (get_ev_events (pd, x) & EVENTIO_ERROR) {
498+ vc->write .error = 1 ;
499+ }
494500 if (!write_ready_list.in (vc)) {
495501 write_ready_list.enqueue (vc);
496502 } else if (get_ev_events (pd, x) & EVENTIO_ERROR) {
@@ -525,7 +531,17 @@ NetHandler::mainNetEvent(int event, Event *e)
525531 close_UnixNetVConnection (vc, trigger_event->ethread );
526532 else if (vc->read .enabled && vc->read .triggered )
527533 vc->net_read_io (this , trigger_event->ethread );
528- else if (!vc->read .enabled ) {
534+ else if (vc->read .error ) {
535+ int err = 0 , errlen = sizeof (int );
536+ if (getsockopt (vc->con .fd , SOL_SOCKET, SO_ERROR, &err, (socklen_t *)&errlen) == -1 ) {
537+ err = errno;
538+ }
539+ if (err != EAGAIN && err != EINTR) {
540+ vc->readSignalError (this , err);
541+ } else {
542+ vc->read .error = 0 ;
543+ }
544+ } else if (!vc->read .enabled ) {
529545 read_ready_list.remove (vc);
530546#if defined(solaris)
531547 if (vc->read .triggered && vc->write .enabled ) {
@@ -542,7 +558,17 @@ NetHandler::mainNetEvent(int event, Event *e)
542558 close_UnixNetVConnection (vc, trigger_event->ethread );
543559 else if (vc->write .enabled && vc->write .triggered )
544560 write_to_net (this , vc, trigger_event->ethread );
545- else if (!vc->write .enabled ) {
561+ else if (vc->write .error ) {
562+ int err = 0 , errlen = sizeof (int );
563+ if (getsockopt (vc->con .fd , SOL_SOCKET, SO_ERROR, &err, (socklen_t *)&errlen) == -1 ) {
564+ err = errno;
565+ }
566+ if (err != EAGAIN && err != EINTR) {
567+ vc->writeSignalError (this , err);
568+ } else {
569+ vc->write .error = 0 ;
570+ }
571+ } else if (!vc->write .enabled ) {
546572 write_ready_list.remove (vc);
547573#if defined(solaris)
548574 if (vc->write .triggered && vc->read .enabled ) {
0 commit comments