[sr-dev] git:master: core: added mem_summary config option

Andrei Pelinescu-Onciul andrei at iptel.org
Tue Sep 29 19:04:05 CEST 2009


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

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date:   Tue Sep 29 13:32:48 2009 +0200

core: added mem_summary config option

- added mem_summary which controls  the memory debugging info
  logged on exit or on SIGUSR1.  Its value is a combination of
  flags: 0 - off, 1 - dump all used memory blocks and some
  statistics (lots of output), 2 - dump a summary of the used
  memory blocks (works only if compiled with DBG_QM_MALLOC or
  DBG_F_MALLOC).
  The default value is 1 (same behaviour as older versions).

- fix: don't call the memory status/summary functions if
  memlog > debug level (since nothing will be logged anyway).

---

 NEWS       |    7 +++++++
 cfg.lex    |    2 ++
 cfg.y      |    3 +++
 cfg_core.c |    6 +++++-
 cfg_core.h |    1 +
 main.c     |   57 +++++++++++++++++++++++++++++++++++++++++++++------------
 6 files changed, 63 insertions(+), 13 deletions(-)

diff --git a/NEWS b/NEWS
index 7cd7fff..3cd2de4 100644
--- a/NEWS
+++ b/NEWS
@@ -72,6 +72,13 @@ new config variables:
   - max_while_loops - maximum iterations allowed for a while  (can be changed
        at runtime). Default 100.
   - log_name - set the application name used when printing to syslog.
+  - mem_summary - memory debugging info logged on exit or on SIGUSR1.
+       The value is a combination of flags: 0 - off,
+       1 - dump all used memory blocks and some statistics (lots of output),
+       2 - dump a summary of the used memory blocks (works only if
+           compiled with DBG_QM_MALLOC or DBG_F_MALLOC).
+       Default: 1.
+       Can be changed at runtime.
 
 new script commands:
   add_local_rport() - adds the rport parameter to the added via header
diff --git a/cfg.lex b/cfg.lex
index bedf79c..8490364 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -353,6 +353,7 @@ PHONE2TEL	phone2tel
 SYN_BRANCH syn_branch
 MEMLOG		"memlog"|"mem_log"
 MEMDBG		"memdbg"|"mem_dbg"
+MEMSUM		"mem_summary"
 SIP_WARNING sip_warning
 SERVER_SIGNATURE server_signature
 SERVER_HEADER server_header
@@ -688,6 +689,7 @@ EAT_ABLE	[\ \t\b\r]
 <INITIAL>{SYN_BRANCH}	{ count(); yylval.strval=yytext; return SYN_BRANCH; }
 <INITIAL>{MEMLOG}	{ count(); yylval.strval=yytext; return MEMLOG; }
 <INITIAL>{MEMDBG}	{ count(); yylval.strval=yytext; return MEMDBG; }
+<INITIAL>{MEMSUM}	{ count(); yylval.strval=yytext; return MEMSUM; }
 <INITIAL>{SIP_WARNING}	{ count(); yylval.strval=yytext; return SIP_WARNING; }
 <INITIAL>{USER}		{ count(); yylval.strval=yytext; return USER; }
 <INITIAL>{GROUP}	{ count(); yylval.strval=yytext; return GROUP; }
diff --git a/cfg.y b/cfg.y
index fe8cbf2..ff56515 100644
--- a/cfg.y
+++ b/cfg.y
@@ -408,6 +408,7 @@ extern char *finame;
 %token SYN_BRANCH
 %token MEMLOG
 %token MEMDBG
+%token MEMSUM
 %token SIP_WARNING
 %token SERVER_SIGNATURE
 %token SERVER_HEADER
@@ -863,6 +864,8 @@ assign_stm:
 	| MEMLOG EQUAL error { yyerror("int value expected"); }
 	| MEMDBG EQUAL intno { memdbg=$3; }
 	| MEMDBG EQUAL error { yyerror("int value expected"); }
+	| MEMSUM EQUAL intno { default_core_cfg.mem_summary=$3; }
+	| MEMSUM EQUAL error { yyerror("int value expected"); }
 	| SIP_WARNING EQUAL NUMBER { sip_warning=$3; }
 	| SIP_WARNING EQUAL error { yyerror("boolean value expected"); }
 	| USER EQUAL STRING     { user=$3; }
diff --git a/cfg_core.c b/cfg_core.c
index 778a4dd..ce0ae50 100644
--- a/cfg_core.c
+++ b/cfg_core.c
@@ -92,7 +92,8 @@ struct cfg_group_core default_core_cfg = {
 	DEFAULT_MAX_WHILE_LOOPS, /* max_while_loops */
 	0, /* udp_mtu (disabled by default) */
 	0, /* udp_mtu_try_proto -> default disabled */
-	0  /* force_rport */ 
+	0,  /* force_rport */
+	1 /* mem_summary -flags: 0 off, 1 shm/pkg_status, 2 shm/pkg_sums */
 };
 
 void	*core_cfg = &default_core_cfg;
@@ -191,5 +192,8 @@ cfg_def_t core_cfg_def[] = {
 		"if send size > udp_mtu use proto (1 udp, 2 tcp, 3 tls, 4 sctp)"},
 	{"force_rport",     CFG_VAR_INT, 0, 1,  0, fix_global_req_flags,
 		"force rport for all the received messages" },
+	{"mem_summary",	CFG_VAR_INT|CFG_ATOMIC,	0, 3, 0, 0,
+		"memory debugging information displayed on exit (flags): "
+		" 0 - off, 1 - dump all used blocks, 2 - summary of used blocks" },
 	{0, 0, 0, 0, 0, 0}
 };
diff --git a/cfg_core.h b/cfg_core.h
index 4f493ef..dd5d7af 100644
--- a/cfg_core.h
+++ b/cfg_core.h
@@ -89,6 +89,7 @@ struct cfg_group_core {
 	int udp_mtu; /**< maximum send size for udp, if > try another protocol*/
 	int udp_mtu_try_proto; /**< if packet> udp_mtu, try proto (e.g. TCP) */
 	int force_rport; /**< if set rport will always be forced*/
+	int mem_summary; /**< display memory status/summary info on exit */
 };
 
 extern struct cfg_group_core default_core_cfg;
diff --git a/main.c b/main.c
index 6d85a57..0965051 100644
--- a/main.c
+++ b/main.c
@@ -529,21 +529,29 @@ void cleanup(show_status)
 	destroy_routes();
 	destroy_atomic_ops();
 #ifdef PKG_MALLOC
-	if (show_status){
-		LOG(memlog, "Memory status (pkg):\n");
-		pkg_status();
-		LOG(memlog, "Memory still-in-use summary (pkg):\n");
-		pkg_sums();
+	if (show_status && memlog <= cfg_get(core, core_cfg, debug)){
+		if (cfg_get(core, core_cfg, mem_summary) & 1) {
+			LOG(memlog, "Memory status (pkg):\n");
+			pkg_status();
+		}
+		if (cfg_get(core, core_cfg, mem_summary) & 2) {
+			LOG(memlog, "Memory still-in-use summary (pkg):\n");
+			pkg_sums();
+		}
 	}
 #endif
 #ifdef SHM_MEM
 	if (pt) shm_free(pt);
 	pt=0;
-	if (show_status){
+	if (show_status && memlog <= cfg_get(core, core_cfg, debug)){
+		if (cfg_get(core, core_cfg, mem_summary) & 1) {
 			LOG(memlog, "Memory status (shm):\n");
 			shm_status();
+		}
+		if (cfg_get(core, core_cfg, mem_summary) & 2) {
 			LOG(memlog, "Memory still-in-use summary (shm):\n");
 			shm_sums();
+		}
 	}
 	/* zero all shmem alloc vars that we still use */
 	shm_mem_destroy();
@@ -664,12 +672,28 @@ void handle_sigs()
 			dump_all_statistic();
 #endif
 #ifdef PKG_MALLOC
-			LOG(memlog, "Memory status (pkg):\n");
-			pkg_status();
+		if (memlog <= cfg_get(core, core_cfg, debug)){
+			if (cfg_get(core, core_cfg, mem_summary) & 1) {
+				LOG(memlog, "Memory status (pkg):\n");
+				pkg_status();
+			}
+			if (cfg_get(core, core_cfg, mem_summary) & 2) {
+				LOG(memlog, "Memory still-in-use summary (pkg):\n");
+				pkg_sums();
+			}
+		}
 #endif
 #ifdef SHM_MEM
-			LOG(memlog, "Memory status (shm):\n");
-			shm_status();
+		if (memlog <= cfg_get(core, core_cfg, debug)){
+			if (cfg_get(core, core_cfg, mem_summary) & 1) {
+				LOG(memlog, "Memory status (shm):\n");
+				shm_status();
+			}
+			if (cfg_get(core, core_cfg, mem_summary) & 2) {
+				LOG(memlog, "Memory still-in-use summary (shm):\n");
+				shm_sums();
+			}
+		}
 #endif
 			break;
 
@@ -747,8 +771,17 @@ void sig_usr(int signo)
 					LOG(L_INFO, "INFO: signal %d received\n", signo);
 					/* print memory stats for non-main too */
 					#ifdef PKG_MALLOC
-					LOG(memlog, "Memory status (pkg):\n");
-					pkg_status();
+					if (memlog <= cfg_get(core, core_cfg, debug)){
+						if (cfg_get(core, core_cfg, mem_summary) & 1) {
+							LOG(memlog, "Memory status (pkg):\n");
+							pkg_status();
+						}
+						if (cfg_get(core, core_cfg, mem_summary) & 2) {
+							LOG(memlog, "Memory still-in-use summary (pkg):"
+									"\n");
+							pkg_sums();
+						}
+					}
 					#endif
 #endif
 					_exit(0);




More information about the sr-dev mailing list