|
Server 0.0.1
HTTP/REST server implementation
|
#include <poll.h>#include <errno.h>#include "server.h"#include "logger.h"#include "utils/signalHandling.h"
Go to the source code of this file.
Defines | |
| #define | POLLFD(ptr) ((struct pollfd *)(ptr)) |
Functions | |
| int | serverPoll (Server this) |
Copyright © 2012 Georg Hopp
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
Definition in file poll.c.
| int serverPoll | ( | Server | this | ) |
put all closed fds to end of array in O(this->nfds)
Definition at line 34 of file poll.c.
{
int events;
struct pollfd * fda = &(this->fds[2]);
struct pollfd * fdb = &(this->fds[this->nfds-1]);
while (fda <= fdb) {
while (0 == fdb->fd && fda <= fdb) {
fdb--;
this->nfds--;
}
while (0 != fda->fd && fda <= fdb) fda++;
if (fda < fdb) {
memcpy(fda, fdb, sizeof(struct pollfd));
fdb--;
this->nfds--;
}
}
/*
* wait for handles to become ready
*/
if (-1 == (events = poll(this->fds, this->nfds, -1))) {
switch (errno) {
default:
case EBADF:
case EINVAL:
case ENOMEM:
doShutdown = 1;
// DROP THROUGH
case EINTR:
loggerLog(this->logger, LOGGER_CRIT,
"poll systemcall failed: [%s] - service terminated",
strerror(errno));
}
}
return events;
}

