[asterisk-commits] russell: branch russell/event_performance r183648 - in /team/russell/event_pe...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sun Mar 22 14:04:55 CDT 2009


Author: russell
Date: Sun Mar 22 14:04:52 2009
New Revision: 183648

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=183648
Log:
When distributed device state is not being used, cut out unnecessary processing

Modified:
    team/russell/event_performance/include/asterisk/devicestate.h
    team/russell/event_performance/main/devicestate.c
    team/russell/event_performance/res/ais/evt.c

Modified: team/russell/event_performance/include/asterisk/devicestate.h
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/include/asterisk/devicestate.h?view=diff&rev=183648&r1=183647&r2=183648
==============================================================================
--- team/russell/event_performance/include/asterisk/devicestate.h (original)
+++ team/russell/event_performance/include/asterisk/devicestate.h Sun Mar 22 14:04:52 2009
@@ -36,6 +36,8 @@
 
 #ifndef _ASTERISK_DEVICESTATE_H
 #define _ASTERISK_DEVICESTATE_H
+
+#include "asterisk/channel.h"
 
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
@@ -259,6 +261,21 @@
 	unsigned int ring:1;
 };
 
+/*!
+ * \brief Enable distributed device state processing.
+ *
+ * \details
+ * By default, Asterisk assumes that device state change events will only be
+ * originating from one instance.  If a module gets loaded and configured such
+ * that multiple instances of Asterisk will be sharing device state, this
+ * function should be called to enable distributed device state processing.
+ * It is off by default to save on unnecessary processing.
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+int ast_enable_distributed_devstate(void);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif

Modified: team/russell/event_performance/main/devicestate.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/main/devicestate.c?view=diff&rev=183648&r1=183647&r2=183648
==============================================================================
--- team/russell/event_performance/main/devicestate.c (original)
+++ team/russell/event_performance/main/devicestate.c Sun Mar 22 14:04:52 2009
@@ -196,8 +196,10 @@
 	ast_cond_t cond;
 	ast_mutex_t lock;
 	AST_LIST_HEAD_NOLOCK(, devstate_change) devstate_change_q;
+	unsigned int enabled:1;
 } devstate_collector = {
 	.thread = AST_PTHREADT_NULL,
+	.enabled = 0,
 };
 
 /* Forward declarations */
@@ -452,10 +454,19 @@
 static void devstate_event(const char *device, enum ast_device_state state)
 {
 	struct ast_event *event;
+	enum ast_event_type event_type;
+
+	if (devstate_collector.enabled) {
+		/* Distributed device state is enabled, so this state change is a change
+		 * for a single server, not the real state. */
+		event_type = AST_EVENT_DEVICE_STATE_CHANGE;
+	} else {
+		event_type = AST_EVENT_DEVICE_STATE;
+	}
 
 	ast_debug(3, "device '%s' state '%d'\n", device, state);
 
-	if (!(event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE,
+	if (!(event = ast_event_new(event_type,
 			AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, device,
 			AST_EVENT_IE_STATE, AST_EVENT_IE_PLTYPE_UINT, state,
 			AST_EVENT_IE_END))) {
@@ -743,21 +754,6 @@
 /*! \brief Initialize the device state engine in separate thread */
 int ast_device_state_engine_init(void)
 {
-	devstate_collector.event_sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE_CHANGE,
-		devstate_change_collector_cb, NULL, AST_EVENT_IE_END);
-
-	if (!devstate_collector.event_sub) {
-		ast_log(LOG_ERROR, "Failed to create subscription for the device state change collector\n");
-		return -1;
-	}
-
-	ast_mutex_init(&devstate_collector.lock);
-	ast_cond_init(&devstate_collector.cond, NULL);
-	if (ast_pthread_create_background(&devstate_collector.thread, NULL, run_devstate_collector, NULL) < 0) {
-		ast_log(LOG_ERROR, "Unable to start device state collector thread.\n");
-		return -1;
-	}
-
 	ast_cond_init(&change_pending, NULL);
 	if (ast_pthread_create_background(&change_thread, NULL, do_devstate_changes, NULL) < 0) {
 		ast_log(LOG_ERROR, "Unable to start device state change thread.\n");
@@ -854,3 +850,28 @@
 	return AST_DEVICE_NOT_INUSE;
 }
 
+int ast_enable_distributed_devstate(void)
+{
+	if (devstate_collector.enabled) {
+		return 0;
+	}
+
+	devstate_collector.event_sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE_CHANGE,
+		devstate_change_collector_cb, NULL, AST_EVENT_IE_END);
+
+	if (!devstate_collector.event_sub) {
+		ast_log(LOG_ERROR, "Failed to create subscription for the device state change collector\n");
+		return -1;
+	}
+
+	ast_mutex_init(&devstate_collector.lock);
+	ast_cond_init(&devstate_collector.cond, NULL);
+	if (ast_pthread_create_background(&devstate_collector.thread, NULL, run_devstate_collector, NULL) < 0) {
+		ast_log(LOG_ERROR, "Unable to start device state collector thread.\n");
+		return -1;
+	}
+
+	devstate_collector.enabled = 1;
+
+	return 0;
+}

Modified: team/russell/event_performance/res/ais/evt.c
URL: http://svn.digium.com/svn-view/asterisk/team/russell/event_performance/res/ais/evt.c?view=diff&rev=183648&r1=183647&r2=183648
==============================================================================
--- team/russell/event_performance/res/ais/evt.c (original)
+++ team/russell/event_performance/res/ais/evt.c Sun Mar 22 14:04:52 2009
@@ -47,6 +47,7 @@
 #include "asterisk/event.h"
 #include "asterisk/config.h"
 #include "asterisk/linkedlists.h"
+#include "asterisk/devicestate.h"
 
 #ifndef AST_MODULE
 /* XXX HACK */
@@ -341,9 +342,17 @@
 		return;
 	}
 
-	if (!(publish_event = ast_calloc(1, sizeof(*publish_event))))
-		return;
-	
+	if (!(publish_event = ast_calloc(1, sizeof(*publish_event)))) {
+		return;
+	}
+
+	if (type == AST_EVENT_DEVICE_STATE_CHANGE) {
+		if (ast_enable_distributed_devstate()) {
+			ast_free(publish_event);
+			return;
+		}
+	}
+
 	publish_event->type = type;
 	ast_log(LOG_DEBUG, "Subscribing to event type %d\n", type);
 	publish_event->sub = ast_event_subscribe(type, ast_event_cb, event_channel,
@@ -399,9 +408,17 @@
 		return;
 	}
 
-	if (!(subscribe_event = ast_calloc(1, sizeof(*subscribe_event))))
-		return;
-	
+	if (!(subscribe_event = ast_calloc(1, sizeof(*subscribe_event)))) {
+		return;
+	}
+
+	if (type == AST_EVENT_DEVICE_STATE_CHANGE) {
+		if (ast_enable_distributed_devstate()) {
+			ast_free(subscribe_event);
+			return;
+		}
+	}
+
 	subscribe_event->type = type;
 	subscribe_event->id = ast_atomic_fetchadd_int(&unique_id, +1);
 




More information about the asterisk-commits mailing list