Module: sip-router
Branch: master
Commit: 7b3a6eca7bb6dd1ca2a1395ca1e5821808ec85cd
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7b3a6eca7bb6dd1ca2a1395ca1e5821808ec85cd

Author: Andrei Pelinescu-Onciul <[email protected]>
Committer: Andrei Pelinescu-Onciul <[email protected]>
Date:   Tue Apr 12 21:54:07 2011 +0200

core: pkg mem size configurable form the cmd line

The pkg mem size used can be configured by using the "-M"
parameter on the command line, e.g.:
ser -M 8  -f test.cfg # start ser with 8mb of pkg memory
The default remains 4Mb.

---

 globals.h |    1 +
 main.c    |   83 ++++++++++++++++++++++++++++++++++++++++++++----------------
 mem/mem.c |   36 +++++++++++++++++++++-----
 mem/mem.h |    3 +-
 4 files changed, 93 insertions(+), 30 deletions(-)

diff --git a/globals.h b/globals.h
index 40f7214..8b3a81d 100644
--- a/globals.h
+++ b/globals.h
@@ -150,6 +150,7 @@ extern int cfg_warnings;
 extern unsigned int msg_no;
 
 extern unsigned long shm_mem_size;
+extern unsigned long pkg_mem_size;
 
 /* AVP configuration */
 extern char *avp_db_url;  /* db url used by user preferences (AVPs) */
diff --git a/main.c b/main.c
index fcc25ae..d525fb4 100644
--- a/main.c
+++ b/main.c
@@ -245,6 +245,7 @@ Options:\n\
     -b nr        Maximum receive buffer size which will not be exceeded by\n\
                   auto-probing procedure even if  OS allows\n\
     -m nr        Size of shared memory allocated in Megabytes\n\
+    -M nr        Size of private memory allocated, in Megabytes\n\
     -w dir       Change the working directory to \"dir\" (default: \"/\")\n\
     -t dir       Chroot to \"dir\"\n\
     -u uid       Change uid \n\
@@ -273,7 +274,7 @@ void print_ct_constants()
 #endif
 */
        printf("MAX_RECV_BUFFER_SIZE %d, MAX_LISTEN %d,"
-                       " MAX_URI_SIZE %d, BUF_SIZE %d, PKG_SIZE %uMB\n",
+                       " MAX_URI_SIZE %d, BUF_SIZE %d, DEFAULT PKG_SIZE 
%uMB\n",
                MAX_RECV_BUFFER_SIZE, MAX_LISTEN, MAX_URI_SIZE,
                BUF_SIZE, PKG_MEM_SIZE);
 #ifdef USE_TCP
@@ -488,6 +489,8 @@ int cfg_warnings=0;
 
 /* shared memory (in MB) */
 unsigned long shm_mem_size=0;
+/* private (pkg) memory (in MB) */
+unsigned long pkg_mem_size=0;
 
 /* export command-line to anywhere else */
 int my_argc;
@@ -590,6 +593,7 @@ void cleanup(show_status)
        destroy_lock_ops();
        if (pid_file) unlink(pid_file);
        if (pgid_file) unlink(pgid_file);
+       destroy_pkg_mallocs();
 }
 
 
@@ -1750,7 +1754,52 @@ int main(int argc, char** argv)
        dont_fork_cnt=0;
 
        daemon_status_init();
-       /*init pkg mallocs (before parsing cfg or cmd line !)*/
+       /* command line options */
+       options=  ":f:cm:M:dVhEb:l:L:n:vrRDTN:W:w:t:u:g:P:G:SQ:O:a:A:"
+#ifdef STATS
+               "s:"
+#endif
+       ;
+       /* Handle special command line arguments, that must be treated before
+        * intializing the various subsystem or before parsing other arguments:
+        *  - get the startup debug and log_stderr values
+        *  - look if pkg mem size is overriden on the command line (-M) and get
+        *    the new value here (before intializing pkg_mem).
+        *  - look if there is a -h, e.g. -f -h construction won't be caught
+        *    later
+        */
+       opterr = 0;
+       while((c=getopt(argc,argv,options))!=-1) {
+               switch(c) {
+                       case 'd':
+                                       debug_flag = 1;
+                                       default_core_cfg.debug++;
+                                       break;
+                       case 'E':
+                                       log_stderr=1;
+                                       break;
+                       case 'M':
+                                       pkg_mem_size=strtol(optarg, &tmp, 10) * 
1024 * 1024;
+                                       if (tmp &&(*tmp)){
+                                               fprintf(stderr, "bad private 
mem size number: -M %s\n",
+                                                                               
        optarg);
+                                               goto error;
+                                       };
+                                       break;
+                       default:
+                                       if (c == 'h' || (optarg && 
strcmp(optarg, "-h") == 0)) {
+                                               printf("version: %s\n", 
full_version);
+                                               printf("%s",help_msg);
+                                               exit(0);
+                                       }
+                                       break;
+               }
+       }
+       
+       /*init pkg mallocs (before parsing cfg or the rest of the cmd line !)*/
+       if (pkg_mem_size)
+               LOG(L_INFO, " private (per process) memory: %ld bytes\n",
+                                                               pkg_mem_size );
        if (init_pkg_mallocs()==-1)
                goto error;
 
@@ -1759,11 +1808,6 @@ int main(int argc, char** argv)
                "DBG_MSG_QA enabled, ser may exit abruptly\n");
 #endif
 
-       options=  ":f:cm:dVhEb:l:L:n:vrRDTN:W:w:t:u:g:P:G:SQ:O:a:A:"
-#ifdef STATS
-               "s:"
-#endif
-       ;
        /* init counters / stats */
        if (init_counters() == -1)
                goto error;
@@ -1773,16 +1817,6 @@ int main(int argc, char** argv)
 #ifdef USE_SCTP
        init_sctp_options(); /* set defaults before the config */
 #endif
-       /* look if there is a -h, e.g. -f -h construction won't catch it later 
*/
-       opterr = 0;
-       while((c=getopt(argc,argv,options))!=-1) {
-               if (c == 'h' || (optarg && strcmp(optarg, "-h") == 0)) {
-                       printf("version: %s\n", full_version);
-                       printf("%s",help_msg);
-                       exit(0);
-                       break;
-               }
-       }
        /* process command line (cfg. file path etc) */
        optind = 1;  /* reset getopt */
        /* switches required before script processing */
@@ -1808,9 +1842,12 @@ int main(int argc, char** argv)
                                        LOG(L_INFO, "ser: shared memory: %ld 
bytes\n",
                                                                        
shm_mem_size );
                                        break;
+                       case 'M':
+                                       /* ignore it, it was parsed immediately 
after startup,
+                                          the pkg mem. is already initialized 
at this point */
+                                       break;
                        case 'd':
-                                       debug_flag = 1;
-                                       default_core_cfg.debug++;
+                                       /* ignore it, was parsed immediately 
after startup */
                                        break;
                        case 'V':
                                        printf("version: %s\n", full_version);
@@ -1829,7 +1866,7 @@ int main(int argc, char** argv)
                                        exit(0);
                                        break;
                        case 'E':
-                                       log_stderr=1;
+                                       /* ignore it, was parsed immediately 
after startup */
                                        break;
                        case 'O':
                                        scr_opt_lev=strtol(optarg, &tmp, 10);
@@ -1974,6 +2011,7 @@ try_again:
                        case 'f':
                        case 'c':
                        case 'm':
+                       case 'M':
                        case 'd':
                        case 'V':
                        case 'h':
@@ -1981,7 +2019,8 @@ try_again:
                        case 'A':
                                        break;
                        case 'E':
-                                       log_stderr=1;   // use in both getopt 
switches
+                                       log_stderr=1;   /* use in both getopt 
switches,
+                                                                          
takes priority over config */
                                        break;
                        case 'b':
                                        maxbuffer=strtol(optarg, &tmp, 10);
@@ -2322,7 +2361,7 @@ try_again:
        }
 
        if (disable_core_dump) set_core_dump(0, 0);
-       else set_core_dump(1, shm_mem_size+PKG_MEM_POOL_SIZE+4*1024*1024);
+       else set_core_dump(1, shm_mem_size+pkg_mem_size+4*1024*1024);
        if (open_files_limit>0){
                if(increase_open_fds(open_files_limit)<0){
                        fprintf(stderr, "ERROR: error could not increase file 
limits\n");
diff --git a/mem/mem.c b/mem/mem.c
index a2f1b9a..1180a2a 100644
--- a/mem/mem.c
+++ b/mem/mem.c
@@ -26,6 +26,7 @@
 
 
 #include <stdio.h>
+#include <stdlib.h>
 #include "../config.h"
 #include "../dprint.h"
 #include "../globals.h"
@@ -41,15 +42,15 @@
 
 #ifdef PKG_MALLOC
        #ifndef DL_MALLOC
-       char mem_pool[PKG_MEM_POOL_SIZE];
+       char* mem_pool = 0;
        #endif
 
        #ifdef F_MALLOC
-               struct fm_block* mem_block;
+               struct fm_block* mem_block = 0;
        #elif defined DL_MALLOC
                /* don't need this */
        #else
-               struct qm_block* mem_block;
+               struct qm_block* mem_block = 0;
        #endif
 #endif
 
@@ -58,18 +59,25 @@ int init_pkg_mallocs()
 {
 #ifdef PKG_MALLOC
        /*init mem*/
+       #ifndef DL_MALLOC
+               if (pkg_mem_size == 0)
+                       pkg_mem_size = PKG_MEM_POOL_SIZE;
+               mem_pool = malloc(pkg_mem_size);
+       #endif
        #ifdef F_MALLOC
-               mem_block=fm_malloc_init(mem_pool, PKG_MEM_POOL_SIZE);
+               if (mem_pool)
+                       mem_block=fm_malloc_init(mem_pool, pkg_mem_size);
        #elif DL_MALLOC
                /* don't need this */
        #else
-               mem_block=qm_malloc_init(mem_pool, PKG_MEM_POOL_SIZE);
+               if (mem_pool)
+                       mem_block=qm_malloc_init(mem_pool, pkg_mem_size);
        #endif
        #ifndef DL_MALLOC
        if (mem_block==0){
                LOG(L_CRIT, "could not initialize memory pool\n");
-               fprintf(stderr, "Too much pkg memory demanded: %d\n",
-                       PKG_MEM_POOL_SIZE );
+               fprintf(stderr, "Too much pkg memory demanded: %ld bytes\n",
+                                               pkg_mem_size);
                return -1;
        }
        #endif
@@ -79,6 +87,20 @@ int init_pkg_mallocs()
 
 
 
+void destroy_pkg_mallocs()
+{
+#ifdef PKG_MALLOC
+       #ifndef DL_MALLOC
+               if (mem_pool) {
+                       free(mem_pool);
+                       mem_pool = 0;
+               }
+       #endif
+#endif /* PKG_MALLOC */
+}
+
+
+
 int init_shm_mallocs(int force_alloc)
 {
 #ifdef SHM_MEM
diff --git a/mem/mem.h b/mem/mem.h
index aed1442..510698a 100644
--- a/mem/mem.h
+++ b/mem/mem.h
@@ -58,7 +58,7 @@
                extern struct qm_block* mem_block;
 #      endif
 
-       extern char mem_pool[PKG_MEM_POOL_SIZE];
+       extern char* mem_pool;
 
 
 #      ifdef DBG_QM_MALLOC
@@ -133,6 +133,7 @@
 #endif
 
 int init_pkg_mallocs();
+void destroy_pkg_mallocs();
 int init_shm_mallocs(int force_alloc);
 
 /*! generic logging helper for allocation errors in private memory pool/ 
system */


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to