[asterisk-commits] russell: branch russell/event_performance r183909 - in /team/russell/event_pe...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Mar 24 07:36:17 CDT 2009
Author: russell
Date: Tue Mar 24 07:36:12 2009
New Revision: 183909
URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=183909
Log:
implement get_cached
Modified:
team/russell/event_performance/channels/chan_dahdi.c
team/russell/event_performance/channels/chan_iax2.c
team/russell/event_performance/channels/chan_mgcp.c
team/russell/event_performance/channels/chan_sip.c
team/russell/event_performance/channels/chan_skinny.c
team/russell/event_performance/channels/chan_unistim.c
team/russell/event_performance/main/event.c
Modified: team/russell/event_performance/channels/chan_dahdi.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/channels/chan_dahdi.c?view=diff&rev=183909&r1=183908&r2=183909
==============================================================================
--- team/russell/event_performance/channels/chan_dahdi.c (original)
+++ team/russell/event_performance/channels/chan_dahdi.c Tue Mar 24 07:36:12 2009
@@ -2359,7 +2359,6 @@
event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
- AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
if (event) {
Modified: team/russell/event_performance/channels/chan_iax2.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/channels/chan_iax2.c?view=diff&rev=183909&r1=183908&r2=183909
==============================================================================
--- team/russell/event_performance/channels/chan_iax2.c (original)
+++ team/russell/event_performance/channels/chan_iax2.c Tue Mar 24 07:36:12 2009
@@ -7226,8 +7226,6 @@
event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
- AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
- AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
if (event) {
new = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS);
Modified: team/russell/event_performance/channels/chan_mgcp.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/channels/chan_mgcp.c?view=diff&rev=183909&r1=183908&r2=183909
==============================================================================
--- team/russell/event_performance/channels/chan_mgcp.c (original)
+++ team/russell/event_performance/channels/chan_mgcp.c Tue Mar 24 07:36:12 2009
@@ -472,7 +472,6 @@
event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, cntx,
- AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
if (event) {
Modified: team/russell/event_performance/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/channels/chan_sip.c?view=diff&rev=183909&r1=183908&r2=183909
==============================================================================
--- team/russell/event_performance/channels/chan_sip.c (original)
+++ team/russell/event_performance/channels/chan_sip.c Tue Mar 24 07:36:12 2009
@@ -20107,8 +20107,6 @@
event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox->mailbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, S_OR(mailbox->context, "default"),
- AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
- AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
if (!event)
continue;
Modified: team/russell/event_performance/channels/chan_skinny.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/channels/chan_skinny.c?view=diff&rev=183909&r1=183908&r2=183909
==============================================================================
--- team/russell/event_performance/channels/chan_skinny.c (original)
+++ team/russell/event_performance/channels/chan_skinny.c Tue Mar 24 07:36:12 2009
@@ -2322,7 +2322,6 @@
event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
- AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
if (event) {
Modified: team/russell/event_performance/channels/chan_unistim.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/channels/chan_unistim.c?view=diff&rev=183909&r1=183908&r2=183909
==============================================================================
--- team/russell/event_performance/channels/chan_unistim.c (original)
+++ team/russell/event_performance/channels/chan_unistim.c Tue Mar 24 07:36:12 2009
@@ -4391,7 +4391,6 @@
event = ast_event_get_cached(AST_EVENT_MWI,
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
- AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
AST_EVENT_IE_END);
if (event) {
Modified: team/russell/event_performance/main/event.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/main/event.c?view=diff&rev=183909&r1=183908&r2=183909
==============================================================================
--- team/russell/event_performance/main/event.c (original)
+++ team/russell/event_performance/main/event.c Tue Mar 24 07:36:12 2009
@@ -117,8 +117,6 @@
* The event subscribers are indexed by which event they are subscribed to */
static AST_RWDLLIST_HEAD(ast_event_sub_list, ast_event_sub) ast_event_subs[AST_EVENT_TOTAL];
-static struct ao2_container *ast_event_cache[AST_EVENT_TOTAL];
-
#ifdef LOW_MEMORY
#define NUM_CACHE_BUCKETS 17
#else
@@ -135,10 +133,11 @@
/*!
* \brief Event types that are kept in the cache.
*/
-static const struct {
+static struct {
+ struct ao2_container *container;
ao2_hash_fn *hash_fn;
enum ast_event_ie_type cache_args[MAX_CACHE_ARGS];
-} cached_event_types[AST_EVENT_TOTAL] = {
+} ast_event_cache[AST_EVENT_TOTAL] = {
[AST_EVENT_MWI] = {
.hash_fn = ast_event_hash_mwi,
.cache_args = { AST_EVENT_IE_MAILBOX, AST_EVENT_IE_CONTEXT },
@@ -959,12 +958,24 @@
va_list ap;
enum ast_event_ie_type ie_type;
struct ast_event *dup_event = NULL;
- //struct ast_event_ref *event_ref;
- struct ast_event_ie_val *cache_arg;
- AST_LIST_HEAD_NOLOCK_STATIC(cache_args, ast_event_ie_val);
+ struct ast_event_ref *cached_event_ref;
+ struct ast_event *cache_arg_event;
+ struct ast_event_ref tmp_event_ref = {
+ .event = NULL,
+ };
+ struct ao2_container *container = NULL;
if (type >= AST_EVENT_TOTAL) {
ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
+ return NULL;
+ }
+
+ if (!(container = ast_event_cache[type].container)) {
+ ast_log(LOG_ERROR, "%u is not a cached event type\n", type);
+ return NULL;
+ }
+
+ if (!(cache_arg_event = ast_event_new(type, AST_EVENT_IE_END))) {
return NULL;
}
@@ -973,46 +984,45 @@
ie_type != AST_EVENT_IE_END;
ie_type = va_arg(ap, enum ast_event_type))
{
- cache_arg = alloca(sizeof(*cache_arg));
- memset(cache_arg, 0, sizeof(*cache_arg));
- cache_arg->ie_type = ie_type;
- cache_arg->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
- if (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
- cache_arg->payload.uint = va_arg(ap, uint32_t);
- else if (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
- cache_arg->payload.str = ast_strdupa(va_arg(ap, const char *));
- else if (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_RAW) {
+ enum ast_event_ie_pltype ie_pltype;
+
+ ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
+
+ switch (ie_pltype) {
+ case AST_EVENT_IE_PLTYPE_UINT:
+ ast_event_append_ie_uint(&cache_arg_event, ie_type, va_arg(ap, uint32_t));
+ break;
+ case AST_EVENT_IE_PLTYPE_STR:
+ ast_event_append_ie_str(&cache_arg_event, ie_type, va_arg(ap, const char *));
+ break;
+ case AST_EVENT_IE_PLTYPE_RAW:
+ {
void *data = va_arg(ap, void *);
size_t datalen = va_arg(ap, size_t);
- cache_arg->payload.raw = alloca(datalen);
- memcpy(cache_arg->payload.raw, data, datalen);
- cache_arg->raw_datalen = datalen;
- }
- AST_LIST_INSERT_TAIL(&cache_args, cache_arg, entry);
+ ast_event_append_ie_raw(&cache_arg_event, ie_type, data, datalen);
+ }
+ case AST_EVENT_IE_PLTYPE_EXISTS:
+ ast_log(LOG_WARNING, "PLTYPE_EXISTS not supported by this function\n");
+ break;
+ case AST_EVENT_IE_PLTYPE_UNKNOWN:
+ break;
+ }
}
va_end(ap);
- if (AST_LIST_EMPTY(&cache_args)) {
- ast_log(LOG_ERROR, "Events can not be retrieved from the cache without "
- "specifying at least one IE type!\n");
- return NULL;
- }
-#if 0
- AST_RWLIST_RDLOCK(&ast_event_cache[type]);
- AST_RWLIST_TRAVERSE_SAFE_BEGIN(&ast_event_cache[type], event_ref, entry) {
- AST_LIST_TRAVERSE(&cache_args, cache_arg, entry) {
- if (!match_ie_val(event_ref->event, cache_arg, NULL))
- break;
- }
- if (!cache_arg) {
- /* All parameters were matched on this cache entry, so return it */
- dup_event = ast_event_dup(event_ref->event);
- break;
- }
- }
- AST_RWLIST_TRAVERSE_SAFE_END
- AST_RWLIST_UNLOCK(&ast_event_cache[type]);
-#endif
+ tmp_event_ref.event = cache_arg_event;
+
+ cached_event_ref = ao2_callback(container, OBJ_POINTER, ast_event_cmp, &tmp_event_ref);
+
+ ast_event_destroy(cache_arg_event);
+ cache_arg_event = NULL;
+
+ if (cached_event_ref) {
+ dup_event = ast_event_dup(cached_event_ref->event);
+ ao2_ref(cached_event_ref, -1);
+ cached_event_ref = NULL;
+ }
+
return dup_event;
}
@@ -1038,7 +1048,7 @@
event_ref->event = dup_event;
- ao2_link(ast_event_cache[ast_event_get_type(event)], event_ref);
+ ao2_link(ast_event_cache[ast_event_get_type(event)].container, event_ref);
ao2_ref(event_ref, -1);
@@ -1052,7 +1062,7 @@
.event = event,
};
- if (!(container = ast_event_cache[ast_event_get_type(event)])) {
+ if (!(container = ast_event_cache[ast_event_get_type(event)].container)) {
ast_log(LOG_WARNING, "cache requested for non-cached event type\n");
goto queue_event;
}
@@ -1163,7 +1173,7 @@
event_ref = obj;
event = event_ref->event;
- if (!(hash_fn = cached_event_types[ast_event_get_type(event)].hash_fn)) {
+ if (!(hash_fn = ast_event_cache[ast_event_get_type(event)].hash_fn)) {
return 0;
}
@@ -1184,9 +1194,9 @@
event_ref2 = arg;
event2 = event_ref2->event;
- cache_args = cached_event_types[ast_event_get_type(event)].cache_args;
-
- for (i = 0; i < ARRAY_LEN(cached_event_types[0].cache_args) && cache_args[i]; i++) {
+ cache_args = ast_event_cache[ast_event_get_type(event)].cache_args;
+
+ for (i = 0; i < ARRAY_LEN(ast_event_cache[0].cache_args) && cache_args[i]; i++) {
struct ast_event_ie_val ie_val = {
.ie_type = cache_args[i],
};
@@ -1209,12 +1219,12 @@
}
for (i = 0; i < AST_EVENT_TOTAL; i++) {
- if (!cached_event_types[i].hash_fn) {
+ if (!ast_event_cache[i].hash_fn) {
/* This event type is not cached. */
continue;
}
- if (!(ast_event_cache[i] = ao2_container_alloc(NUM_CACHE_BUCKETS,
+ if (!(ast_event_cache[i].container = ao2_container_alloc(NUM_CACHE_BUCKETS,
ast_event_hash, ast_event_cmp))) {
return -1;
}
More information about the asterisk-commits
mailing list