Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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;
}