- close all the unneeded fds in child processes (=> significantly less fds
authorAndrei Pelinescu-Onciul <andrei@iptel.org>
Wed, 5 Dec 2007 20:26:58 +0000 (20:26 +0000)
committerAndrei Pelinescu-Onciul <andrei@iptel.org>
Wed, 5 Dec 2007 20:26:58 +0000 (20:26 +0000)
 used)

main.c
pt.c
pt.h
sr_module.h

diff --git a/main.c b/main.c
index 22a2779..c1f6cec 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1160,6 +1160,7 @@ int main_loop()
        /* main */
        strncpy(pt[0].desc, "attendant", MAX_PT_DESC );
 #ifdef USE_TCP
+       close_extra_socks(PROC_ATTENDANT, get_proc_no());
        if(!tcp_disable){
                /* main's tcp sockets are disabled by default from init_pt() */
                unix_tcp_sock=-1;
diff --git a/pt.c b/pt.c
index 923a098..103f699 100644 (file)
--- a/pt.c
+++ b/pt.c
@@ -42,6 +42,7 @@
 #include "pt.h"
 #include "tcp_init.h"
 #include "sr_module.h"
+#include "socket_info.h"
 #include "rand/fastrand.h"
 
 #include <stdio.h>
@@ -184,6 +185,47 @@ int my_pid()
 
 
 
+/* close unneeded sockets */
+int close_extra_socks(int child_id, int proc_no)
+{
+#ifdef USE_TCP
+       int r;
+       struct socket_info* si;
+       
+       if (child_id!=PROC_TCP_MAIN){
+               for (r=0; r<proc_no; r++){
+                       if (pt[r].unix_sock>=0){
+                               /* we can't change the value in pt[] because it's
+                                * shared so we only close it */
+                               close(pt[r].unix_sock);
+                       }
+               }
+               /* close all listen sockets (needed only in tcp_main */
+               if (!tcp_disable){
+                       for(si=tcp_listen; si; si=si->next){
+                               close(si->socket);
+                               /* safe to change since this is a per process copy */
+                               si->socket=-1;
+                       }
+#ifdef USE_TLS
+                       if (!tls_disable){
+                               for(si=tls_listen; si; si=si->next){
+                                       close(si->socket);
+                                       /* safe to change since this is a per process copy */
+                                       si->socket=-1;
+                               }
+                       }
+#endif /* USE_TLS */
+               }
+               /* we still need the udp sockets (for sending) so we don't close them
+                * too */
+       }
+#endif /* USE_TCP */
+       return 0;
+}
+
+
+
 /**
  * Forks a new process.
  * @param child_id - rank, if equal to PROC_NOCHLDINIT init_child will not be
@@ -246,6 +288,10 @@ int fork_process(int child_id, char *desc, int make_sock)
                /* child */
                is_main=0; /* a forked process cannot be the "main" one */
                process_no=child_process_no;
+               /* close tcp unix sockets if this is not tcp main */
+#ifdef USE_TCP
+               close_extra_socks(child_id, process_no);
+#endif /* USE_TCP */
                srand(new_seed1);
                fastrand_seed(rand());
                srandom(new_seed2+time(0));
@@ -325,6 +371,7 @@ int fork_tcp_process(int child_id, char *desc, int r, int *reader_fd_1)
        int sockfd[2];
        int reader_fd[2]; /* for comm. with the tcp children read  */
        int ret;
+       int i;
        unsigned int new_seed1;
        unsigned int new_seed2;
        
@@ -381,6 +428,17 @@ int fork_tcp_process(int child_id, char *desc, int r, int *reader_fd_1)
        if (pid==0){
                is_main=0; /* a forked process cannot be the "main" one */
                process_no=child_process_no;
+               /* close unneeded unix sockets */
+               close_extra_socks(child_id, process_no);
+               /* same for unneeded tcp_children <-> tcp_main unix socks */
+               for (i=0; i<r; i++){
+                       if (tcp_children[i].unix_sock>=0){
+                               close(tcp_children[i].unix_sock);
+                               /* tcp_children is per process, so it's safe to change
+                                * the unix_sock to -1 */
+                               tcp_children[i].unix_sock=-1;
+                       }
+               }
                srand(new_seed1);
                fastrand_seed(rand());
                srandom(new_seed2+time(0));
diff --git a/pt.h b/pt.h
index eb3831a..ced50ff 100644 (file)
--- a/pt.h
+++ b/pt.h
@@ -73,6 +73,11 @@ int register_procs(int no);
 int get_max_open_fds();
 int register_fds(int no);
 
+
+int close_extra_socks(int proc_id, int proc_no);
+
+#define get_proc_no() ((process_count)?*process_count:0)
+
 /* return processes pid */
 int my_pid();
 
index 7aadcc8..768c344 100644 (file)
@@ -91,6 +91,7 @@ typedef int (*param_func_t)( modparam_t type, void* val);
 #define PROC_FIFO      PROC_RPC  /* FIFO attendant process */
 #define PROC_TCP_MAIN -4  /* TCP main process */
 #define PROC_UNIXSOCK -5  /* Unix socket server */
+#define PROC_ATTENDANT -10  /* main "attendant process */
 #define PROC_INIT     -127 /* special rank, the context is the main ser
                                                          process, but this is guaranteed to be executed
                                                          before any process is forked, so it can be used