From af43e57821c3823c4ffca9654e4d169fd4ce6573 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Thu, 5 Aug 2010 07:47:30 +0000 Subject: Merged revisions 280984 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ................ r280984 | tilghman | 2010-08-05 02:46:36 -0500 (Thu, 05 Aug 2010) | 22 lines Merged revisions 280983 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r280983 | tilghman | 2010-08-05 02:40:47 -0500 (Thu, 05 Aug 2010) | 15 lines 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/trunk@280985 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- include/asterisk/pbx.h | 8 -------- main/pbx.c | 31 ++++++++----------------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h index ac09f009b..a0ef3d476 100644 --- a/include/asterisk/pbx.h +++ b/include/asterisk/pbx.h @@ -1220,14 +1220,6 @@ struct ast_exten *pbx_find_extension(struct ast_channel *chan, 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); diff --git a/main/pbx.c b/main/pbx.c index 4216b853a..f9476fd1d 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -1164,7 +1164,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); @@ -7016,7 +7020,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(); @@ -7025,15 +7028,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(); @@ -9836,32 +9830,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); } /* -- cgit v1.2.3