struct ast_ignorepat *ip);
struct ast_sw *ast_walk_context_switches(struct ast_context *con, struct ast_sw *sw);
+/*!
+ * \note Will lock the channel.
+ */
int pbx_builtin_serialize_variables(struct ast_channel *chan, char *buf, size_t size);
+
+/*!
+ * \note Will lock the channel.
+ */
const char *pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name);
+
+/*!
+ * \note Will lock the channel.
+ */
void pbx_builtin_pushvar_helper(struct ast_channel *chan, const char *name, const char *value);
+
+/*!
+ * \note Will lock the channel.
+ */
void pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value);
+
+/*!
+ * \note Will lock the channel.
+ */
void pbx_retrieve_variable(struct ast_channel *c, const char *var, char **ret, char *workspace, int workspacelen, struct varshead *headp);
void pbx_builtin_clear_globals(void);
+
+/*!
+ * \note Will lock the channel.
+ */
int pbx_builtin_setvar(struct ast_channel *chan, void *data);
+
void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count);
void pbx_substitute_variables_varshead(struct varshead *headp, const char *cp1, char *cp2, int count);
struct varshead *places[2] = { headp, &globals }; /* list of places where we may look */
if (c) {
+ ast_channel_lock(c);
places[0] = &c->varshead;
}
/*
if (need_substring)
*ret = substring(*ret, offset, length, workspace, workspacelen);
}
+
+ if (c)
+ ast_channel_unlock(c);
}
/*! \brief CLI function to show installed custom functions
memset(buf, 0, size);
+ ast_channel_lock(chan);
+
AST_LIST_TRAVERSE(&chan->varshead, variables, entries) {
if ((var=ast_var_name(variables)) && (val=ast_var_value(variables))
/* && !ast_strlen_zero(var) && !ast_strlen_zero(val) */
break;
}
+ ast_channel_unlock(chan);
+
return total;
}
if (!name)
return NULL;
- if (chan)
+
+ if (chan) {
+ ast_channel_lock(chan);
places[0] = &chan->varshead;
+ }
for (i = 0; i < 2; i++) {
if (!places[i])
break;
}
+ if (chan)
+ ast_channel_unlock(chan);
+
return ret;
}
return;
}
- headp = (chan) ? &chan->varshead : &globals;
+ if (chan) {
+ ast_channel_lock(chan);
+ headp = &chan->varshead;
+ } else {
+ ast_mutex_lock(&globalslock);
+ headp = &globals;
+ }
if (value) {
if ((option_verbose > 1) && (headp == &globals))
ast_verbose(VERBOSE_PREFIX_2 "Setting global variable '%s' to '%s'\n", name, value);
newvariable = ast_var_assign(name, value);
- if (headp == &globals)
- ast_mutex_lock(&globalslock);
AST_LIST_INSERT_HEAD(headp, newvariable, entries);
- if (headp == &globals)
- ast_mutex_unlock(&globalslock);
}
+
+ if (chan)
+ ast_channel_unlock(chan);
+ else
+ ast_mutex_unlock(&globalslock);
}
void pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
struct varshead *headp;
const char *nametail = name;
- /* XXX may need locking on the channel ? */
if (name[strlen(name)-1] == ')') {
char *function = ast_strdupa(name);
return;
}
- headp = (chan) ? &chan->varshead : &globals;
+ if (chan) {
+ ast_channel_lock(chan);
+ headp = &chan->varshead;
+ } else {
+ ast_mutex_lock(&globalslock);
+ headp = &globals;
+ }
/* For comparison purposes, we have to strip leading underscores */
if (*nametail == '_') {
nametail++;
}
- if (headp == &globals)
- ast_mutex_lock(&globalslock);
AST_LIST_TRAVERSE (headp, newvariable, entries) {
if (strcasecmp(ast_var_name(newvariable), nametail) == 0) {
/* there is already such a variable, delete it */
AST_LIST_INSERT_HEAD(headp, newvariable, entries);
}
- if (headp == &globals)
+ if (chan)
+ ast_channel_unlock(chan);
+ else
ast_mutex_unlock(&globalslock);
}