Revision: 2774
          http://tmux.svn.sourceforge.net/tmux/?rev=2774&view=rev
Author:   tcunha
Date:     2012-04-12 12:43:40 +0000 (Thu, 12 Apr 2012)
Log Message:
-----------
Sync OpenBSD patchset 1092:

Stop accepting new clients for 1 second on EMFILE/ENFILE. Based on
ongoing fixes to other daemons by Theo.

Modified Paths:
--------------
    trunk/server-client.c
    trunk/server.c
    trunk/tmux.h

Modified: trunk/server-client.c
===================================================================
--- trunk/server-client.c       2012-04-10 09:57:08 UTC (rev 2773)
+++ trunk/server-client.c       2012-04-12 12:43:40 UTC (rev 2774)
@@ -190,6 +190,8 @@
                ARRAY_ADD(&dead_clients, c);
        c->flags |= CLIENT_DEAD;
 
+       server_add_accept(0); /* may be more file descriptors now */
+
        recalculate_sizes();
        server_check_unattached();
        server_update_socket();

Modified: trunk/server.c
===================================================================
--- trunk/server.c      2012-04-10 09:57:08 UTC (rev 2773)
+++ trunk/server.c      2012-04-12 12:43:40 UTC (rev 2774)
@@ -192,9 +192,7 @@
        }
        cfg_finished = 1;
 
-       event_set(&server_ev_accept,
-           server_fd, EV_READ|EV_PERSIST, server_accept_callback, NULL);
-       event_add(&server_ev_accept, NULL);
+       server_add_accept(0);
 
        memset(&tv, 0, sizeof tv);
        tv.tv_sec = 1;
@@ -338,6 +336,7 @@
        socklen_t               slen = sizeof sa;
        int                     newfd;
 
+       server_add_accept(0);
        if (!(events & EV_READ))
                return;
 
@@ -345,6 +344,11 @@
        if (newfd == -1) {
                if (errno == EAGAIN || errno == EINTR || errno == ECONNABORTED)
                        return;
+               if (errno == ENFILE || errno == EMFILE) {
+                       /* Delete and don't try again for 1 second. */
+                       server_add_accept(1);
+                       return;
+               }
                fatal("accept failed");
        }
        if (server_shutdown) {
@@ -354,6 +358,29 @@
        server_client_create(newfd);
 }
 
+/*
+ * Add accept event. If timeout is nonzero, add as a timeout instead of a read
+ * event - used to backoff when running out of file descriptors.
+ */
+void
+server_add_accept(int timeout)
+{
+       struct timeval tv = { timeout, 0 };
+
+       if (event_initialized(&server_ev_accept))
+               event_del(&server_ev_accept);
+
+       if (timeout == 0) {
+               event_set(&server_ev_accept,
+                   server_fd, EV_READ, server_accept_callback, NULL);
+               event_add(&server_ev_accept, NULL);
+       } else {
+               event_set(&server_ev_accept,
+                   server_fd, EV_TIMEOUT, server_accept_callback, NULL);
+               event_add(&server_ev_accept, &tv);
+       }
+}
+
 /* Signal handler. */
 /* ARGSUSED */
 void
@@ -371,9 +398,7 @@
                event_del(&server_ev_accept);
                close(server_fd);
                server_fd = server_create_socket();
-               event_set(&server_ev_accept, server_fd,
-                   EV_READ|EV_PERSIST, server_accept_callback, NULL);
-               event_add(&server_ev_accept, NULL);
+               server_add_accept(0);
                break;
        }
 }

Modified: trunk/tmux.h
===================================================================
--- trunk/tmux.h        2012-04-10 09:57:08 UTC (rev 2773)
+++ trunk/tmux.h        2012-04-12 12:43:40 UTC (rev 2774)
@@ -1709,6 +1709,7 @@
 extern struct paste_stack global_buffers;
 int     server_start(int, char *);
 void    server_update_socket(void);
+void    server_add_accept(int);
 
 /* server-client.c */
 void    server_client_create(int);

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to