Server 0.0.1
HTTP/REST server implementation

src/server/poll.c File Reference

#include <poll.h>
#include <errno.h>
#include "server.h"
#include "logger.h"
#include "utils/signalHandling.h"
Include dependency graph for poll.c:

Go to the source code of this file.

Defines

#define POLLFD(ptr)   ((struct pollfd *)(ptr))

Functions

int serverPoll (Server this)

Detailed Description

Author:
Georg Hopp

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.


Define Documentation

#define POLLFD (   ptr)    ((struct pollfd *)(ptr))

Definition at line 31 of file poll.c.


Function Documentation

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;
}

Here is the call graph for this function:

Here is the caller graph for this function:

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines