[asterisk-commits] murf: branch murf/newcdr r62340 - in /team/murf/newcdr: apps/ build_tools/ ce...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Sat Apr 28 23:01:08 MST 2007


Author: murf
Date: Sun Apr 29 01:01:07 2007
New Revision: 62340

URL: http://svn.digium.com/view/asterisk?view=rev&rev=62340
Log:
Got things to compile again after the conflicts were completely (I hope) resolved

Modified:
    team/murf/newcdr/apps/app_voicemail.c
    team/murf/newcdr/build_tools/prep_moduledeps
    team/murf/newcdr/cel/cel_csv.c
    team/murf/newcdr/cel/cel_custom.c
    team/murf/newcdr/cel/cel_manager.c
    team/murf/newcdr/channels/chan_iax2.c
    team/murf/newcdr/channels/chan_mgcp.c
    team/murf/newcdr/channels/chan_sip.c
    team/murf/newcdr/channels/chan_zap.c
    team/murf/newcdr/include/asterisk/cel.h
    team/murf/newcdr/include/asterisk/event.h
    team/murf/newcdr/include/asterisk/event_defs.h
    team/murf/newcdr/main/cel.c
    team/murf/newcdr/main/event.c

Modified: team/murf/newcdr/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/apps/app_voicemail.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/apps/app_voicemail.c (original)
+++ team/murf/newcdr/apps/app_voicemail.c Sun Apr 29 01:01:07 2007
@@ -7461,11 +7461,11 @@
 {
 	pthread_attr_t attr;
 
-	mwi_sub_sub = ast_event_subscribe(AST_EVENT_SUB, mwi_sub_event_cb, NULL,
+	mwi_sub_sub = ast_event_subscribe(AST_EVENT_SUB, mwi_sub_event_cb, "Voicemail MWI subscription", NULL,
 		AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_MWI,
 		AST_EVENT_IE_END);
 
-	mwi_unsub_sub = ast_event_subscribe(AST_EVENT_UNSUB, mwi_unsub_event_cb, NULL,
+	mwi_unsub_sub = ast_event_subscribe(AST_EVENT_UNSUB, mwi_unsub_event_cb, "Voicemail MWI subscription", NULL,
 		AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, AST_EVENT_MWI,
 		AST_EVENT_IE_END);
 

Modified: team/murf/newcdr/build_tools/prep_moduledeps
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/build_tools/prep_moduledeps?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/build_tools/prep_moduledeps (original)
+++ team/murf/newcdr/build_tools/prep_moduledeps Sun Apr 29 01:01:07 2007
@@ -34,6 +34,7 @@
 rm -f .makeoptstmp
 process_dir apps app APPS Applications
 process_dir cdr cdr CDR "Call Detail Recording"
+process_dir cel cel CEL "Channel Event Logging"
 process_dir channels chan CHANNELS "Channel Drivers"
 process_dir codecs codec CODECS "Codec Translators"
 process_dir formats format FORMATS "Format Interpreters"

Modified: team/murf/newcdr/cel/cel_csv.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/cel/cel_csv.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/cel/cel_csv.c (original)
+++ team/murf/newcdr/cel/cel_csv.c Sun Apr 29 01:01:07 2007
@@ -264,12 +264,12 @@
 	/* Make sure we have a big enough buf */
 	char buf[1024];
 	char csvmaster[PATH_MAX];
-	const struct ast_channel *chan;
+	struct ast_channel *chan;
 	enum ast_cel_eventtype eventtype;
 	const char *userdefname = 0;
 	time_t eventtime = 0;
 	
-	chan = ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
+	chan = (struct ast_channel *)ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
 	eventtype = (enum ast_cel_eventtype)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TYPE);
 	eventtime = (time_t)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TIME);
 	if (eventtype == CEL_USER_DEFINED)

Modified: team/murf/newcdr/cel/cel_custom.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/cel/cel_custom.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/cel/cel_custom.c (original)
+++ team/murf/newcdr/cel/cel_custom.c Sun Apr 29 01:01:07 2007
@@ -107,7 +107,7 @@
 {
 	/* Make sure we have a big enough buf */
 	char buf[2048];
-	const struct ast_channel *chan;
+	struct ast_channel *chan;
 	enum ast_cel_eventtype eventtype;
 	const char *userdefname = 0;
 	time_t eventtime = 0;
@@ -116,7 +116,7 @@
 	if (ast_strlen_zero(master))
 		return;
 
-	chan = ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
+	chan = (struct ast_channel *)ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
 	eventtype = (enum ast_cel_eventtype)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TYPE);
 	eventtime = (time_t)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TIME);
 	if (eventtype == CEL_USER_DEFINED)

Modified: team/murf/newcdr/cel/cel_manager.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/cel/cel_manager.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/cel/cel_manager.c (original)
+++ team/murf/newcdr/cel/cel_manager.c Sun Apr 29 01:01:07 2007
@@ -90,7 +90,7 @@
 	time_t t;
 	struct tm timeresult;
 	char strStartTime[80] = "";
-	const struct ast_channel *chan;
+	struct ast_channel *chan;
 	enum ast_cel_eventtype eventtype;
 	const char *userdefname = 0;
 	time_t eventtime = 0;
@@ -98,7 +98,7 @@
 	if (!enablecel)
 		return;
 
-	chan = ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
+	chan = (struct ast_channel *)ast_event_get_ie_raw(event, AST_EVENT_IE_CHANPTR);
 	eventtype = (enum ast_cel_eventtype)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TYPE);
 	eventtime = (time_t)ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TIME);
 	if (eventtype == CEL_USER_DEFINED)

Modified: team/murf/newcdr/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_iax2.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_iax2.c (original)
+++ team/murf/newcdr/channels/chan_iax2.c Sun Apr 29 01:01:07 2007
@@ -8808,7 +8808,7 @@
 		ast_free_ha(oldha);
 
 	if (!ast_strlen_zero(peer->mailbox)) {
-		peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
+		peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "IAX MWI subscription", NULL,
 			AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, peer->mailbox,
 			AST_EVENT_IE_END);
 	}

Modified: team/murf/newcdr/channels/chan_mgcp.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_mgcp.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_mgcp.c (original)
+++ team/murf/newcdr/channels/chan_mgcp.c Sun Apr 29 01:01:07 2007
@@ -3765,7 +3765,7 @@
 					ast_copy_string(e->musicclass, musicclass, sizeof(e->musicclass));
 					ast_copy_string(e->mailbox, mailbox, sizeof(e->mailbox));
 					if (!ast_strlen_zero(e->mailbox)) {
-						e->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
+						e->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "MGCP MWI subscription", NULL,
 							AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, e->mailbox,
 							AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
 							AST_EVENT_IE_END);

Modified: team/murf/newcdr/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_sip.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_sip.c (original)
+++ team/murf/newcdr/channels/chan_sip.c Sun Apr 29 01:01:07 2007
@@ -15240,7 +15240,7 @@
 
 		p->subscribed = MWI_NOTIFICATION;
 		if (ast_test_flag(&authpeer->flags[1], SIP_PAGE2_SUBSCRIBEMWIONLY)) {
-			authpeer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, authpeer,
+			authpeer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "SIP MWI subscription", authpeer,
 				AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, authpeer->mailbox,
 				AST_EVENT_IE_END);
 		}
@@ -16934,7 +16934,7 @@
 	 * subscribe to it now. */
 	if (!ast_test_flag(&peer->flags[1], SIP_PAGE2_SUBSCRIBEMWIONLY) && 
 		!ast_strlen_zero(peer->mailbox)) {
-		peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, peer,
+		peer->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "SIP MWI subscription", peer,
 			AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, peer->mailbox,
 			AST_EVENT_IE_END);
 		/* Send MWI from the event cache only.  This is so we can send initial

Modified: team/murf/newcdr/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/channels/chan_zap.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/channels/chan_zap.c (original)
+++ team/murf/newcdr/channels/chan_zap.c Sun Apr 29 01:01:07 2007
@@ -7899,7 +7899,7 @@
 		ast_copy_string(tmp->cid_name, conf.chan.cid_name, sizeof(tmp->cid_name));
 		ast_copy_string(tmp->mailbox, conf.chan.mailbox, sizeof(tmp->mailbox));
 		if (!ast_strlen_zero(tmp->mailbox)) {
-			tmp->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
+			tmp->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, "Zaptel MWI subscription", NULL,
 				AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, tmp->mailbox,
 				AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
 				AST_EVENT_IE_END);

Modified: team/murf/newcdr/include/asterisk/cel.h
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/include/asterisk/cel.h?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/include/asterisk/cel.h (original)
+++ team/murf/newcdr/include/asterisk/cel.h Sun Apr 29 01:01:07 2007
@@ -104,7 +104,7 @@
 int ast_cel_setvar(struct ast_channel *chan, const char *name, const char *value);
 
 
-void cel_set_backend_channel_vars(const struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime);
+void cel_set_backend_channel_vars(struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime);
 
 /*! Frees the cel struct */
 void ast_cel_destroy(struct ast_cel *cel);

Modified: team/murf/newcdr/include/asterisk/event.h
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/include/asterisk/event.h?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/include/asterisk/event.h (original)
+++ team/murf/newcdr/include/asterisk/event.h Sun Apr 29 01:01:07 2007
@@ -103,7 +103,7 @@
  * pointer to the peer.
  */
 struct ast_event_sub *ast_event_subscribe(enum ast_event_type event_type, 
-										  ast_event_cb_t cb, char *description, void *userdata, ...);
+       ast_event_cb_t cb, char *description, void *userdata, ...);
 
 /*!
  * \brief Un-subscribe from events

Modified: team/murf/newcdr/include/asterisk/event_defs.h
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/include/asterisk/event_defs.h?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/include/asterisk/event_defs.h (original)
+++ team/murf/newcdr/include/asterisk/event_defs.h Sun Apr 29 01:01:07 2007
@@ -1,4 +1,3 @@
-<<<<<<< .working
 /*
  * Asterisk -- An open source telephony toolkit.
  *
@@ -147,125 +146,3 @@
 struct ast_event_sub;
 
 #endif /* AST_EVENT_DEFS_H */
-=======
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2007, Digium, Inc.
- *
- * Russell Bryant <russell at digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
-
-/*!
- * \file
- * \author Russell Bryant <russell at digium.com>
- * \brief Generic event system
- */
-
-#ifndef AST_EVENT_DEFS_H
-#define AST_EVENT_DEFS_H
-
-/*! \brief Event types
- * \note These values can *never* change. */
-enum ast_event_type {
-	/*! Reserved to provide the ability to subscribe to all events.  A specific
-	    event should never have a payload of 0. */
-	AST_EVENT_ALL    = 0x00,
-	/*! This event type is reserved for use by third-party modules to create
-	    custom events without having to modify this file. 
-	    \note There are no "custom" IE types, because IEs only have to be
-	    unique to the event itself, not necessarily across all events. */
-	AST_EVENT_CUSTOM = 0x01,
-	/*! Voicemail message waiting indication */
-	AST_EVENT_MWI    = 0x02,
-	/*! Someone has subscribed to events */
-	AST_EVENT_SUB    = 0x03,
-	/*! Someone has unsubscribed from events */
-	AST_EVENT_UNSUB  = 0x04,
-	/*! Number of event types.  This should be the last event type + 1 */
-	AST_EVENT_TOTAL  = 0x05,
-};
-
-/*! \brief Event Information Element types */
-enum ast_event_ie_type {
-	/*! Used to terminate the arguments to event functions */
-	AST_EVENT_IE_END       = -1,
-
-	/*! 
-	 * \brief Number of new messages
-	 * Used by: AST_EVENT_MWI 
-	 * Payload type: UINT
-	 */
-	AST_EVENT_IE_NEWMSGS   = 0x01,
-	/*! 
-	 * \brief Number of
-	 * Used by: AST_EVENT_MWI 
-	 * Payload type: UINT
-	 */
-	AST_EVENT_IE_OLDMSGS   = 0x02,
-	/*! 
-	 * \brief Mailbox name (mailbox[@context])
-	 * Used by: AST_EVENT_MWI 
-	 * Payload type: STR
-	 */
-	AST_EVENT_IE_MAILBOX   = 0x03,
-	/*! 
-	 * \brief Unique ID
-	 * Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
-	 * Payload type: UINT
-	 */
-	AST_EVENT_IE_UNIQUEID  = 0x04,
-	/*! 
-	 * \brief Event type 
-	 * Used by: AST_EVENT_SUB, AST_EVENT_UNSUB
-	 * Payload type: UINT
-	 */
-	AST_EVENT_IE_EVENTTYPE = 0x05,
-	/*!
-	 * \brief Hint that someone cares than an IE exists
-	 * Used by: AST_EVENT_SUB
-	 * Payload type: UINT (ast_event_ie_type)
-	 */
-	AST_EVENT_IE_EXISTS    = 0x06,
-};
-
-/*!
- * \brief Payload types for event information elements
- */
-enum ast_event_ie_pltype {
-	/*! Just check if it exists, not the value */
-	AST_EVENT_IE_PLTYPE_EXISTS,
-	/*! Unsigned Integer (Can be used for signed, too ...) */
-	AST_EVENT_IE_PLTYPE_UINT,
-	/*! String */
-	AST_EVENT_IE_PLTYPE_STR,
-};
-
-/*!
- * \brief Results for checking for subscribers
- *
- * \ref ast_event_check_subscriber()
- */
-enum ast_event_subscriber_res {
-	/*! No subscribers exist */
-	AST_EVENT_SUB_NONE,
-	/*! At least one subscriber exists */
-	AST_EVENT_SUB_EXISTS,
-};
-
-struct ast_event;
-struct ast_event_ie;
-struct ast_event_sub;
-
-#endif /* AST_EVENT_DEFS_H */
->>>>>>> .merge-right.r62300

Modified: team/murf/newcdr/main/cel.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/main/cel.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/main/cel.c (original)
+++ team/murf/newcdr/main/cel.c Sun Apr 29 01:01:07 2007
@@ -337,7 +337,7 @@
 		*ret = workspace;
 }
 
-void cel_set_backend_channel_vars(const struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime)
+void cel_set_backend_channel_vars(struct ast_channel *chan, enum ast_cel_eventtype eventtype, const char *usereventname, time_t eventtime)
 {
 	/* set the eventtime, eventtype fields */
 

Modified: team/murf/newcdr/main/event.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/main/event.c?view=diff&rev=62340&r1=62339&r2=62340
==============================================================================
--- team/murf/newcdr/main/event.c (original)
+++ team/murf/newcdr/main/event.c Sun Apr 29 01:01:07 2007
@@ -807,779 +807,3 @@
 		ast_pthread_create_background(&dont_care, NULL, ast_event_dispatcher, NULL);
 	}
 }
-=======
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2007, Digium, Inc.
- *
- * Russell Bryant <russell at digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2. See the LICENSE file
- * at the top of the source tree.
- */
-
-/*! \file
- *
- * \brief Internal generic event system
- *
- * \author Russell Bryant <russell at digium.com>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "asterisk/event.h"
-#include "asterisk/linkedlists.h"
-#include "asterisk/lock.h"
-#include "asterisk/utils.h"
-
-#define NUM_EVENT_THREADS 5
-
-struct ast_event_ie {
-	enum ast_event_ie_type ie_type:16;
-	/*! Total length of the IE payload */
-	uint16_t ie_payload_len;
-	unsigned char ie_payload[0];
-} __attribute__ ((packed));
-
-/*!
- * \brief An event
- *
- * \note The format of this structure is important, and can not change, since
- *       they are sent directly over the network (via IAX2).
- *
- */
-struct ast_event {
-	/*! Event type */
-	enum ast_event_type type:16;
-	/*! Total length of the event */
-	uint16_t event_len:16;
-	/*! The data payload of the event, made up of information elements */
-	unsigned char payload[0];
-} __attribute__ ((packed));
-
-struct ast_event_ref {
-	struct ast_event *event;
-	AST_LIST_ENTRY(ast_event_ref) entry;
-};
-
-/*! \brief data shared between event dispatching threads */
-static struct {
-	ast_cond_t cond;
-	ast_mutex_t lock;
-	AST_LIST_HEAD_NOLOCK(, ast_event_ref) event_q;
-} event_thread = {
-	.lock = AST_MUTEX_INIT_VALUE,
-};
-
-struct ast_event_ie_val {
-	AST_LIST_ENTRY(ast_event_ie_val) entry;
-	enum ast_event_ie_type ie_type;
-	enum ast_event_ie_pltype ie_pltype;
-	union {
-		uint32_t uint;
-		const char *str;
-	} payload;
-};
-
-/*! \brief Event subscription */
-struct ast_event_sub {
-	enum ast_event_type type;
-	ast_event_cb_t cb;
-	void *userdata;
-	uint32_t uniqueid;
-	AST_LIST_HEAD_NOLOCK(, ast_event_ie_val) ie_vals;
-	AST_RWLIST_ENTRY(ast_event_sub) entry;
-};
-
-static uint32_t sub_uniqueid;
-
-/*! \brief Event subscriptions
- * The event subscribers are indexed by which event they are subscribed to */
-static AST_RWLIST_HEAD(ast_event_sub_list, ast_event_sub) ast_event_subs[AST_EVENT_TOTAL];
-
-/*! \brief Cached events
- * The event cache is indexed on the event type.  The purpose of this is 
- * for events that express some sort of state.  So, when someone first
- * needs to know this state, it can get the last known state from the cache. */
-static AST_RWLIST_HEAD(ast_event_ref_list, ast_event_ref) ast_event_cache[AST_EVENT_TOTAL];
-
-static void ast_event_ie_val_destroy(struct ast_event_ie_val *ie_val)
-{
-	if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
-		free((void *) ie_val->payload.str);
-
-	free(ie_val);
-}
-
-enum ast_event_subscriber_res ast_event_check_subscriber(enum ast_event_type type, ...)
-{
-	va_list ap;
-	enum ast_event_ie_type ie_type;
-	enum ast_event_subscriber_res res = AST_EVENT_SUB_NONE;
-	struct ast_event_ie_val *ie_val, *sub_ie_val;
-	struct ast_event_sub *sub;
-	AST_LIST_HEAD_NOLOCK_STATIC(ie_vals, ast_event_ie_val);
-
-	if (type >= AST_EVENT_TOTAL) {
-		ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
-		return res;
-	}
-
-	va_start(ap, type);
-	for (ie_type = va_arg(ap, enum ast_event_type);
-		ie_type != AST_EVENT_IE_END;
-		ie_type = va_arg(ap, enum ast_event_type))
-	{
-		struct ast_event_ie_val *ie_val = alloca(sizeof(*ie_val));
-		memset(ie_val, 0, sizeof(*ie_val));
-		ie_val->ie_type = ie_type;
-		ie_val->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
-		if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
-			ie_val->payload.uint = va_arg(ap, uint32_t);
-		else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
-			ie_val->payload.str = ast_strdupa(va_arg(ap, const char *));
-		AST_LIST_INSERT_TAIL(&ie_vals, ie_val, entry);
-	}
-	va_end(ap);
-
-	AST_RWLIST_RDLOCK(&ast_event_subs[type]);
-	AST_RWLIST_TRAVERSE(&ast_event_subs[type], sub, entry) {
-		AST_LIST_TRAVERSE(&ie_vals, ie_val, entry) {
-			AST_LIST_TRAVERSE(&sub->ie_vals, sub_ie_val, entry) {
-				if (sub_ie_val->ie_type == ie_val->ie_type)
-					break;
-			}
-			if (!sub_ie_val) {
-				if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS)
-					break;
-				continue;
-			}
-			/* The subscriber doesn't actually care what the value is */
-			if (sub_ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS)
-				continue;
-			if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
-				ie_val->payload.uint != sub_ie_val->payload.uint)
-				break;
-			if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
-				strcmp(ie_val->payload.str, sub_ie_val->payload.str))
-				break;
-		}
-		if (!ie_val)
-			break;
-	}
-	AST_RWLIST_UNLOCK(&ast_event_subs[type]);
-
-	if (sub) /* All parameters were matched */
-		return AST_EVENT_SUB_EXISTS;
-
-	AST_RWLIST_RDLOCK(&ast_event_subs[AST_EVENT_ALL]);
-	if (!AST_LIST_EMPTY(&ast_event_subs[AST_EVENT_ALL]))
-		res = AST_EVENT_SUB_EXISTS;
-	AST_RWLIST_UNLOCK(&ast_event_subs[AST_EVENT_ALL]);
-
-	return res;
-}
-
-/*! Send AST_EVENT_SUB events to this subscriber of ... subscriber events */
-void ast_event_report_subs(const struct ast_event_sub *event_sub)
-{
-	struct ast_event *event;
-	struct ast_event_sub *sub;
-	enum ast_event_type event_type = -1;
-	struct ast_event_ie_val *ie_val;
-
-	if (event_sub->type != AST_EVENT_SUB)
-		return;
-
-	AST_LIST_TRAVERSE(&event_sub->ie_vals, ie_val, entry) {
-		if (ie_val->ie_type == AST_EVENT_IE_EVENTTYPE) {
-			event_type = ie_val->payload.uint;
-			break;
-		}
-	}
-
-	if (event_type == -1)
-		return;
-
-	AST_RWLIST_RDLOCK(&ast_event_subs[event_type]);
-	AST_RWLIST_TRAVERSE(&ast_event_subs[event_type], sub, entry) {
-		if (event_sub == sub)
-			continue;
-
-		event = ast_event_new(AST_EVENT_SUB,
-			AST_EVENT_IE_UNIQUEID,  AST_EVENT_IE_PLTYPE_UINT, sub->uniqueid,
-			AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
-			AST_EVENT_IE_END);
-
-		AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
-			switch (ie_val->ie_pltype) {
-			case AST_EVENT_IE_PLTYPE_EXISTS:
-				ast_event_append_ie_uint(&event, AST_EVENT_IE_EXISTS, ie_val->ie_type);
-				break;
-			case AST_EVENT_IE_PLTYPE_UINT:
-				ast_event_append_ie_uint(&event, ie_val->ie_type, ie_val->payload.uint);
-				break;
-			case AST_EVENT_IE_PLTYPE_STR:
-				ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str);
-				break;
-			}
-			if (!event)
-				break;
-		}
-
-		if (!event)
-			continue;
-
-		event_sub->cb(event, event_sub->userdata);
-
-		ast_event_destroy(event);
-	}
-	AST_RWLIST_UNLOCK(&ast_event_subs[event_type]);
-}
-
-struct ast_event_sub *ast_event_subscribe(enum ast_event_type type, ast_event_cb_t cb, 
-	void *userdata, ...)
-{
-	va_list ap;
-	enum ast_event_ie_type ie_type;
-	struct ast_event_sub *sub;
-	struct ast_event *event;
-
-	if (type >= AST_EVENT_TOTAL) {
-		ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
-		return NULL;
-	}
-
-	if (!(sub = ast_calloc(1, sizeof(*sub))))
-		return NULL;
-
-	va_start(ap, userdata);
-	for (ie_type = va_arg(ap, enum ast_event_type);
-		ie_type != AST_EVENT_IE_END;
-		ie_type = va_arg(ap, enum ast_event_type))
-	{
-		struct ast_event_ie_val *ie_val;
-		if (!(ie_val = ast_calloc(1, sizeof(*ie_val))))
-			continue;
-		ie_val->ie_type = ie_type;
-		ie_val->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
-		if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
-			ie_val->payload.uint = va_arg(ap, uint32_t);
-		else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR) {
-			if (!(ie_val->payload.str = ast_strdup(va_arg(ap, const char *)))) {
-				free(ie_val);
-				continue;
-			}
-		}
-		AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry);
-	}
-	va_end(ap);
-
-	sub->type = type;
-	sub->cb = cb;
-	sub->userdata = userdata;
-	sub->uniqueid = ast_atomic_fetchadd_int((int *) &sub_uniqueid, 1);
-
-	if (ast_event_check_subscriber(AST_EVENT_SUB,
-		AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, type,
-		AST_EVENT_IE_END) != AST_EVENT_SUB_NONE) {
-		struct ast_event_ie_val *ie_val;
-
-		event = ast_event_new(AST_EVENT_SUB,
-			AST_EVENT_IE_UNIQUEID,  AST_EVENT_IE_PLTYPE_UINT, sub->uniqueid,
-			AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
-			AST_EVENT_IE_END);
-
-		AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
-			switch (ie_val->ie_pltype) {
-			case AST_EVENT_IE_PLTYPE_EXISTS:
-				ast_event_append_ie_uint(&event, AST_EVENT_IE_EXISTS, ie_val->ie_type);
-				break;
-			case AST_EVENT_IE_PLTYPE_UINT:
-				ast_event_append_ie_uint(&event, ie_val->ie_type, ie_val->payload.uint);
-				break;
-			case AST_EVENT_IE_PLTYPE_STR:
-				ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str);
-				break;
-			}
-			if (!event)
-				break;
-		}
-
-		if (event)
-			ast_event_queue(event);
-	}
-
-	AST_RWLIST_WRLOCK(&ast_event_subs[type]);
-	AST_RWLIST_INSERT_TAIL(&ast_event_subs[type], sub, entry);
-	AST_RWLIST_UNLOCK(&ast_event_subs[type]);
-
-	return sub;
-}
-
-static void ast_event_sub_destroy(struct ast_event_sub *sub)
-{
-	struct ast_event_ie_val *ie_val;
-
-	while ((ie_val = AST_LIST_REMOVE_HEAD(&sub->ie_vals, entry)))
-		ast_event_ie_val_destroy(ie_val);
-
-	free(sub);
-}
-
-void ast_event_unsubscribe(struct ast_event_sub *sub)
-{
-	struct ast_event *event;
-
-	AST_RWLIST_WRLOCK(&ast_event_subs[sub->type]);
-	AST_LIST_REMOVE(&ast_event_subs[sub->type], sub, entry);
-	AST_RWLIST_UNLOCK(&ast_event_subs[sub->type]);
-
-	if (ast_event_check_subscriber(AST_EVENT_UNSUB,
-		AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
-		AST_EVENT_IE_END) != AST_EVENT_SUB_NONE) {
-		
-		event = ast_event_new(AST_EVENT_UNSUB,
-			AST_EVENT_IE_UNIQUEID,  AST_EVENT_IE_PLTYPE_UINT, sub->uniqueid,
-			AST_EVENT_IE_EVENTTYPE, AST_EVENT_IE_PLTYPE_UINT, sub->type,
-			AST_EVENT_IE_END);
-
-		if (event)
-			ast_event_queue(event);
-	}
-
-	ast_event_sub_destroy(sub);
-}
-
-enum ast_event_type ast_event_get_type(const struct ast_event *event)
-{
-	return ntohs(event->type);
-}
-
-uint32_t ast_event_get_ie_uint(const struct ast_event *event, enum ast_event_ie_type ie_type)
-{
-	const uint32_t *ie_val;
-
-	ie_val = ast_event_get_ie_raw(event, ie_type);
-
-	return ie_val ? ntohl(*ie_val) : 0;
-}
-
-const char *ast_event_get_ie_str(const struct ast_event *event, enum ast_event_ie_type ie_type)
-{
-	return ast_event_get_ie_raw(event, ie_type);
-}
-
-const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
-{
-	struct ast_event_ie *ie;
-	uint16_t event_len;
-
-	ie_type = ntohs(ie_type);
-	event_len = ntohs(event->event_len);
-
-	ie = ((void *) event) + sizeof(*event);
-
-	while ((((void *) ie) - ((void *) event)) < event_len) {
-		if (ie->ie_type == ie_type)
-			return ie->ie_payload;
-		ie = ((void *) ie) + sizeof(*ie) + ntohs(ie->ie_payload_len);
-	}
-
-	return NULL;
-}
-
-int ast_event_append_ie_str(struct ast_event **event, enum ast_event_ie_type ie_type,
-	const char *str)
-{
-	return ast_event_append_ie_raw(event, ie_type, str, strlen(str) + 1);
-}
-
-int ast_event_append_ie_uint(struct ast_event **event, enum ast_event_ie_type ie_type,
-	uint32_t data)
-{
-	data = htonl(data);
-	return ast_event_append_ie_raw(event, ie_type, &data, sizeof(data));
-}
-
-int ast_event_append_ie_raw(struct ast_event **event, enum ast_event_ie_type ie_type,
-	const void *data, size_t data_len)
-{
-	struct ast_event_ie *ie;
-	unsigned int extra_len;
-	uint16_t event_len;
-
-	event_len = ntohs((*event)->event_len);
-	extra_len = sizeof(*ie) + data_len;
-
-	if (!(*event = ast_realloc(*event, event_len + extra_len)))
-		return -1;
-
-	ie = ((void *) *event) + event_len;
-	ie->ie_type = htons(ie_type);
-	ie->ie_payload_len = htons(data_len);
-	memcpy(ie->ie_payload, data, data_len);
-
-	(*event)->event_len = htons(event_len + extra_len);
-
-	return 0;
-}
-
-struct ast_event *ast_event_new(enum ast_event_type type, ...)
-{
-	va_list ap;
-	struct ast_event *event;
-	enum ast_event_type ie_type;
-	struct ast_event_ie_val *ie_val;
-	AST_LIST_HEAD_NOLOCK_STATIC(ie_vals, ast_event_ie_val);
-
-	/* Invalid type */
-	if (type >= AST_EVENT_TOTAL) {
-		ast_log(LOG_WARNING, "Someone tried to create an event of invalid "
-			"type '%d'!\n", type);
-		return NULL;
-	}
-
-	va_start(ap, type);
-	for (ie_type = va_arg(ap, enum ast_event_type);
-		ie_type != AST_EVENT_IE_END;
-		ie_type = va_arg(ap, enum ast_event_type))
-	{
-		struct ast_event_ie_val *ie_val = alloca(sizeof(*ie_val));
-		memset(ie_val, 0, sizeof(*ie_val));
-		ie_val->ie_type = ie_type;
-		ie_val->ie_pltype = va_arg(ap, enum ast_event_ie_pltype);
-		if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
-			ie_val->payload.uint = va_arg(ap, uint32_t);
-		else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
-			ie_val->payload.str = ast_strdupa(va_arg(ap, const char *));
-		AST_LIST_INSERT_TAIL(&ie_vals, ie_val, entry);
-	}
-	va_end(ap);
-
-	if (!(event = ast_calloc(1, sizeof(*event))))
-		return NULL;
-
-	event->type = htons(type);
-	event->event_len = htons(sizeof(*event));
-
-	AST_LIST_TRAVERSE(&ie_vals, ie_val, entry) {
-		if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR)
-			ast_event_append_ie_str(&event, ie_val->ie_type, ie_val->payload.str);
-		else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT)
-			ast_event_append_ie_uint(&event, ie_val->ie_type, ie_val->payload.uint);
-
-		if (!event)
-			break;
-	}
-
-	return event;
-}
-
-void ast_event_destroy(struct ast_event *event)
-{
-	free(event);
-}
-
-static void ast_event_ref_destroy(struct ast_event_ref *event_ref)
-{
-	ast_event_destroy(event_ref->event);
-	free(event_ref);
-}
-
-static struct ast_event *ast_event_dup(const struct ast_event *event)
-{
-	struct ast_event *dup_event;
-	uint16_t event_len;
-
-	event_len = ntohs(event->event_len);
-
-	if (!(dup_event = ast_calloc(1, event_len)))
-		return NULL;
-	
-	memcpy(dup_event, event, event_len);
-
-	return dup_event;
-}
-
-struct ast_event *ast_event_get_cached(enum ast_event_type type, ...)
-{
-	va_list ap;
-	enum ast_event_ie_type ie_type;
-	struct ast_event *dup_event = NULL;
-	struct ast_event_ref *event_ref;
-	struct cache_arg {
-		AST_LIST_ENTRY(cache_arg) entry;
-		enum ast_event_ie_type ie_type;
-		enum ast_event_ie_pltype ie_pltype;
-		union {
-			uint32_t uint;
-			const char *str;
-		} payload;
-	} *cache_arg;
-	AST_LIST_HEAD_NOLOCK_STATIC(cache_args, cache_arg);
-
-	if (type >= AST_EVENT_TOTAL) {
-		ast_log(LOG_ERROR, "%u is an invalid type!\n", type);
-		return NULL;
-	}
-
-	va_start(ap, type);
-	for (ie_type = va_arg(ap, enum ast_event_type);
-		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 *));
-		AST_LIST_INSERT_TAIL(&cache_args, cache_arg, entry);
-	}
-	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;
-	}
-
-	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 ( ! ( (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
-			   (cache_arg->payload.uint ==
-			    ast_event_get_ie_uint(event_ref->event, cache_arg->ie_type))) ||
-
-			   (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
-			   (!strcmp(cache_arg->payload.str,
-			     ast_event_get_ie_str(event_ref->event, cache_arg->ie_type)))) ||
-
-			   (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS &&
-			    ast_event_get_ie_raw(event_ref->event, cache_arg->ie_type)) ) ) 
-			{
-				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]);
-
-	return dup_event;
-}
-
-/*! \brief Duplicate an event and add it to the cache
- * \note This assumes this index in to the cache is locked */
-static int ast_event_dup_and_cache(const struct ast_event *event)
-{
-	struct ast_event *dup_event;
-	struct ast_event_ref *event_ref;
-
-	if (!(dup_event = ast_event_dup(event)))
-		return -1;
-	if (!(event_ref = ast_calloc(1, sizeof(*event_ref))))
-		return -1;
-	
-	event_ref->event = dup_event;
-
-	AST_LIST_INSERT_TAIL(&ast_event_cache[ntohs(event->type)], event_ref, entry);
-
-	return 0;
-}
-
-int ast_event_queue_and_cache(struct ast_event *event, ...)
-{
-	va_list ap;
-	enum ast_event_type ie_type;
-	uint16_t host_event_type;
-	struct ast_event_ref *event_ref;
-	int res;
-	struct cache_arg {
-		AST_LIST_ENTRY(cache_arg) entry;
-		enum ast_event_ie_type ie_type;
-		enum ast_event_ie_pltype ie_pltype;
-	} *cache_arg;
-	AST_LIST_HEAD_NOLOCK_STATIC(cache_args, cache_arg);
-
-	host_event_type = ntohs(event->type);
-
-	/* Invalid type */
-	if (host_event_type >= AST_EVENT_TOTAL) {
-		ast_log(LOG_WARNING, "Someone tried to queue an event of invalid "
-			"type '%d'!\n", host_event_type);
-		return -1;
-	}
-
-	va_start(ap, event);
-	for (ie_type = va_arg(ap, enum ast_event_type);
-		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);
-		AST_LIST_INSERT_TAIL(&cache_args, cache_arg, entry);
-	}
-	va_end(ap);
-
-	if (AST_LIST_EMPTY(&cache_args)) {
-		ast_log(LOG_ERROR, "Events can not be cached without specifying at "
-			"least one IE type!\n");
-		return ast_event_queue(event);
-	}
- 
-	AST_RWLIST_WRLOCK(&ast_event_cache[host_event_type]);
-	AST_RWLIST_TRAVERSE_SAFE_BEGIN(&ast_event_cache[host_event_type], event_ref, entry) {
-		AST_LIST_TRAVERSE(&cache_args, cache_arg, entry) {
-			if ( ! ( (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
-			   (ast_event_get_ie_uint(event, cache_arg->ie_type) ==
-			    ast_event_get_ie_uint(event_ref->event, cache_arg->ie_type))) ||
-
-			   (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
-			   (!strcmp(ast_event_get_ie_str(event, cache_arg->ie_type),
-			     ast_event_get_ie_str(event_ref->event, cache_arg->ie_type)))) ||
-
-			   (cache_arg->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS &&
-			    ast_event_get_ie_raw(event_ref->event, cache_arg->ie_type)) ) )
-			{
-				break;	
-			}
-		}
-		if (!cache_arg) {
-			/* All parameters were matched on this cache entry, so remove it */
-			AST_LIST_REMOVE_CURRENT(&ast_event_cache[host_event_type], entry);
-			ast_event_ref_destroy(event_ref);
-		}
-	}
-	AST_RWLIST_TRAVERSE_SAFE_END
-	res = ast_event_dup_and_cache(event);
-	AST_RWLIST_UNLOCK(&ast_event_cache[host_event_type]);
-
-	return (ast_event_queue(event) || res) ? -1 : 0;
-}
-
-int ast_event_queue(struct ast_event *event)
-{
-	struct ast_event_ref *event_ref;
-	uint16_t host_event_type;
-
-	host_event_type = ntohs(event->type);
-
-	/* Invalid type */
-	if (host_event_type >= AST_EVENT_TOTAL) {
-		ast_log(LOG_WARNING, "Someone tried to queue an event of invalid "
-			"type '%d'!\n", host_event_type);
-		return -1;
-	}
-
-	/* If nobody has subscribed to this event type, throw it away now */
-	if (ast_event_check_subscriber(host_event_type, AST_EVENT_IE_END) 
-		== AST_EVENT_SUB_NONE) {
-		ast_event_destroy(event);
-		return 0;
-	}
-
-	if (!(event_ref = ast_calloc(1, sizeof(*event_ref))))
-		return -1;
-
-	event_ref->event = event;
-
-	ast_mutex_lock(&event_thread.lock);
-	AST_LIST_INSERT_TAIL(&event_thread.event_q, event_ref, entry);
-	ast_cond_signal(&event_thread.cond);
-	ast_mutex_unlock(&event_thread.lock);
-
-	return 0;
-}
-
-static void *ast_event_dispatcher(void *unused)
-{
-	for (;;) {
-		struct ast_event_ref *event_ref;
-		struct ast_event_sub *sub;
-		uint16_t host_event_type;
-
-		ast_mutex_lock(&event_thread.lock);
-		while (!(event_ref = AST_LIST_REMOVE_HEAD(&event_thread.event_q, entry)))
-			ast_cond_wait(&event_thread.cond, &event_thread.lock);
-		ast_mutex_unlock(&event_thread.lock);
-
-		host_event_type = ntohs(event_ref->event->type);
-
-		/* Subscribers to this specific event first */
-		AST_RWLIST_RDLOCK(&ast_event_subs[host_event_type]);
-		AST_RWLIST_TRAVERSE(&ast_event_subs[host_event_type], sub, entry) {
-			struct ast_event_ie_val *ie_val;
-			AST_LIST_TRAVERSE(&sub->ie_vals, ie_val, entry) {
-				if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_EXISTS &&
-					ast_event_get_ie_raw(event_ref->event, ie_val->ie_type)) {
-					continue;
-				} else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_UINT &&
-					ast_event_get_ie_uint(event_ref->event, ie_val->ie_type) 
-					== ie_val->payload.uint) {
-					continue;
-				} else if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_STR &&
-					!strcmp(ast_event_get_ie_str(event_ref->event, ie_val->ie_type),
-						ie_val->payload.str)) {
-					continue;
-				}
-				break;
-			}
-			if (ie_val)
-				continue;
-			sub->cb(event_ref->event, sub->userdata);
-		}
-		AST_RWLIST_UNLOCK(&ast_event_subs[host_event_type]);
-
-		/* Now to subscribers to all event types */
-		AST_RWLIST_RDLOCK(&ast_event_subs[AST_EVENT_ALL]);
-		AST_RWLIST_TRAVERSE(&ast_event_subs[AST_EVENT_ALL], sub, entry)
-			sub->cb(event_ref->event, sub->userdata);
-		AST_RWLIST_UNLOCK(&ast_event_subs[AST_EVENT_ALL]);
-
-		ast_event_ref_destroy(event_ref);
-	}
-
-	return NULL;
-}
-
-void ast_event_init(void)
-{
-	int i;
-
-	for (i = 0; i < AST_EVENT_TOTAL; i++)
-		AST_RWLIST_HEAD_INIT(&ast_event_subs[i]);
-
-	for (i = 0; i < AST_EVENT_TOTAL; i++)
-		AST_RWLIST_HEAD_INIT(&ast_event_cache[i]);
-
-	ast_cond_init(&event_thread.cond, NULL);
-
-	for (i = 0; i < NUM_EVENT_THREADS; i++) {
-		pthread_t dont_care;
-		ast_pthread_create_background(&dont_care, NULL, ast_event_dispatcher, NULL);
-	}
-}
->>>>>>> .merge-right.r62300



More information about the asterisk-commits mailing list