]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
[regression] Voicemail MWI is no longer sent.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 15 Jun 2011 16:43:18 +0000 (16:43 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 15 Jun 2011 16:43:18 +0000 (16:43 +0000)
When leaving a voicemail, the MWI message is never sent.  The same thing
happens when checking a voicemail and marking it as read.

If you restart Asterisk, everything comes up at that state correctly, but
changes to the messages in voicemail causes the light to not be set
appropriately.  Very easy to reproduce.

* Made ast_event_check_subscriber() return TRUE if there are ANY
subscribers to an event type when there are no restricting ie values
passed.  This allows an event being queued to be queued.

(closes issue ASTERISK-18002)
Reported by: lmadsen
Tested by: lmadsen, irroot
Patches:
     jira_asterisk_18002_v1.8.patch uploaded by rmudgett (License #5621)

(closes issue ASTERISK-18019)

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@323669 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/event.c

index 81dd7c96ff4feb2728ff8ea94a65bff805310e2b..fad8e66ee7cbfcd84f7226c9e30b5159c1b62d5e 100644 (file)
@@ -444,12 +444,14 @@ enum ast_event_subscriber_res ast_event_check_subscriber(enum ast_event_type typ
        };
        const enum ast_event_type event_types[] = { type, AST_EVENT_ALL };
        int i;
+       int want_specific_event;/* TRUE if looking for subscribers wanting specific parameters. */
 
        if (type >= AST_EVENT_TOTAL) {
                ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
                return res;
        }
 
+       want_specific_event = 0;
        va_start(ap, type);
        for (ie_type = va_arg(ap, enum ast_event_ie_type);
                ie_type != AST_EVENT_IE_END;
@@ -492,6 +494,7 @@ enum ast_event_subscriber_res ast_event_check_subscriber(enum ast_event_type typ
                }
 
                if (insert) {
+                       want_specific_event = 1;
                        AST_LIST_INSERT_TAIL(&check_ie_vals.ie_vals, ie_value, entry);
                } else {
                        ast_log(LOG_WARNING, "Unsupported PLTYPE(%d)\n", ie_value->ie_pltype);
@@ -501,17 +504,22 @@ enum ast_event_subscriber_res ast_event_check_subscriber(enum ast_event_type typ
 
        for (i = 0; i < ARRAY_LEN(event_types); i++) {
                AST_RWDLLIST_RDLOCK(&ast_event_subs[event_types[i]]);
-               AST_RWDLLIST_TRAVERSE(&ast_event_subs[event_types[i]], sub, entry) {
-                       AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
-                               if (!match_sub_ie_val_to_event(ie_val, &check_ie_vals)) {
-                                       /* The current subscription ie did not match an event ie. */
+               if (want_specific_event) {
+                       AST_RWDLLIST_TRAVERSE(&ast_event_subs[event_types[i]], sub, entry) {
+                               AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
+                                       if (!match_sub_ie_val_to_event(ie_val, &check_ie_vals)) {
+                                               /* The current subscription ie did not match an event ie. */
+                                               break;
+                                       }
+                               }
+                               if (!ie_val) {
+                                       /* Everything matched.  A subscriber is looking for this event. */
                                        break;
                                }
                        }
-                       if (!ie_val) {
-                               /* Everything matched.  A subscriber is looking for this event. */
-                               break;
-                       }
+               } else {
+                       /* Just looking to see if there are ANY subscribers to the event type. */
+                       sub = AST_RWLIST_FIRST(&ast_event_subs[event_types[i]]);
                }
                AST_RWDLLIST_UNLOCK(&ast_event_subs[event_types[i]]);
                if (sub) {