core: new cfg parameter fork_delay
authorDaniel-Constantin Mierla <miconda@gmail.com>
Fri, 6 Jan 2012 11:06:02 +0000 (12:06 +0100)
committerTimo Reimann <sr@foo-lounge.de>
Fri, 6 Jan 2012 19:31:55 +0000 (20:31 +0100)
- number of usecs to wait before forking a process
- default is 0, don't wait
- useful in case there are some throttling policies for the system
  running the sip server (e.g., number of new db connections per second)
  -- you can introduce delays so that worker processes are not forked at
  once

cfg.lex
cfg.y
pt.c
pt.h

diff --git a/cfg.lex b/cfg.lex
index 0f1be4c..9c96261 100644 (file)
--- a/cfg.lex
+++ b/cfg.lex
@@ -339,6 +339,7 @@ AVP_PREF    (([ft][rud]?)|g)\.
 /* config vars. */
 DEBUG  debug
 FORK   fork
+FORK_DELAY     fork_delay
 LOGSTDERROR    log_stderror
 LOGFACILITY    log_facility
 LOGNAME                log_name
@@ -702,6 +703,7 @@ IMPORTFILE      "import_file"
 
 <INITIAL>{DEBUG}       { count(); yylval.strval=yytext; return DEBUG_V; }
 <INITIAL>{FORK}                { count(); yylval.strval=yytext; return FORK; }
+<INITIAL>{FORK_DELAY}  { count(); yylval.strval=yytext; return FORK_DELAY; }
 <INITIAL>{LOGSTDERROR} { yylval.strval=yytext; return LOGSTDERROR; }
 <INITIAL>{LOGFACILITY} { yylval.strval=yytext; return LOGFACILITY; }
 <INITIAL>{LOGNAME}     { yylval.strval=yytext; return LOGNAME; }
diff --git a/cfg.y b/cfg.y
index fb494ea..223d7ba 100644 (file)
--- a/cfg.y
+++ b/cfg.y
@@ -394,6 +394,7 @@ extern char *finame;
 /* config vars. */
 %token DEBUG_V
 %token FORK
+%token FORK_DELAY
 %token LOGSTDERROR
 %token LOGFACILITY
 %token LOGNAME
@@ -828,6 +829,8 @@ assign_stm:
        | DEBUG_V EQUAL error  { yyerror("number  expected"); }
        | FORK  EQUAL NUMBER { dont_fork= ! $3; }
        | FORK  EQUAL error  { yyerror("boolean value expected"); }
+       | FORK_DELAY  EQUAL NUMBER { set_fork_delay($3); }
+       | FORK_DELAY  EQUAL error  { yyerror("number expected"); }
        | LOGSTDERROR EQUAL NUMBER { if (!config_check) log_stderr=$3; }
        | LOGSTDERROR EQUAL error { yyerror("boolean value expected"); }
        | LOGFACILITY EQUAL ID {
diff --git a/pt.c b/pt.c
index 68842e6..7764a94 100644 (file)
--- a/pt.c
+++ b/pt.c
 static int estimated_proc_no=0;
 static int estimated_fds_no=0;
 
+/* number of usec to wait before forking a process */
+static unsigned int fork_delay = 0;
+
+unsigned int set_fork_delay(unsigned int v)
+{
+       unsigned int r;
+       r =  fork_delay;
+       fork_delay = v;
+       return r;
+}
 
 /* number of known "common" used fds */
 static int calc_common_open_fds_no()
@@ -258,6 +268,9 @@ int fork_process(int child_id, char *desc, int make_sock)
        int sockfd[2];
 #endif
 
+       if(unlikely(fork_delay>0))
+               sleep_us(fork_delay);
+
        ret=-1;
        #ifdef USE_TCP
                sockfd[0]=sockfd[1]=-1;
diff --git a/pt.h b/pt.h
index d2af6ac..c3bd901 100644 (file)
--- a/pt.h
+++ b/pt.h
@@ -103,4 +103,6 @@ void mem_dump_pkg_cb(str *gname, str *name);
 int mem_dump_shm_fixup(void *handle, str *gname, str *name, void **val);
 #endif
 
+unsigned int set_fork_delay(unsigned int v);
+
 #endif