~ubuntu-branches/ubuntu/utopic/dovecot/utopic-proposed

« back to all changes in this revision

Viewing changes to src/lib/ioloop-epoll.c

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2014-01-08 09:35:49 UTC
  • mfrom: (4.1.35 sid)
  • Revision ID: package-import@ubuntu.com-20140108093549-i72o93pux8p0dlaf
Tags: 1:2.2.9-1ubuntu1
* Merge from Debian unstable, remaining changes:
  + Add mail-stack-delivery package:
    - Update d/rules
    - d/control: convert existing dovecot-postfix package to a dummy
      package and add new mail-stack-delivery package.
    - Update maintainer scripts.
    - Rename d/dovecot-postfix.* to debian/mail-stack-delivery.*
    - d/mail-stack-delivery.preinst: Move previously installed backups and
      config files to a new package namespace.
    - d/mail-stack-delivery.prerm: Added to handle downgrades.
  + Use Snakeoil SSL certificates by default:
    - d/control: Depend on ssl-cert.
    - d/dovecot-core.postinst: Relax grep for SSL_* a bit.
  + Add autopkgtest to debian/tests/*.
  + Add ufw integration:
    - d/dovecot-core.ufw.profile: new ufw profile.
    - d/rules: install profile in dovecot-core.
    - d/control: dovecot-core - suggest ufw.
  + d/dovecot-core.dirs: Added usr/share/doc/dovecot-core
  + Add apport hook:
    - d/rules, d/source_dovecot.py
  + Add upstart job:
    - d/rules, d/dovecot-core.dovecot.upstart, d/control,
      d/dovecot-core.dirs, dovecot-imapd.{postrm, postinst, prerm},
      d/dovecot-pop3d.{postinst, postrm, prerm}.
      d/mail-stack-deliver.postinst: Convert init script to upstart.
  + Use the autotools-dev dh addon to update config.guess/config.sub for
    arm64.
* Dropped changes, included in Debian:
  - Update Dovecot name to reflect distribution in login greeting.
  - Update Drac plugin for >= 2.0.0 support.
* d/control: Drop dovecot-postfix package as its no longer required.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Linux epoll() based ioloop handler.
3
 
 *
4
 
 * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
5
 
 *
6
 
 * This software is released under the MIT license.
7
 
 */
 
1
/* Copyright (c) 2004-2013 Dovecot authors, see the included COPYING file */
8
2
 
9
3
#include "lib.h"
10
4
#include "array.h"
21
15
        int epfd;
22
16
 
23
17
        unsigned int deleted_count;
24
 
        ARRAY_DEFINE(fd_index, struct io_list *);
25
 
        ARRAY_DEFINE(events, struct epoll_event);
 
18
        ARRAY(struct io_list *) fd_index;
 
19
        ARRAY(struct epoll_event) events;
26
20
};
27
21
 
28
22
void io_loop_handler_init(struct ioloop *ioloop, unsigned int initial_fd_count)
126
120
                if (ctx->deleted_count > 0)
127
121
                        ctx->deleted_count--;
128
122
                else
129
 
                        (void)array_append_space(&ctx->events);
 
123
                        array_append_zero(&ctx->events);
130
124
        }
131
125
}
132
126
 
149
143
                op = last ? EPOLL_CTL_DEL : EPOLL_CTL_MOD;
150
144
 
151
145
                if (epoll_ctl(ctx->epfd, op, io->fd, &event) < 0) {
152
 
                        i_error("epoll_ctl(%s, %d) failed: %m",
 
146
                        const char *errstr = t_strdup_printf(
 
147
                                "epoll_ctl(%s, %d) failed: %m",
153
148
                                op == EPOLL_CTL_DEL ? "del" : "mod", io->fd);
 
149
                        if (errno == EBADF)
 
150
                                i_panic("%s", errstr);
 
151
                        else
 
152
                                i_error("%s", errstr);
154
153
                }
155
154
        }
156
155
        if (last) {
178
177
        msecs = io_loop_get_wait_time(ioloop, &tv);
179
178
 
180
179
        events = array_get_modifiable(&ctx->events, &events_count);
181
 
        ret = epoll_wait(ctx->epfd, events, events_count, msecs);
182
 
        if (ret < 0 && errno != EINTR)
183
 
                i_fatal("epoll_wait(): %m");
 
180
        if (events_count > 0) {
 
181
                ret = epoll_wait(ctx->epfd, events, events_count, msecs);
 
182
                if (ret < 0 && errno != EINTR)
 
183
                        i_fatal("epoll_wait(): %m");
 
184
        } else {
 
185
                /* no I/Os, but we should have some timeouts.
 
186
                   just wait for them. */
 
187
                i_assert(msecs >= 0);
 
188
                usleep(msecs*1000);
 
189
                ret = 0;
 
190
        }
184
191
 
185
192
        /* execute timeout handlers */
186
193
        io_loop_handle_timeouts(ioloop);