blob: 18ccb2456c94dba43c41860f3b78bb9a1836ab4a [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 * File descriptors management functions.
3 *
Willy Tarreau4f60f162007-04-08 16:39:58 +02004 * Copyright 2000-2007 Willy Tarreau <w@1wt.eu>
Willy Tarreaubaaee002006-06-26 02:48:02 +02005 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 *
11 */
12
Willy Tarreau4f60f162007-04-08 16:39:58 +020013#include <string.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020014#include <unistd.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020015#include <sys/types.h>
16
Willy Tarreau2dd0d472006-06-29 17:53:05 +020017#include <common/compat.h>
18#include <common/config.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020019
20#include <types/fd.h>
21#include <types/global.h>
22
Willy Tarreau2a429502006-10-15 14:52:29 +020023#include <proto/fd.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020024
25struct fdtab *fdtab = NULL; /* array of all the file descriptors */
26int maxfd; /* # of the highest fd + 1 */
27int totalconn; /* total # of terminated sessions */
28int actconn; /* # of active sessions */
29
Willy Tarreaubaaee002006-06-26 02:48:02 +020030int cfg_polling_mechanism = 0; /* POLL_USE_{SELECT|POLL|EPOLL} */
31
Willy Tarreau4f60f162007-04-08 16:39:58 +020032struct poller pollers[MAX_POLLERS];
33struct poller cur_poller;
34int nbpollers = 0;
Willy Tarreaubaaee002006-06-26 02:48:02 +020035
36
Willy Tarreau4f60f162007-04-08 16:39:58 +020037/*********************
38 * generic functions
39 *********************/
Willy Tarreau2a429502006-10-15 14:52:29 +020040
Willy Tarreau4f60f162007-04-08 16:39:58 +020041extern int select_register(struct poller *p);
42#if defined(ENABLE_POLL)
43extern int poll_register(struct poller *p);
Willy Tarreau2a429502006-10-15 14:52:29 +020044#endif
Willy Tarreaubaaee002006-06-26 02:48:02 +020045#if defined(ENABLE_EPOLL)
Willy Tarreau4f60f162007-04-08 16:39:58 +020046extern int epoll_register(struct poller *p);
Willy Tarreaubaaee002006-06-26 02:48:02 +020047#endif
48
Willy Tarreaubaaee002006-06-26 02:48:02 +020049
Willy Tarreau4f60f162007-04-08 16:39:58 +020050/* Deletes an FD from the fdsets, and recomputes the maxfd limit.
51 * The file descriptor is also closed.
52 */
53void fd_delete(int fd)
Willy Tarreaubaaee002006-06-26 02:48:02 +020054{
Willy Tarreau4f60f162007-04-08 16:39:58 +020055 EV_FD_CLO(fd);
56 close(fd);
57 fdtab[fd].state = FD_STCLOSE;
Willy Tarreaubaaee002006-06-26 02:48:02 +020058
Willy Tarreau4f60f162007-04-08 16:39:58 +020059 while ((maxfd-1 >= 0) && (fdtab[maxfd-1].state == FD_STCLOSE))
60 maxfd--;
Willy Tarreaubaaee002006-06-26 02:48:02 +020061}
Willy Tarreaubaaee002006-06-26 02:48:02 +020062
63
Willy Tarreau4f60f162007-04-08 16:39:58 +020064/* registers all known pollers */
65void register_pollers()
Willy Tarreaubaaee002006-06-26 02:48:02 +020066{
Willy Tarreau4f60f162007-04-08 16:39:58 +020067 if (select_register(&pollers[nbpollers]))
68 nbpollers++;
69#if defined(ENABLE_POLL)
70 poll_register(&pollers[nbpollers]);
71 nbpollers++;
Willy Tarreaubaaee002006-06-26 02:48:02 +020072#endif
Willy Tarreaubaaee002006-06-26 02:48:02 +020073
Willy Tarreau4f60f162007-04-08 16:39:58 +020074#if defined(ENABLE_EPOLL)
75 epoll_register(&pollers[nbpollers]);
76 nbpollers++;
Willy Tarreaubaaee002006-06-26 02:48:02 +020077#endif
Willy Tarreau4f60f162007-04-08 16:39:58 +020078}
Willy Tarreaubaaee002006-06-26 02:48:02 +020079
Willy Tarreau4f60f162007-04-08 16:39:58 +020080/* disable the specified poller */
81void disable_poller(const char *poller_name)
82{
83 int p;
Willy Tarreaubaaee002006-06-26 02:48:02 +020084
Willy Tarreau4f60f162007-04-08 16:39:58 +020085 for (p = 0; p < nbpollers; p++)
86 if (strcmp(pollers[p].name, poller_name) == 0)
87 pollers[p].pref = 0;
88}
Willy Tarreaubaaee002006-06-26 02:48:02 +020089
90/*
Willy Tarreau4f60f162007-04-08 16:39:58 +020091 * Initialize the pollers till the best one is found.
92 * If none works, returns 0, otherwise 1.
Willy Tarreaubaaee002006-06-26 02:48:02 +020093 */
Willy Tarreau4f60f162007-04-08 16:39:58 +020094int init_pollers()
Willy Tarreaubaaee002006-06-26 02:48:02 +020095{
Willy Tarreau4f60f162007-04-08 16:39:58 +020096 int p;
97 struct poller *bp;
Willy Tarreaubaaee002006-06-26 02:48:02 +020098
Willy Tarreaubaaee002006-06-26 02:48:02 +020099
Willy Tarreau4f60f162007-04-08 16:39:58 +0200100 do {
101 bp = NULL;
102 for (p = 0; p < nbpollers; p++)
103 if (!bp || (pollers[p].pref > bp->pref))
104 bp = &pollers[p];
Willy Tarreaubaaee002006-06-26 02:48:02 +0200105
Willy Tarreau4f60f162007-04-08 16:39:58 +0200106 if (!bp || bp->pref == 0)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200107 break;
108
Willy Tarreau4f60f162007-04-08 16:39:58 +0200109 if (bp->init(bp)) {
110 memcpy(&cur_poller, bp, sizeof(*bp));
111 return 1;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200112 }
Willy Tarreau4f60f162007-04-08 16:39:58 +0200113 } while (!bp || bp->pref == 0);
114 return 0;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200115}
116
Willy Tarreaubaaee002006-06-26 02:48:02 +0200117/*
118 * Local variables:
119 * c-indent-level: 8
120 * c-basic-offset: 8
121 * End:
122 */