Beispiel #1
0
int init_shvars(void)
{
	script_var_t *lit = 0;
	sh_var_t *sit = 0;
	pv_spec_list_t *pvi = 0;
	pv_spec_list_t *pvi0 = 0;

	if(shvar_init_locks()!=0)
		return -1;

	LM_DBG("moving shvars in share memory\n");
	for(lit=sh_local_vars; lit; lit=lit->next)
	{
		sit = (sh_var_t*)shm_malloc(sizeof(sh_var_t));
		if(sit==0)
		{
			LM_ERR("out of sh mem\n");
			return -1;
		}
		memset(sit, 0, sizeof(sh_var_t));
		sit->name.s = (char*)shm_malloc((lit->name.len+1)*sizeof(char));

		if(sit->name.s==0)
		{
			LM_ERR("out of pkg mem!\n");
			shm_free(sit);
			return -1;
		}
		sit->name.len = lit->name.len;
		strncpy(sit->name.s, lit->name.s, lit->name.len);
		sit->name.s[sit->name.len] = '\0';

		if(sh_vars!=0)
			sit->n = sh_vars->n + 1;
		else
			sit->n = 1;

#ifdef GEN_LOCK_T_PREFERED
		sit->lock = &shvar_locks->locks[sit->n%shvar_locks_no];
#else
		sit->lockidx = sit->n%shvar_locks_no;
#endif

		if(set_shvar_value(sit, &lit->v.value, lit->v.flags)==NULL)
		{
			shm_free(sit->name.s);
			shm_free(sit);
			return -1;
		}

		pvi0 = 0;
		pvi = sh_pv_list;
		while(pvi!=NULL)
		{
			if(pvi->spec->pvp.pvn.u.dname == lit)
			{
				pvi->spec->pvp.pvn.u.dname = (void*)sit;
				if(pvi0!=NULL)
				{
					pvi0->next = pvi->next;
					pkg_free(pvi);
					pvi = pvi0->next;
				} else {
					sh_pv_list = pvi->next;
					pkg_free(pvi);
					pvi = sh_pv_list;
				}
			} else {
				pvi0 = pvi;
				pvi = pvi->next;
			}
		}

		sit->next = sh_vars;
		sh_vars = sit;
	}
	destroy_vars_list(sh_local_vars);
	if(sh_pv_list != NULL)
	{
		LM_ERR("sh_pv_list not null!\n");
		return -1;
	}
	shvar_initialized = 1;
	return 0;
}
Beispiel #2
0
sh_var_t* add_shvar(str *name)
{
	sh_var_t *sit;

	if(name==0 || name->s==0 || name->len<=0)
		return 0;

	if(!shm_initialized())
	{
		LM_ERR("shm not initialized - cannot define shm now\n");
		return 0;
	}

	if(shvar_init_locks()!=0)
	{
		LM_ERR("cannot init shv locks\n");
		return 0;
	}

	for(sit=sh_vars; sit; sit=sit->next)
	{
		if(sit->name.len==name->len
				&& strncmp(name->s, sit->name.s, name->len)==0)
			return sit;
	}
	sit = (sh_var_t*)shm_malloc(sizeof(sh_var_t));
	if(sit==0)
	{
		LM_ERR("out of shm\n");
		return 0;
	}
	memset(sit, 0, sizeof(sh_var_t));
	sit->name.s = (char*)shm_malloc((name->len+1)*sizeof(char));

	if(sit->name.s==0)
	{
		LM_ERR("out of shm!\n");
		shm_free(sit);
		return 0;
	}
	sit->name.len = name->len;
	strncpy(sit->name.s, name->s, name->len);
	sit->name.s[sit->name.len] = '\0';

	if(sh_vars!=0)
		sit->n = sh_vars->n + 1;
	else
		sit->n = 1;

#ifdef GEN_LOCK_T_PREFERED
	sit->lock = &shvar_locks->locks[sit->n%shvar_locks_no];
#else
	sit->lockidx = sit->n%shvar_locks_no;
#endif

	sit->next = sh_vars;

	sh_vars = sit;

	return sit;
}