[asterisk-commits] mmichelson: branch group/manager2 r104040 - in /team/group/manager2: include/...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Feb 22 17:10:47 CST 2008


Author: mmichelson
Date: Fri Feb 22 17:10:46 2008
New Revision: 104040

URL: http://svn.digium.com/view/asterisk?view=rev&rev=104040
Log:
1. Offload manager subscription into a separate thread from the event dispatcher in event.c
2. Create a lookup table for queue events so it is easy to subscribe to all of them.
3. Expose the definition of ast_event_dup



Modified:
    team/group/manager2/include/asterisk/event.h
    team/group/manager2/include/asterisk/event_defs.h
    team/group/manager2/include/asterisk/manager2.h
    team/group/manager2/main/event.c
    team/group/manager2/res/res_manager2.c

Modified: team/group/manager2/include/asterisk/event.h
URL: http://svn.digium.com/view/asterisk/team/group/manager2/include/asterisk/event.h?view=diff&rev=104040&r1=104039&r2=104040
==============================================================================
--- team/group/manager2/include/asterisk/event.h (original)
+++ team/group/manager2/include/asterisk/event.h Fri Feb 22 17:10:46 2008
@@ -478,6 +478,15 @@
  */
 void *ast_event_iterator_get_ie_raw(struct ast_event_iterator *iterator);
 
+/*!
+ * \brief make a copy of an ast_event structure
+ *
+ * \param event the event to copy
+ * 
+ * \return Returns a copy of the event allocated on the heap
+ */
+struct ast_event *ast_event_dup(const struct ast_event* event);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif

Modified: team/group/manager2/include/asterisk/event_defs.h
URL: http://svn.digium.com/view/asterisk/team/group/manager2/include/asterisk/event_defs.h?view=diff&rev=104040&r1=104039&r2=104040
==============================================================================
--- team/group/manager2/include/asterisk/event_defs.h (original)
+++ team/group/manager2/include/asterisk/event_defs.h Fri Feb 22 17:10:46 2008
@@ -60,6 +60,7 @@
 	/*! Number of event types.  This should be the last event type + 1 */
 	AST_EVENT_TOTAL = 18,
 };
+
 
 /*! \brief Event Information Element types */
 enum ast_event_ie_type {

Modified: team/group/manager2/include/asterisk/manager2.h
URL: http://svn.digium.com/view/asterisk/team/group/manager2/include/asterisk/manager2.h?view=diff&rev=104040&r1=104039&r2=104040
==============================================================================
--- team/group/manager2/include/asterisk/manager2.h (original)
+++ team/group/manager2/include/asterisk/manager2.h Fri Feb 22 17:10:46 2008
@@ -1,3 +1,6 @@
+#ifndef MANAGER2H
+#define MANAGER2H
+
 enum ast_event_info_ie_type {
 
 /* app_queue informational IE's */
@@ -84,3 +87,5 @@
 	{AST_EVENT_IE_INFO_QUEUE_RINGTIME,				AST_EVENT_IE_PLTYPE_UINT,	"RingTime"},
 	{AST_EVENT_IE_INFO_QUEUE_DESTINATION_UNIQUEID,	AST_EVENT_IE_PLTYPE_STR,	"DestinationUniqueID"},
 };
+
+#endif

Modified: team/group/manager2/main/event.c
URL: http://svn.digium.com/view/asterisk/team/group/manager2/main/event.c?view=diff&rev=104040&r1=104039&r2=104040
==============================================================================
--- team/group/manager2/main/event.c (original)
+++ team/group/manager2/main/event.c Fri Feb 22 17:10:46 2008
@@ -530,7 +530,7 @@
 	ast_free(event_ref);
 }
 
-static struct ast_event *ast_event_dup(const struct ast_event *event)
+struct ast_event *ast_event_dup(const struct ast_event *event)
 {
 	struct ast_event *dup_event;
 	uint16_t event_len;

Modified: team/group/manager2/res/res_manager2.c
URL: http://svn.digium.com/view/asterisk/team/group/manager2/res/res_manager2.c?view=diff&rev=104040&r1=104039&r2=104040
==============================================================================
--- team/group/manager2/res/res_manager2.c (original)
+++ team/group/manager2/res/res_manager2.c Fri Feb 22 17:10:46 2008
@@ -2,42 +2,128 @@
 #include "asterisk/module.h"
 #include "asterisk/event.h"
 #include "asterisk/manager2.h"
+#include "asterisk/utils.h"
+#include "asterisk/linkedlists.h"
 
-struct ast_event_sub *manager_sub;
+struct event_map {
+	const enum ast_event_type type;
+	const char *name;
+} queue_map [] = { /*Queue events*/
+	{AST_EVENT_QUEUE_MEMBER_STATUS, "QueueMemberStatus"},
+	{AST_EVENT_QUEUE_JOIN, "QueueJoin"},
+	{AST_EVENT_QUEUE_LEAVE, "QueueLeave"},
+	{AST_EVENT_QUEUE_MEMBER_CALLED, "QueueMemberCalled"},
+	{AST_EVENT_QUEUE_CALLER_ABANDON, "QueueCallerAbandon"},
+	{AST_EVENT_QUEUE_MEMBER_COMPLETE, "QueueMemberComplete"},
+	{AST_EVENT_QUEUE_MEMBER_DUMP, "QueueMemberDump"},
+	{AST_EVENT_QUEUE_MEMBER_CONNECT, "QueueMemberConnect"},
+	{AST_EVENT_QUEUE_MEMBER_REMOVED, "QueueMemberRemoved"},
+	{AST_EVENT_QUEUE_MEMBER_ADDED, "QueueMemberAdded"},
+	{AST_EVENT_QUEUE_MEMBER_PAUSED, "QueueMemberPaused"},
+	{AST_EVENT_QUEUE_MEMBER_PENALTY, "QueueMemberPenalty"},
+};
+
+struct info_event {
+	AST_LIST_ENTRY(info_event) list;
+	struct ast_event *event;
+};
+
+static struct {
+	pthread_t thread;
+	ast_cond_t cond;
+	ast_mutex_t lock;
+	AST_LIST_HEAD_NOLOCK(, info_event) info_events;
+} info_thread = {
+	.thread = AST_PTHREADT_NULL,
+};
+
+
+AST_LIST_HEAD_STATIC(info_events, info_event);
+
+#define QUEUE_EVENT_BEGIN AST_EVENT_QUEUE_MEMBER_STATUS
+/*Right now size this as the number of event types which exist
+ * Will probably modify this later
+ */
+struct ast_event_sub *manager_sub[AST_EVENT_TOTAL];
+
+/*! \brief Take our event and put it into our own queue
+ * to ease the load of the main event queue
+ *
+ * \param[in] event the event we have subscribed to
+ * \param[in] ignore unused parameter
+ */
+static void info_cb(const struct ast_event *event, void *ignore)
+{
+	struct info_event *new_event = ast_calloc(1, sizeof(*new_event));
+	if (!new_event)
+		/* OH CRAP! */
+		return;
+
+	if(!(new_event->event = ast_event_dup(event)))
+		/* OH CRAP! */
+		return;
+
+	ast_mutex_lock(&info_thread.lock);
+	AST_LIST_INSERT_TAIL(&info_thread.info_events, new_event, list); 
+	ast_cond_signal(&info_thread.cond);
+	ast_mutex_unlock(&info_thread.lock);
+}
 
 /*! \brief The handler for manager subscriptions
  * In its rudimentary stage here, all this does is iterate
  * through the IEs in the event and print them as debug messages
- *
- * \param event the event we have subscribed to
- * \param ignore unused parameter, I suspect it will one day become a filter pointer
  */
-static void info_cb(const struct ast_event *event, void *ignore)
+static void *event_spitter(void *thisvariableissoimportantiamafraidtoactuallyuseit)
 {
-	struct ast_event_iterator iter;
-	int res = 0;
+	for (;;) {
+		struct ast_event_iterator iter;
+		int res = 0;
+		struct info_event *event = NULL;
+		ast_mutex_lock(&info_thread.lock);
+		if (!(event = AST_LIST_REMOVE_HEAD(&info_thread.info_events, list))) {
+			ast_cond_wait(&info_thread.cond, &info_thread.lock);
+			event = AST_LIST_REMOVE_HEAD(&info_thread.info_events, list);
+		}
+		ast_mutex_unlock(&info_thread.lock);
 
-	for(ast_event_iterator_init(&iter, event); !res; res = ast_event_iterator_next(&iter)) {
-		enum ast_event_ie_type ie_type = ast_event_iterator_get_ie_type(&iter);
-		if (ie_type == AST_EVENT_IE_END)
-			break;
-		if (info_map[ie_type].pltype == AST_EVENT_IE_PLTYPE_STR)
-			ast_log(LOG_DEBUG, "%s: %s\r\n", info_map[ie_type].name, ast_event_iterator_get_ie_str(&iter));
-		else if (info_map[ie_type].pltype == AST_EVENT_IE_PLTYPE_UINT)
-			ast_log(LOG_DEBUG, "%s: %u\r\n", info_map[ie_type].name, ast_event_iterator_get_ie_uint(&iter));
+		ast_log(LOG_DEBUG, "NEW EVENT: %s\n", queue_map[ast_event_get_type(event->event) - QUEUE_EVENT_BEGIN].name);
+
+		for (ast_event_iterator_init(&iter, event->event); !res; res = ast_event_iterator_next(&iter)) {
+			enum ast_event_ie_type ie_type = ast_event_iterator_get_ie_type(&iter);
+			if (ie_type == AST_EVENT_IE_END)
+				break;
+			if (info_map[ie_type].pltype == AST_EVENT_IE_PLTYPE_STR)
+				ast_log(LOG_DEBUG, "%s: %s\r\n", info_map[ie_type].name, ast_event_iterator_get_ie_str(&iter));
+			else if (info_map[ie_type].pltype == AST_EVENT_IE_PLTYPE_UINT)
+				ast_log(LOG_DEBUG, "%s: %u\r\n", info_map[ie_type].name, ast_event_iterator_get_ie_uint(&iter));
+		}
+		printf("\r\n");
+		fflush(stdout);
+		ast_event_destroy(event->event);
+		ast_free(event);
+		event = NULL;
 	}
+
+	return NULL;
 }
 
 static int unload_module(void)
 {
-	if (manager_sub)
-		ast_event_unsubscribe(manager_sub);
+	int i;
+	for (i = 0; manager_sub[i]; i++)
+		ast_event_unsubscribe(manager_sub[i]);
 	return 0;
 }
 
 static int load_module(void)
 {
-	manager_sub = ast_event_subscribe(AST_EVENT_INFO, info_cb, NULL, AST_EVENT_IE_END);
+	int i;
+	for (i = 0; i < (sizeof(queue_map) / sizeof(queue_map[0])); i++) {
+		manager_sub[i] = ast_event_subscribe(queue_map[i].type, info_cb, NULL, AST_EVENT_IE_END);
+	}
+	ast_mutex_init(&info_thread.lock);
+	ast_cond_init(&info_thread.cond, NULL);
+	ast_pthread_create_background(&info_thread.thread, NULL, event_spitter, NULL);
 	return AST_MODULE_LOAD_SUCCESS; 
 }
 




More information about the asterisk-commits mailing list