chan_agent: Misc code cleanup.

* Fix off-nominal path resource cleanup in agent_request().

* Create agent_pvt_destroy() to eliminate inlined versions in many places.

* Pull invariant code out of loop in add_agent().

* Remove redundant module user references in login_exec().

* Remove unused struct agent_pvt logincallerid[] member.
........

Merged revisions 378456 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 378457 from http://svn.asterisk.org/svn/asterisk/branches/11


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@378458 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Richard Mudgett 2013-01-03 18:47:29 +00:00
parent 11571714fe
commit da7c2e3ffe
1 changed files with 48 additions and 52 deletions

View File

@ -272,12 +272,11 @@ struct agent_pvt {
int app_lock_flag;
ast_cond_t app_complete_cond;
ast_cond_t login_wait_cond;
volatile int app_sleep_cond; /**< Sleep condition for the login app */
struct ast_channel *owner; /**< Agent */
char logincallerid[80]; /**< Caller ID they had when they logged in */
struct ast_channel *chan; /**< Channel we use */
unsigned int flags; /**< Flags show if settings were applied with channel vars */
AST_LIST_ENTRY(agent_pvt) list; /**< Next Agent in the linked list. */
int app_sleep_cond; /*!< Non-zero if the login app should sleep. */
struct ast_channel *owner; /*!< Agent */
struct ast_channel *chan; /*!< Channel we use */
unsigned int flags; /*!< Flags show if settings were applied with channel vars */
AST_LIST_ENTRY(agent_pvt) list;/*!< Next Agent in the linked list. */
};
#define DATA_EXPORT_AGENT(MEMBER) \
@ -288,8 +287,7 @@ struct agent_pvt {
MEMBER(agent_pvt, acknowledged, AST_DATA_BOOLEAN) \
MEMBER(agent_pvt, name, AST_DATA_STRING) \
MEMBER(agent_pvt, password, AST_DATA_PASSWORD) \
MEMBER(agent_pvt, acceptdtmf, AST_DATA_CHARACTER) \
MEMBER(agent_pvt, logincallerid, AST_DATA_STRING)
MEMBER(agent_pvt, acceptdtmf, AST_DATA_CHARACTER)
AST_DATA_STRUCTURE(agent_pvt, DATA_EXPORT_AGENT);
@ -410,6 +408,22 @@ static struct ast_channel *agent_lock_owner(struct agent_pvt *pvt)
}
}
/*!
* \internal
* \brief Destroy an agent pvt struct.
*
* \param doomed Agent pvt to destroy.
*
* \return Nothing
*/
static void agent_pvt_destroy(struct agent_pvt *doomed)
{
ast_mutex_destroy(&doomed->lock);
ast_cond_destroy(&doomed->app_complete_cond);
ast_cond_destroy(&doomed->login_wait_cond);
ast_free(doomed);
}
/*!
* Adds an agent to the global list of agents.
*
@ -455,11 +469,16 @@ static struct agent_pvt *add_agent(const char *agent, int pending)
name = args.name;
while (*name && *name < 33) name++;
}
/* Are we searching for the agent here ? To see if it exists already ? */
AST_LIST_TRAVERSE(&agents, p, list) {
if (!pending && !strcmp(p->agent, agt))
break;
if (!pending) {
/* Are we searching for the agent here ? To see if it exists already ? */
AST_LIST_TRAVERSE(&agents, p, list) {
if (!strcmp(p->agent, agt)) {
break;
}
}
} else {
p = NULL;
}
if (!p) {
// Build the agent.
@ -541,18 +560,13 @@ static int agent_cleanup(struct agent_pvt *p)
}
if (p->dead) {
ast_mutex_unlock(&p->lock);
ast_mutex_destroy(&p->lock);
ast_cond_destroy(&p->app_complete_cond);
ast_cond_destroy(&p->login_wait_cond);
ast_free(p);
agent_pvt_destroy(p);
} else {
ast_mutex_unlock(&p->lock);
}
return 0;
}
static int check_availability(struct agent_pvt *newlyavailable, int needlock);
static int agent_answer(struct ast_channel *ast)
{
ast_log(LOG_WARNING, "Huh? Agent is being asked to answer?\n");
@ -709,8 +723,7 @@ static struct ast_frame *agent_read(struct ast_channel *ast)
if (p->chan && !ast_channel_internal_bridged_channel(p->chan)) {
if (strcasecmp(ast_channel_tech(p->chan)->type, "Local")) {
ast_channel_internal_bridged_channel_set(p->chan, ast);
if (p->chan)
ast_debug(1, "Bridge on '%s' being set to '%s' (3)\n", ast_channel_name(p->chan), ast_channel_name(ast_channel_internal_bridged_channel(p->chan)));
ast_debug(1, "Bridge on '%s' being set to '%s' (3)\n", ast_channel_name(p->chan), ast_channel_name(ast_channel_internal_bridged_channel(p->chan)));
}
}
ast_mutex_unlock(&p->lock);
@ -894,7 +907,6 @@ static int agent_call(struct ast_channel *ast, const char *dest, int timeout)
agent_start_monitoring(ast, 0);
p->acknowledged = 1;
}
res = 0;
}
CLEANUP(ast, p);
ast_mutex_unlock(&p->lock);
@ -906,7 +918,7 @@ static int agent_call(struct ast_channel *ast, const char *dest, int timeout)
/*! \brief return the channel or base channel if one exists. This function assumes the channel it is called on is already locked */
struct ast_channel* agent_get_base_channel(struct ast_channel *chan)
{
struct agent_pvt *p = NULL;
struct agent_pvt *p;
struct ast_channel *base = chan;
/* chan is locked by the calling function */
@ -967,10 +979,7 @@ static int agent_hangup(struct ast_channel *ast)
*/
ast_debug(1, "Hangup called for state %s\n", ast_state2str(ast_channel_state(ast)));
if (p->start && (ast_channel_state(ast) != AST_STATE_UP)) {
p->start = 0;
} else
p->start = 0;
p->start = 0;
if (p->chan) {
ast_channel_internal_bridged_channel_set(p->chan, NULL);
/* If they're dead, go ahead and hang up on the agent now */
@ -991,9 +1000,7 @@ static int agent_hangup(struct ast_channel *ast)
}
/* Only register a device state change if the agent is still logged in */
if (!p->loginstart) {
p->logincallerid[0] = '\0';
} else {
if (p->loginstart) {
ast_devstate_changed(AST_DEVICE_NOT_INUSE, AST_DEVSTATE_CACHABLE, "Agent/%s", p->agent);
}
@ -1002,10 +1009,7 @@ static int agent_hangup(struct ast_channel *ast)
kill it later */
p->abouttograb = 0;
} else if (p->dead) {
ast_mutex_destroy(&p->lock);
ast_cond_destroy(&p->app_complete_cond);
ast_cond_destroy(&p->login_wait_cond);
ast_free(p);
agent_pvt_destroy(p);
} else {
if (p->chan) {
/* Not dead -- check availability now */
@ -1298,10 +1302,7 @@ static int read_agent_config(int reload)
/* Destroy if appropriate */
if (!p->owner) {
if (!p->chan) {
ast_mutex_destroy(&p->lock);
ast_cond_destroy(&p->app_complete_cond);
ast_cond_destroy(&p->login_wait_cond);
ast_free(p);
agent_pvt_destroy(p);
} else {
/* Cause them to hang up */
ast_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT);
@ -1467,10 +1468,14 @@ static struct ast_channel *agent_request(const char *type, struct ast_format_cap
if (hasagent) {
ast_debug(1, "Creating place holder for '%s'\n", s);
p = add_agent(data, 1);
p->group = groupmatch;
chan = agent_new(p, AST_STATE_DOWN, requestor ? ast_channel_linkedid(requestor) : NULL, callid);
if (!chan)
ast_log(LOG_WARNING, "Weird... Fix this to drop the unused pending agent\n");
if (p) {
p->group = groupmatch;
chan = agent_new(p, AST_STATE_DOWN, requestor ? ast_channel_linkedid(requestor) : NULL, callid);
if (!chan) {
AST_LIST_REMOVE(&agents, p, list);
agent_pvt_destroy(p);
}
}
} else {
ast_debug(1, "Not creating place holder for '%s' since nobody logged in\n", s);
}
@ -1924,7 +1929,6 @@ static int login_exec(struct ast_channel *chan, const char *data)
int tries = 0;
int max_login_tries = maxlogintries;
struct agent_pvt *p;
struct ast_module_user *u;
char user[AST_MAX_AGENT] = "";
char pass[AST_MAX_AGENT];
char agent[AST_MAX_AGENT] = "";
@ -1942,8 +1946,6 @@ static int login_exec(struct ast_channel *chan, const char *data)
int update_cdr = updatecdr;
char *filename = "agent-loginok";
u = ast_module_user_add(chan);
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
@ -2075,7 +2077,6 @@ static int login_exec(struct ast_channel *chan, const char *data)
long logintime;
snprintf(agent, sizeof(agent), "Agent/%s", p->agent);
p->logincallerid[0] = '\0';
p->acknowledged = 0;
ast_mutex_unlock(&p->lock);
@ -2236,10 +2237,7 @@ static int login_exec(struct ast_channel *chan, const char *data)
/* If there is no owner, go ahead and kill it now */
ast_devstate_changed(AST_DEVICE_UNAVAILABLE, AST_DEVSTATE_CACHABLE, "Agent/%s", p->agent);
if (p->dead && !p->owner) {
ast_mutex_destroy(&p->lock);
ast_cond_destroy(&p->app_complete_cond);
ast_cond_destroy(&p->login_wait_cond);
ast_free(p);
agent_pvt_destroy(p);
}
}
else {
@ -2269,8 +2267,6 @@ static int login_exec(struct ast_channel *chan, const char *data)
if (!res)
res = ast_safe_sleep(chan, 500);
ast_module_user_remove(u);
return -1;
}