]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MINOR] recompute maxfd before touching fdtab
authorWilly Tarreau <w@1wt.eu>
Sun, 15 Apr 2007 08:58:02 +0000 (10:58 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 15 Apr 2007 08:58:02 +0000 (10:58 +0200)
It may be dangerous to play with fdtab before doing fd_insert()
because this last one is responsible for growing maxfd as needed.
Call fd_insert() before instead.

src/checks.c
src/client.c
src/proxy.c

index 0a272018d4aa04223e03174b1bfdd618aecc1f15..099692579dc6bf5497b5b020c96d0a5459254a00 100644 (file)
@@ -329,6 +329,7 @@ int process_chk(struct task *t)
                                                //fprintf(stderr, "process_chk: 4\n");
                        
                                                s->curfd = fd; /* that's how we know a test is in progress ;-) */
+                                               fd_insert(fd);
                                                fdtab[fd].owner = t;
                                                fdtab[fd].cb[DIR_RD].f = &event_srv_chk_r;
                                                fdtab[fd].cb[DIR_RD].b = NULL;
@@ -339,7 +340,6 @@ int process_chk(struct task *t)
 #ifdef DEBUG_FULL
                                                assert (!EV_FD_ISSET(fd, DIR_RD));
 #endif
-                                               fd_insert(fd);
                                                /* FIXME: we allow up to <inter> for a connection to establish, but we should use another parameter */
                                                tv_delayfrom(&t->expire, &now, s->inter);
                                                task_queue(t);  /* restore t to its place in the task list */
index 6b27df60f3d92cf2303bfa07612250bd8ea51b40..46cf43e4f81226008b6e9a007b742340a83d020e 100644 (file)
@@ -378,6 +378,7 @@ int event_accept(int fd) {
                s->rep->wto = s->fe->clitimeout;
                s->rep->cto = 0;
 
+               fd_insert(cfd);
                fdtab[cfd].owner = t;
                fdtab[cfd].state = FD_STREADY;
                fdtab[cfd].cb[DIR_RD].f = &stream_sock_read;
@@ -402,8 +403,6 @@ int event_accept(int fd) {
                        EV_FD_SET(cfd, DIR_RD);
                }
 
-               fd_insert(cfd);
-
                tv_eternity(&s->req->rex);
                tv_eternity(&s->req->wex);
                tv_eternity(&s->req->cex);
index a5431c2b3f19ef85d7c44bf00d49b80f0f530990..93eab162cd13b7c69c37c7975c5861c9e26f7bf7 100644 (file)
@@ -147,12 +147,12 @@ int start_proxies(int verbose)
                        listener->fd = fd;
 
                        /* the function for the accept() event */
+                       fd_insert(fd);
                        fdtab[fd].cb[DIR_RD].f  = &event_accept;
                        fdtab[fd].cb[DIR_WR].f = NULL; /* never called */
                        fdtab[fd].cb[DIR_RD].b = fdtab[fd].cb[DIR_WR].b = NULL;
                        fdtab[fd].owner = (struct task *)curproxy; /* reference the proxy instead of a task */
                        fdtab[fd].state = FD_STLISTEN;
-                       fd_insert(fd);
                        listeners++;
                }