|
@@ -497,6 +497,12 @@ char* pid_file = 0; /* filename as asked by use */
|
|
|
char* pgid_file = 0;
|
|
|
|
|
|
|
|
|
+/* memory manager */
|
|
|
+#define SR_MEMMNG_DEFAULT "fm"
|
|
|
+
|
|
|
+char *sr_memmng_pkg = NULL;
|
|
|
+char *sr_memmng_shm = NULL;
|
|
|
+
|
|
|
/* call it before exiting; if show_status==1, mem status is displayed */
|
|
|
void cleanup(show_status)
|
|
|
{
|
|
@@ -504,7 +510,7 @@ void cleanup(show_status)
|
|
|
|
|
|
/*clean-up*/
|
|
|
#ifndef SHM_SAFE_MALLOC
|
|
|
- if (mem_lock)
|
|
|
+ if (_shm_lock)
|
|
|
shm_unlock(); /* hack: force-unlock the shared memory lock in case
|
|
|
some process crashed and let it locked; this will
|
|
|
allow an almost gracious shutdown */
|
|
@@ -571,12 +577,12 @@ void cleanup(show_status)
|
|
|
}
|
|
|
}
|
|
|
/* zero all shmem alloc vars that we still use */
|
|
|
- shm_mem_destroy();
|
|
|
+ shm_destroy_manager();
|
|
|
#endif
|
|
|
destroy_lock_ops();
|
|
|
if (pid_file) unlink(pid_file);
|
|
|
if (pgid_file) unlink(pgid_file);
|
|
|
- destroy_pkg_mallocs();
|
|
|
+ pkg_destroy_manager();
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1807,7 +1813,7 @@ int main(int argc, char** argv)
|
|
|
dprint_init_colors();
|
|
|
|
|
|
/* command line options */
|
|
|
- options= ":f:cm:M:dVIhEeb:l:L:n:vKrRDTN:W:w:t:u:g:P:G:SQ:O:a:A:"
|
|
|
+ options= ":f:cm:M:dVIhEeb:l:L:n:vKrRDTN:W:w:t:u:g:P:G:SQ:O:a:A:x:X:"
|
|
|
#ifdef STATS
|
|
|
"s:"
|
|
|
#endif
|
|
@@ -1841,6 +1847,12 @@ int main(int argc, char** argv)
|
|
|
goto error;
|
|
|
};
|
|
|
break;
|
|
|
+ case 'x':
|
|
|
+ sr_memmng_shm = optarg;
|
|
|
+ break;
|
|
|
+ case 'X':
|
|
|
+ sr_memmng_pkg = optarg;
|
|
|
+ break;
|
|
|
default:
|
|
|
if (c == 'h' || (optarg && strcmp(optarg, "-h") == 0)) {
|
|
|
printf("version: %s\n", full_version);
|
|
@@ -1850,11 +1862,26 @@ int main(int argc, char** argv)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ if(sr_memmng_pkg==NULL) {
|
|
|
+ if(sr_memmng_shm!=NULL) {
|
|
|
+ sr_memmng_pkg = sr_memmng_shm;
|
|
|
+ } else {
|
|
|
+ sr_memmng_pkg = SR_MEMMNG_DEFAULT;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(sr_memmng_shm==NULL) {
|
|
|
+ sr_memmng_shm = SR_MEMMNG_DEFAULT;
|
|
|
+ }
|
|
|
+ shm_set_mname(sr_memmng_shm);
|
|
|
+ if (pkg_mem_size == 0) {
|
|
|
+ pkg_mem_size = PKG_MEM_POOL_SIZE;
|
|
|
+ }
|
|
|
+
|
|
|
/*init pkg mallocs (before parsing cfg or the rest of the cmd line !)*/
|
|
|
if (pkg_mem_size)
|
|
|
LM_INFO("private (per process) memory: %ld bytes\n", pkg_mem_size );
|
|
|
- if (init_pkg_mallocs()==-1)
|
|
|
+ if (pkg_init_manager(sr_memmng_pkg)<0)
|
|
|
goto error;
|
|
|
|
|
|
#ifdef DBG_MSG_QA
|
|
@@ -1873,6 +1900,11 @@ int main(int argc, char** argv)
|
|
|
/* switches required before script processing */
|
|
|
while((c=getopt(argc,argv,options))!=-1) {
|
|
|
switch(c) {
|
|
|
+ case 'M':
|
|
|
+ case 'x':
|
|
|
+ case 'X':
|
|
|
+ /* ignore, they were parsed immediately after startup */
|
|
|
+ break;
|
|
|
case 'f':
|
|
|
cfg_file=optarg;
|
|
|
break;
|
|
@@ -1893,10 +1925,6 @@ int main(int argc, char** argv)
|
|
|
};
|
|
|
LM_INFO("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':
|
|
|
/* ignore it, was parsed immediately after startup */
|
|
|
break;
|
|
@@ -1997,6 +2025,9 @@ int main(int argc, char** argv)
|
|
|
abort();
|
|
|
}
|
|
|
}
|
|
|
+ if (shm_mem_size == 0) {
|
|
|
+ shm_mem_size = SHM_MEM_POOL_SIZE;
|
|
|
+ }
|
|
|
|
|
|
if (endianness_sanity_check() != 0){
|
|
|
fprintf(stderr, "BUG: endianness sanity tests failed\n");
|
|
@@ -2357,6 +2388,8 @@ try_again:
|
|
|
if (!shm_initialized() && init_shm()<0)
|
|
|
goto error;
|
|
|
#endif /* SHM_MEM */
|
|
|
+ pkg_print_manager();
|
|
|
+ shm_print_manager();
|
|
|
if (init_atomic_ops()==-1)
|
|
|
goto error;
|
|
|
if (init_basex() != 0){
|