Example #1
0
void destroy_vars(void)
{
	destroy_vars_list(script_vars);
}
Example #2
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;
}