diff --git a/main/event.c b/main/event.c index 81dd7c96ff4feb2728ff8ea94a65bff805310e2b..fad8e66ee7cbfcd84f7226c9e30b5159c1b62d5e 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) { diff --git a/tests/test_event.c b/tests/test_event.c index 5f0c1003c1ef134771b59d58a78f55d8dd2bf706..bc84b18571b00c1fa7026b242d63f9bc7afaf8d1 100644 --- a/tests/test_event.c +++ b/tests/test_event.c @@ -312,7 +312,7 @@ AST_TEST_DEFINE(event_sub_test) .expected_count = 2, }, [TEST_SUBS_CUSTOM_RAW] = { - .expected_count = 1, + .expected_count = 2, }, [TEST_SUBS_CUSTOM_UINT] = { .expected_count = 1, @@ -344,28 +344,13 @@ AST_TEST_DEFINE(event_sub_test) break; } - /* - * Subscription TEST_SUBS_ALL_STR: - * - allocate normally - * - subscribe to ALL events with a DEVICE STR IE check - */ - ast_test_status_update(test, "Adding TEST_SUBS_ALL_STR subscription\n"); - test_subs[TEST_SUBS_ALL_STR].sub = ast_event_subscribe(AST_EVENT_ALL, event_sub_cb, - test_subs_class_type_str(TEST_SUBS_ALL_STR), &test_subs[TEST_SUBS_ALL_STR].data, - AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, "FOO/bar", + ast_test_status_update(test, "Check that NO CUSTOM subscribers exist\n"); + sub_res = ast_event_check_subscriber(AST_EVENT_CUSTOM, AST_EVENT_IE_END); - if (!test_subs[TEST_SUBS_ALL_STR].sub) { - ast_test_status_update(test, "Failed to create TEST_SUBS_ALL_STR subscription\n"); - res = AST_TEST_FAIL; - goto return_cleanup; - } - - if (strcmp(ast_event_subscriber_get_description(test_subs[TEST_SUBS_ALL_STR].sub), - test_subs_class_type_str(TEST_SUBS_ALL_STR))) { - ast_test_status_update(test, - "Unexpected subscription description on TEST_SUBS_ALL_STR subscription\n"); + if (sub_res != AST_EVENT_SUB_NONE) { + ast_test_status_update(test, "CUSTOM subscriptions should not exist! (%d)\n", + sub_res); res = AST_TEST_FAIL; - goto return_cleanup; } /* @@ -392,6 +377,39 @@ AST_TEST_DEFINE(event_sub_test) goto return_cleanup; } + ast_test_status_update(test, "Check that a CUSTOM subscriber exists\n"); + sub_res = ast_event_check_subscriber(AST_EVENT_CUSTOM, + AST_EVENT_IE_END); + if (sub_res != AST_EVENT_SUB_EXISTS) { + ast_test_status_update(test, "A CUSTOM subscription should exist! (%d)\n", + sub_res); + res = AST_TEST_FAIL; + } + + /* + * Subscription TEST_SUBS_ALL_STR: + * - allocate normally + * - subscribe to ALL events with a DEVICE STR IE check + */ + ast_test_status_update(test, "Adding TEST_SUBS_ALL_STR subscription\n"); + test_subs[TEST_SUBS_ALL_STR].sub = ast_event_subscribe(AST_EVENT_ALL, event_sub_cb, + test_subs_class_type_str(TEST_SUBS_ALL_STR), &test_subs[TEST_SUBS_ALL_STR].data, + AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, "FOO/bar", + AST_EVENT_IE_END); + if (!test_subs[TEST_SUBS_ALL_STR].sub) { + ast_test_status_update(test, "Failed to create TEST_SUBS_ALL_STR subscription\n"); + res = AST_TEST_FAIL; + goto return_cleanup; + } + + if (strcmp(ast_event_subscriber_get_description(test_subs[TEST_SUBS_ALL_STR].sub), + test_subs_class_type_str(TEST_SUBS_ALL_STR))) { + ast_test_status_update(test, + "Unexpected subscription description on TEST_SUBS_ALL_STR subscription\n"); + res = AST_TEST_FAIL; + goto return_cleanup; + } + /* * Subscription TEST_SUBS_CUSTOM_RAW: * - allocate normally @@ -576,7 +594,7 @@ AST_TEST_DEFINE(event_sub_test) /* * Exercise the API call to check for existing subscriptions. */ - ast_test_status_update(test, "Checking for subscribers to events\n"); + ast_test_status_update(test, "Checking for subscribers to specific events\n"); /* Check STR matching. */ sub_res = ast_event_check_subscriber(AST_EVENT_CUSTOM, @@ -678,6 +696,31 @@ AST_TEST_DEFINE(event_sub_test) res = AST_TEST_FAIL; } + ast_test_status_update(test, "Special event posting test\n"); + + /* + * Event to check if event is even posted. + * + * Matching subscriptions: + * TEST_SUBS_CUSTOM_RAW + */ + event = ast_event_new(AST_EVENT_CUSTOM, + AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, "Mula", + AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_RAW, "FOO/bar", sizeof("FOO/bar"), + AST_EVENT_IE_END); + if (!event) { + ast_test_status_update(test, "Failed to create event\n"); + res = AST_TEST_FAIL; + goto return_cleanup; + } + if (ast_event_queue(event)) { + ast_event_destroy(event); + event = NULL; + ast_test_status_update(test, "Failed to queue event\n"); + res = AST_TEST_FAIL; + goto return_cleanup; + } + /* * Subscription TEST_SUBS_CUSTOM_ANY: * - allocate normally