[Freeswitch-svn] [commit] r7929 - freeswitch/trunk/src/mod/applications/mod_fifo

Freeswitch SVN anthm at freeswitch.org
Wed Mar 19 12:03:51 EDT 2008


Author: anthm
Date: Wed Mar 19 12:03:51 2008
New Revision: 7929

Modified:
   freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c

Log:
update

Modified: freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c	Wed Mar 19 12:03:51 2008
@@ -36,6 +36,20 @@
 
 #define FIFO_EVENT "fifo::info"
 
+#define MAX_PRI 10
+
+struct fifo_node {
+    char *name;
+    switch_mutex_t *mutex;
+    switch_queue_t *fifo_list[MAX_PRI];
+    switch_hash_t *caller_hash;
+    switch_hash_t *consumer_hash;
+    int caller_count;
+    int waiting_count;
+    int consumer_count;
+};
+
+typedef struct fifo_node fifo_node_t;
 
 
 static switch_status_t on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
@@ -66,10 +80,17 @@
 
 static switch_status_t read_frame_callback(switch_core_session_t *session, switch_frame_t *frame, void *user_data)
 {
-    switch_queue_t *fifo = (switch_queue_t *) user_data;
-    if (switch_queue_size(fifo)) {
+	fifo_node_t *node = (fifo_node_t *) user_data;
+	int x = 0, total = 0;
+	
+	for (x = 0; x < MAX_PRI; x++) {
+		total += switch_queue_size(node->fifo_list[x]);
+	}
+
+    if (total) {
         return SWITCH_STATUS_FALSE;
     }
+
     return SWITCH_STATUS_SUCCESS;
 }
 
@@ -81,35 +102,24 @@
 } globals;
 
 
-struct fifo_node {
-    char *name;
-    switch_mutex_t *mutex;
-    switch_queue_t *fifo;
-    switch_hash_t *caller_hash;
-    switch_hash_t *consumer_hash;
-    int caller_count;
-    int waiting_count;
-    int consumer_count;
-};
-
-typedef struct fifo_node fifo_node_t;
-
-
 static fifo_node_t *create_node(const char *name)
 {
     fifo_node_t *node;
-
+	int x = 0;
+	
     if (!globals.running) {
         return NULL;
     }
 
     node = switch_core_alloc(globals.pool, sizeof(*node));
     node->name = switch_core_strdup(globals.pool, name);
-
-    switch_queue_create(&node->fifo, SWITCH_CORE_QUEUE_LEN, globals.pool);
+	for (x = 0; x < MAX_PRI; x++) {
+		switch_queue_create(&node->fifo_list[x], SWITCH_CORE_QUEUE_LEN, globals.pool);
+		switch_assert(node->fifo_list[x]);
+	}
     switch_core_hash_init(&node->caller_hash, globals.pool);
     switch_core_hash_init(&node->consumer_hash, globals.pool);
-    switch_assert(node->fifo);
+	
     switch_mutex_init(&node->mutex, SWITCH_MUTEX_NESTED, globals.pool);
     switch_core_hash_insert(globals.fifo_hash, name, node);
 
@@ -228,6 +238,8 @@
 
     if (!strcasecmp(argv[1], "in")) {
         const char *uuid = strdup(switch_core_session_get_uuid(session));
+		const char *pri;
+		int p = 0;
 
         switch_channel_answer(channel);
 
@@ -253,7 +265,17 @@
         node->waiting_count++;
         send_presence(node);
         switch_core_hash_insert(node->caller_hash, uuid, session);
-        switch_queue_push(node->fifo, (void *)uuid);
+
+        if ((pri = switch_channel_get_variable(channel, "fifo_priority"))) {
+			p = atoi(pri);
+		}
+
+		if (p >= MAX_PRI) {
+			p = MAX_PRI - 1;
+		}
+
+        switch_queue_push(node->fifo_list[p], (void *)uuid);
+
         switch_mutex_unlock(node->mutex);
 
         ts = switch_timestamp_now();
@@ -311,7 +333,11 @@
         int done = 0;
         switch_core_session_t *other_session;
         switch_input_args_t args = { 0 };
-
+		const char *pop_order = NULL;
+		int custom_pop = 0;
+		int pop_array[MAX_PRI] = { 0 };
+		char *pop_list[MAX_PRI] = { 0 };
+		
         if (argc > 3) {
             announce = argv[3];
         }
@@ -344,27 +370,58 @@
         switch_channel_set_variable(channel, "fifo_status", "WAITING");
         switch_channel_set_variable(channel, "fifo_timestamp", date);
 
+        if ((pop_order = switch_channel_get_variable(channel, "fifo_pop_order"))) {
+			char *tmp = switch_core_session_strdup(session, pop_order);
+			int x;
+			custom_pop = switch_separate_string(tmp, ',', pop_list, (sizeof(pop_list) / sizeof(pop_list[0])));
+			if (custom_pop >= MAX_PRI) {
+				custom_pop = MAX_PRI -1;
+			}
+
+			for (x = 0; x < custom_pop; x++) {
+				int tmp = atoi(pop_list[x]);
+				if (tmp > -1 && tmp < MAX_PRI) {
+					pop_array[x] = tmp;
+				}
+			}
+		}
+		
 		while(switch_channel_ready(channel)) {
+			int x = 0 ;
             if (moh) {
                 args.read_frame_callback = read_frame_callback;
-                args.user_data = node->fifo;
+                args.user_data = node;
                 switch_ivr_play_file(session, NULL, moh, &args);
             }
+			
+			if (custom_pop) {
+				for(x = 0; x < MAX_PRI; x++) {
+					if (switch_queue_trypop(node->fifo_list[pop_array[x]], &pop) == SWITCH_STATUS_SUCCESS && pop) {
+						break;
+					}
+				}
+			} else {
+				for(x = 0; x < MAX_PRI; x++) {
+					if (switch_queue_trypop(node->fifo_list[x], &pop) == SWITCH_STATUS_SUCCESS && pop) {
+						break;
+					}
+				}
+			}
 
-            if (switch_queue_trypop(node->fifo, &pop) != SWITCH_STATUS_SUCCESS) {
+			if (!pop) {
                 if (nowait) {
                     break;
                 }
+
                 status = switch_core_session_read_frame(session, &read_frame, -1, 0);
+
                 if (!SWITCH_READ_ACCEPTABLE(status)) {
                     break;
                 }
+
                 continue;
             }
-            if (!pop) {
-                break;
-            }
-
+			
             uuid = (char *) pop;
 
             if ((other_session = switch_core_session_locate(uuid))) {
@@ -615,9 +672,13 @@
     } else if (!strcasecmp(argv[0], "count")) {
         if (argc < 2) {
             for (hi = switch_hash_first(NULL, globals.fifo_hash); hi; hi = switch_hash_next(hi)) {
+				int x = 0;
                 switch_hash_this(hi, &var, NULL, &val);
                 node = (fifo_node_t *) val;
-                len = switch_queue_size(node->fifo);
+				len = 0;
+				for (x = 0 ;x < MAX_PRI; x++) {
+					len += switch_queue_size(node->fifo_list[x]);
+				}
                 switch_mutex_lock(node->mutex);
                 stream->write_function(stream, "%s:%d:%d:%d\n", (char *)var, node->consumer_count, node->caller_count, len);
                 switch_mutex_unlock(node->mutex);
@@ -629,7 +690,12 @@
             }
         } else {
             if ((node = switch_core_hash_find(globals.fifo_hash, argv[1]))) {
-                len = switch_queue_size(node->fifo);
+				int x = 0;
+				len = 0;
+				for (x = 0 ;x < MAX_PRI; x++) {
+                    len += switch_queue_size(node->fifo_list[x]);
+                }
+				
             }
             switch_mutex_lock(node->mutex);
             stream->write_function(stream, "%s:%d:%d:%d\n", argv[1], node->consumer_count, node->caller_count, len);
@@ -689,11 +755,14 @@
     globals.running = 0;
     /* Cleanup*/
     for (hi = switch_hash_first(NULL, globals.fifo_hash); hi; hi = switch_hash_next(hi)) {
+		int x = 0 ;
         switch_hash_this(hi, NULL, NULL, &val);
         node = (fifo_node_t *) val;
-        while (switch_queue_trypop(node->fifo, &pop) == SWITCH_STATUS_SUCCESS) {
-            free(pop);
-        }
+		for (x = 0; x < MAX_PRI; x++) {
+			while (switch_queue_trypop(node->fifo_list[x], &pop) == SWITCH_STATUS_SUCCESS) {
+				free(pop);
+			}
+		}
         switch_core_hash_destroy(&node->caller_hash);
         switch_core_hash_destroy(&node->consumer_hash);
     }



More information about the Freeswitch-svn mailing list