Browse Source

I think the problem with keep-alive and concurrency is fixed...the handling in serverRun was still not ok for the non blocking sockets.

release0.1.5
Georg Hopp 12 years ago
parent
commit
85a33ab3fd
  1. 23
      src/server/run.c

23
src/server/run.c

@ -50,7 +50,6 @@ serverRun(Server this)
*/ */
if (0 != ((this->fds)[0].revents & POLLIN)) { if (0 != ((this->fds)[0].revents & POLLIN)) {
if (-1 == serverHandleAccept(this, 0)) { if (-1 == serverHandleAccept(this, 0)) {
(this->fds)[0].revents &= ~POLLIN;
events--; events--;
} }
} }
@ -60,7 +59,6 @@ serverRun(Server this)
*/ */
if (0 != ((this->fds)[1].revents & POLLIN)) { if (0 != ((this->fds)[1].revents & POLLIN)) {
if (-1 == serverHandleAccept(this, 1)) { if (-1 == serverHandleAccept(this, 1)) {
(this->fds)[1].revents &= ~POLLIN;
events--; events--;
} }
} }
@ -72,20 +70,14 @@ serverRun(Server this)
if (0 != ((this->fds)[i].revents & POLLIN)) { if (0 != ((this->fds)[i].revents & POLLIN)) {
ssize_t processed = serverRead(this, i); ssize_t processed = serverRead(this, i);
// don't poll this one until I say.
(this->fds)[i].events &= ~POLLIN;
if (0 > processed) { if (0 > processed) {
events--; events--;
switch (processed) { switch (processed) {
case -1: // poll me again
(this->fds)[i].events |= POLLIN;
(this->fds)[i].revents &= ~POLLIN;
break;
case -2: // close me... case -2: // close me...
serverCloseConn(this, i); serverCloseConn(this, i);
case -1: // poll me again
break; break;
} }
} }
@ -101,8 +93,6 @@ serverRun(Server this)
if (0 != ((this->fds)[i].revents & POLLOUT)) { if (0 != ((this->fds)[i].revents & POLLOUT)) {
ssize_t remaining = serverWrite(this, i); ssize_t remaining = serverWrite(this, i);
(this->fds)[i].events &= ~POLLOUT;
if (0 >= remaining) { if (0 >= remaining) {
/* /*
* 0 means queue was empty...try again next * 0 means queue was empty...try again next
@ -113,19 +103,20 @@ serverRun(Server this)
events--; events--;
switch (remaining) { switch (remaining) {
case -1: // poll me again
(this->fds)[i].events |= POLLOUT;
(this->fds)[i].revents &= ~POLLOUT;
case 0: // nothing more to write stop polling
(this->fds)[i].events &= ~POLLOUT;
break; break;
case -2: // close me... case -2: // close me...
serverCloseConn(this, i); serverCloseConn(this, i);
case -1: // poll me again
break; break;
} }
} }
} }
if (0 > events)
if (0 >= events)
break; // no more events to handle break; // no more events to handle
} }
} }

Loading…
Cancel
Save