Merged revisions 280982 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r280982 | tilghman | 2010-08-05 02:28:33 -0500 (Thu, 05 Aug 2010) | 8 lines
  
  Change context lock back to a mutex, because functionality depends upon the lock being recursive.
  
  (closes issue #17643)
   Reported by: zerohalo
   Patches: 
         20100726__issue17643.diff.txt uploaded by tilghman (license 14)
   Tested by: zerohalo
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@280983 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.2
Tilghman Lesher 16 years ago
parent 81a24c617b
commit 5da0ea7b8e

@ -1109,20 +1109,12 @@ struct pbx_find_info {
const char *data; /* set on return */
const char *foundcontext; /* set on return */
};
struct ast_exten *pbx_find_extension(struct ast_channel *chan,
struct ast_context *bypass, struct pbx_find_info *q,
const char *context, const char *exten, int priority,
const char *label, const char *callerid, enum ext_match_t action);
/* every time a write lock is obtained for contexts,
a counter is incremented. You can check this via the
following func */
int ast_wrlock_contexts_version(void);
/*!\brief hashtable functions for contexts */
/*! @{ */
int ast_hashtab_compare_contexts(const void *ah_a, const void *ah_b);

@ -1119,7 +1119,11 @@ static struct pbx_builtin {
static struct ast_context *contexts;
static struct ast_hashtab *contexts_table = NULL;
AST_RWLOCK_DEFINE_STATIC(conlock); /*!< Lock for the ast_context list */
/*!\brief Lock for the ast_context list
* This lock MUST be recursive, or a deadlock on reload may result. See
* https://issues.asterisk.org/view.php?id=17643
*/
AST_MUTEX_DEFINE_STATIC(conlock);
static AST_RWLIST_HEAD_STATIC(apps, ast_app);
@ -6655,7 +6659,6 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
*/
struct timeval begintime, writelocktime, endlocktime, enddeltime;
int wrlock_ver;
begintime = ast_tvnow();
ast_rdlock_contexts();
@ -6664,15 +6667,6 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
context_merge(extcontexts, exttable, tmp, registrar);
}
ast_hashtab_end_traversal(iter);
wrlock_ver = ast_wrlock_contexts_version();
ast_unlock_contexts(); /* this feels real retarded, but you must do
what you must do If this isn't done, the following
wrlock is a guraranteed deadlock */
ast_wrlock_contexts();
if (ast_wrlock_contexts_version() > wrlock_ver+1) {
ast_log(LOG_WARNING,"==================!!!!!!!!!!!!!!!Something changed the contexts in the middle of merging contexts!\n");
}
AST_RWLIST_WRLOCK(&hints);
writelocktime = ast_tvnow();
@ -9344,32 +9338,23 @@ int load_pbx(void)
return 0;
}
static int conlock_wrlock_version = 0;
int ast_wrlock_contexts_version(void)
{
return conlock_wrlock_version;
}
/*
* Lock context list functions ...
*/
int ast_wrlock_contexts()
{
int res = ast_rwlock_wrlock(&conlock);
if (!res)
ast_atomic_fetchadd_int(&conlock_wrlock_version, 1);
return res;
return ast_mutex_lock(&conlock);
}
int ast_rdlock_contexts()
{
return ast_rwlock_rdlock(&conlock);
return ast_mutex_lock(&conlock);
}
int ast_unlock_contexts()
{
return ast_rwlock_unlock(&conlock);
return ast_mutex_unlock(&conlock);
}
/*

Loading…
Cancel
Save