[asterisk-commits] mmichelson: branch group/CCSS_Monitor_Restructure r241711 - in /team/group/CC...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jan 20 15:08:53 CST 2010


Author: mmichelson
Date: Wed Jan 20 15:08:49 2010
New Revision: 241711

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=241711
Log:
Got the necessary stuff in place for dealing with a callee becoming available.


Modified:
    team/group/CCSS_Monitor_Restructure/include/asterisk/ccss.h
    team/group/CCSS_Monitor_Restructure/main/ccss.c

Modified: team/group/CCSS_Monitor_Restructure/include/asterisk/ccss.h
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS_Monitor_Restructure/include/asterisk/ccss.h?view=diff&rev=241711&r1=241710&r2=241711
==============================================================================
--- team/group/CCSS_Monitor_Restructure/include/asterisk/ccss.h (original)
+++ team/group/CCSS_Monitor_Restructure/include/asterisk/ccss.h Wed Jan 20 15:08:49 2010
@@ -1356,6 +1356,7 @@
  * \retval -1 Request could not be queued
  */
 int ast_cc_monitor_callee_available(struct ast_cc_monitor *monitor);
+int ast_cc_monitor_callee_available2(struct cc_monitor *monitor);
 
 /* END API FOR USE WITH/BY MONITORS */
 

Modified: team/group/CCSS_Monitor_Restructure/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS_Monitor_Restructure/main/ccss.c?view=diff&rev=241711&r1=241710&r2=241711
==============================================================================
--- team/group/CCSS_Monitor_Restructure/main/ccss.c (original)
+++ team/group/CCSS_Monitor_Restructure/main/ccss.c Wed Jan 20 15:08:49 2010
@@ -1124,8 +1124,14 @@
 static struct generic_monitor_instance_list *create_new_generic_list(struct cc_monitor *monitor)
 {
 	struct generic_monitor_instance_list *generic_list = ao2_alloc(sizeof(*generic_list), generic_monitor_instance_list_destructor);
+	char *monitor_name_copy = ast_strdup(monitor->interface->name);
 
 	if (!generic_list) {
+		return NULL;
+	}
+	
+	if (!monitor_name_copy) {
+		cc_unref(generic_list, "Failed to make monitor name copy in create_new_generic_list");
 		return NULL;
 	}
 
@@ -1135,7 +1141,7 @@
 	}
 
 	if (!(generic_list->sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE, generic_monitor_devstate_cb,
-				"Requesting CC", monitor, AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, 
+				"Requesting CC", monitor_name_copy, AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, 
 				monitor->interface->name, AST_EVENT_IE_END))) {
 		cc_unref(generic_list, "Failed to subscribe to device state");
 		return NULL;
@@ -1158,29 +1164,48 @@
 }
 
 struct generic_tp_cb_data {
-	struct ast_cc_monitor *monitor;
+	char *monitor_name;
 	enum ast_device_state new_state;
 };
 
 static int generic_monitor_devstate_tp_cb(void *data)
 {
 	struct generic_tp_cb_data *gtcd = data;
-	struct ast_cc_monitor *monitor = gtcd->monitor;
+	char *monitor_name = gtcd->monitor_name;
 	enum ast_device_state new_state = gtcd->new_state;
-	struct generic_monitor_pvt *gen_mon_pvt = monitor->private_data;
-
-	if (gen_mon_pvt->current_state == new_state) {
+	struct generic_monitor_instance_list *generic_list;
+	struct generic_monitor_instance *generic_instance;
+
+	if (!(generic_list = find_generic_monitor_instance_list(monitor_name))) {
+		/* The most likely cause for this is that we destroyed the monitor in the
+		 * time between subscribing to its device state and the time this executes.
+		 * Not really a big deal.
+		 */
+		ast_free(monitor_name);
 		ast_free(gtcd);
-		cc_unref(monitor, "Kill reference from generic_monitor_devstate_cb");
 		return 0;
 	}
 
-	gen_mon_pvt->current_state = new_state;
+	if (generic_list->current_state == new_state) {
+		/* The device state hasn't actually changed, so we don't really care */
+		ast_free(monitor_name);
+		ast_free(gtcd);
+		cc_unref(generic_list, "Kill reference of generic list in devstate taskprocessor callback");
+		return 0;
+	}
+
+	generic_list->current_state = new_state;
 
 	if (new_state == AST_DEVICE_NOT_INUSE || new_state == AST_DEVICE_UNKNOWN) {
-		ast_cc_monitor_callee_available(monitor);
-	}
-	cc_unref(monitor, "Kill reference from generic_monitor_devstate_cb");
+		AST_LIST_TRAVERSE(&generic_list->list, generic_instance, next) {
+			if (!generic_instance->monitor->is_suspended) {
+				ast_cc_monitor_callee_available2(generic_instance->monitor);
+				break;
+			}
+		}	
+	}
+	cc_unref(generic_list, "Kill reference of generic list in devstate taskprocessor callback");
+	ast_free(monitor_name);
 	ast_free(gtcd);
 	return 0;
 }
@@ -1192,18 +1217,19 @@
 	 * so that all monitor operations can be serialized. Locks?! We don't need
 	 * no steenkin' locks!
 	 */
-	struct ast_cc_monitor *monitor = userdata;
+	char *monitor_name = userdata;
 	struct generic_tp_cb_data *gtcd = ast_calloc(1, sizeof(*gtcd));
 
 	if (!gtcd) {
+		ast_free(monitor_name);
 		return;
 	}
 
-	gtcd->monitor = cc_ref(monitor, "Keep reference until taskprocessor callback executes");
+	gtcd->monitor_name = monitor_name;
 	gtcd->new_state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
 
 	if (ast_taskprocessor_push(cc_core_taskprocessor, generic_monitor_devstate_tp_cb, gtcd)) {
-		cc_unref(gtcd->monitor, "Kill reference from generic_monitor_devstate_cb");
+		ast_free(gtcd->monitor_name);
 		ast_free(gtcd);
 	}
 }
@@ -3166,6 +3192,11 @@
 	return cc_request_state_change(CC_ACTIVE, core_id, debug);
 }
 
+int ast_cc_monitor_callee_available2(struct cc_monitor *monitor)
+{
+	return cc_request_state_change(CC_CALLEE_READY, monitor->core_id, "Device being monitored has become available");
+}
+
 int ast_cc_monitor_callee_available(struct ast_cc_monitor *monitor)
 {
 	int res;




More information about the asterisk-commits mailing list