int shm_mem_init(int force_alloc) { int ret; long sz; long* p; long* end; ret=shm_getmem(); if (ret<0) return ret; if (force_alloc){ sz=sysconf(_SC_PAGESIZE); DBG("shm_mem_init: %ld bytes/page\n", sz); if ((sz<sizeof(*p)) || (_ROUND_LONG(sz)!=sz)){ LOG(L_WARN, "shm_mem_init: invalid page size %ld, using 4096\n", sz); sz=4096; /* invalid page size, use 4096 */ } end=shm_mempool+shm_mem_size-sizeof(*p); /* touch one word in every page */ for(p=(long*)_ROUND_LONG((long)shm_mempool); p<=end; p=(long*)((char*)p+sz)) *p=0; } return shm_mem_init_mallocs(shm_mempool, shm_mem_size); }
int shm_mem_init(void) { int ret; ret=shm_getmem(); if (ret<0) return ret; return shm_mem_init_mallocs(shm_mempool, shm_mem_size); }
int shm_mem_init(void) { int ret; LM_INFO("allocating SHM block\n"); ret = shm_getmem(); if (ret < 0) return ret; return shm_mem_init_mallocs(shm_mempool, shm_mem_size); }
int shm_getmem(void) { #ifdef SHM_MMAP #ifndef USE_ANON_MMAP int fd; #endif #else struct shmid_ds shm_info; #endif #ifdef SHM_MMAP if (_shm_core_pool && (_shm_core_pool!=(void*)-1)){ #else if ((_shm_core_shmid!=-1)||(_shm_core_pool!=(void*)-1)){ #endif LOG(L_CRIT, "shm already initialized\n"); return -1; } #ifdef SHM_MMAP #ifdef USE_ANON_MMAP _shm_core_pool=mmap(0, shm_mem_size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1 ,0); #else fd=open("/dev/zero", O_RDWR); if (fd==-1){ LOG(L_CRIT, "could not open /dev/zero: %s\n", strerror(errno)); return -1; } _shm_core_pool=mmap(0, shm_mem_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd ,0); /* close /dev/zero */ close(fd); #endif /* USE_ANON_MMAP */ #else _shm_core_shmid=shmget(IPC_PRIVATE, shm_mem_size , 0700); if (_shm_core_shmid==-1){ LOG(L_CRIT, "could not allocate shared memory" " segment: %s\n", strerror(errno)); return -1; } _shm_core_pool=shmat(_shm_core_shmid, 0, 0); #endif if (_shm_core_pool==(void*)-1){ LOG(L_CRIT, "could not attach shared memory" " segment: %s\n", strerror(errno)); /* destroy segment*/ shm_core_destroy(); return -1; } return 0; } /** * */ void* shm_core_get_pool(void) { int ret; long sz; long* p; long* end; ret=shm_getmem(); if (ret<0) return NULL; if (shm_force_alloc){ sz=sysconf(_SC_PAGESIZE); DBG("%ld bytes/page\n", sz); if ((sz<sizeof(*p)) || (_ROUND_LONG(sz)!=sz)){ LOG(L_WARN, "invalid page size %ld, using 4096\n", sz); sz=4096; /* invalid page size, use 4096 */ } end=_shm_core_pool+shm_mem_size-sizeof(*p); /* touch one word in every page */ for(p=(long*)_ROUND_LONG((long)_shm_core_pool); p<=end; p=(long*)((char*)p+sz)) *p=0; } return _shm_core_pool; }