]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 280982 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Thu, 5 Aug 2010 07:40:47 +0000 (07:40 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Thu, 5 Aug 2010 07:40:47 +0000 (07:40 +0000)
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

include/asterisk/pbx.h
main/pbx.c

index e35cb9650a2c54b3251fd108b518b65ef4eea4d9..4f2d6facb20bf6ffed9b93da7efa414f3a9a037a 100644 (file)
@@ -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);
index 505abf382d06ecfbb67e6d6ef115e868267d4665..aac9bb5d47019dd7de7570f656e19b41a755758c 100644 (file)
@@ -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);
 }
 
 /*