[svn-commits] mmichelson: branch group/CCSS_Monitor_Restructure r244396 - /team/group/CCSS_...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Feb 2 14:40:58 CST 2010


Author: mmichelson
Date: Tue Feb  2 14:40:56 2010
New Revision: 244396

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=244396
Log:
Add some missing code regarding CC EPA entries.

First, I never set the instance_data field of the call_completion
EPA entry when I allocated it, so I needed to do that. This allowed
me to not segfault when an error occurred.

Next, I added a destructor callback to EPA entry static_data
members. This way, the destructor is called properly when
the EPA entry is destroyed.

There is still a bit of murkiness to clean up with regards
to multiple endpoints being dialed, but things appear to work
wonderfully when dialing a single endpoint.

Modified:
    team/group/CCSS_Monitor_Restructure/channels/chan_sip.c

Modified: team/group/CCSS_Monitor_Restructure/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS_Monitor_Restructure/channels/chan_sip.c?view=diff&rev=244396&r1=244395&r2=244396
==============================================================================
--- team/group/CCSS_Monitor_Restructure/channels/chan_sip.c (original)
+++ team/group/CCSS_Monitor_Restructure/channels/chan_sip.c Tue Feb  2 14:40:56 2010
@@ -1805,6 +1805,7 @@
 	const char *name;
 	void (*handle_ok)(struct sip_pvt *, struct sip_request *, struct sip_epa_entry *);
 	void (*handle_error)(struct sip_pvt *, const int resp, struct sip_request *, struct sip_epa_entry *);
+	void (*destructor)(void *instance_data);
 };
 
 struct epa_backend {
@@ -1831,10 +1832,17 @@
 
 static void cc_handle_publish_error(struct sip_pvt *pvt, const int resp, struct sip_request *req, struct sip_epa_entry *epa_entry);
 
+static void cc_epa_destructor(void *instance_data)
+{
+	struct cc_epa_entry *cc_entry = instance_data;
+	ast_free(cc_entry);
+}
+
 static const struct epa_static_data cc_epa_static_data  = {
 	.event = CALL_COMPLETION,
 	.name = "call-completion",
 	.handle_error = cc_handle_publish_error,
+	.destructor = cc_epa_destructor,
 };
 
 struct sip_epa_entry {
@@ -1889,12 +1897,11 @@
 	struct sip_epa_entry *epa_entry;
 	const struct epa_static_data *static_data;
 
-	if (!(epa_entry = ao2_alloc(sizeof(*epa_entry), NULL))) {
+	if (!(static_data = find_static_data(event_package))) {
 		return NULL;
 	}
 
-	if (!(static_data = find_static_data(event_package))) {
-		ao2_ref(epa_entry, -1);
+	if (!(epa_entry = ao2_alloc(sizeof(*epa_entry), static_data->destructor))) {
 		return NULL;
 	}
 
@@ -3741,6 +3748,7 @@
 {
 	struct sip_monitor_instance *monitor_instance = monitor->private_data;
 	enum sip_publish_type publish_type;
+	struct cc_epa_entry *cc_entry;
 
 	if (!monitor_instance) {
 		return -1;
@@ -3753,6 +3761,14 @@
 			ao2_ref(monitor_instance, -1);
 			return -1;
 		}
+		if (!(cc_entry = ast_calloc(1, sizeof(*cc_entry)))) {
+			ast_log(LOG_WARNING, "Unable to allocate space for instance data of EPA entry for call-completion\n");
+			ao2_ref(monitor_instance, -1);
+			return -1;
+		}
+		cc_entry->core_id = monitor->core_id;
+		cc_entry->current_state = CC_CLOSED;
+		monitor_instance->suspension_entry->instance_data = cc_entry;
 		publish_type = SIP_PUBLISH_INITIAL;
 	} else {
 		publish_type = SIP_PUBLISH_MODIFY;
@@ -19872,6 +19888,7 @@
 		if ((p->authtries == MAX_AUTHTRIES) || do_proxy_auth(p, req, resp, SIP_PUBLISH, 0)) {
 			ast_log(LOG_NOTICE, "Failed to authenticate on PUBLISH to '%s'\n", get_header(&p->initreq, "From"));
 		}
+		return;
 	}
 
 	if (resp == 501 || resp == 405) {




More information about the svn-commits mailing list