From 9a19763a38bcd4b3d2a4a44b1099a0837a5fc2d4 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 15 Jun 2011 16:43:18 +0000 Subject: [PATCH] [regression] Voicemail MWI is no longer sent. 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 | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/main/event.c b/main/event.c index 81dd7c96ff..fad8e66ee7 100644 --- a/main/event.c +++ b/main/event.c @@ -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) { -- 2.47.2