[asterisk-commits] russell: branch russell/frame_caching r38632 - in /team/russell/frame_caching...

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Mon Jul 31 19:25:11 MST 2006


Author: russell
Date: Mon Jul 31 21:25:10 2006
New Revision: 38632

URL: http://svn.digium.com/view/asterisk?rev=38632&view=rev
Log:
Gather some more statistics for the ast_frame and iax_frame caches

So far, the ast_frame cache is working great, but I'm not happy with how well
the iax_frame cache is working ...

Modified:
    team/russell/frame_caching/channels/chan_iax2.c
    team/russell/frame_caching/channels/iax2-parser.c
    team/russell/frame_caching/channels/iax2-parser.h
    team/russell/frame_caching/frame.c

Modified: team/russell/frame_caching/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/russell/frame_caching/channels/chan_iax2.c?rev=38632&r1=38631&r2=38632&view=diff
==============================================================================
--- team/russell/frame_caching/channels/chan_iax2.c (original)
+++ team/russell/frame_caching/channels/chan_iax2.c Mon Jul 31 21:25:10 2006
@@ -1069,8 +1069,10 @@
 {
 	struct iax_frame *new = iax_frame_new(DIRECTION_INGRESS, fr->af.datalen);
 	if (new) {
-		memcpy(new, fr, sizeof(struct iax_frame));	
+		size_t mallocd_datalen = new->mallocd_datalen;
+		memcpy(new, fr, sizeof(*new));
 		iax_frame_wrap(new, &fr->af);
+		new->mallocd_datalen = mallocd_datalen;
 		new->data = NULL;
 		new->datalen = 0;
 		new->direction = DIRECTION_INGRESS;
@@ -2077,7 +2079,17 @@
 	ast_cli(fd, "    IAX Statistics\n");
 	ast_cli(fd, "---------------------\n");
 	ast_cli(fd, "Outstanding frames: %d (%d ingress, %d egress)\n", iax_get_frames(), iax_get_iframes(), iax_get_oframes());
-	ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n", dead, final, cnt);
+	ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n\n", dead, final, cnt);
+	
+	ast_cli(fd, "    IAX Frame Cache Statistics\n"
+			"---------------------------------------\n"
+			"Added to Cache:     %d\n"
+			"Removed from Cache: %d\n"
+			"Frames Allocated:   %d\n"
+			"Frames Freed        %d\n\n",
+			iax_get_added_to_cache(), iax_get_removed_from_cache(),
+			iax_get_frames_allocated(), iax_get_frames_freed());
+
 	return RESULT_SUCCESS;
 }
 

Modified: team/russell/frame_caching/channels/iax2-parser.c
URL: http://svn.digium.com/view/asterisk/team/russell/frame_caching/channels/iax2-parser.c?rev=38632&r1=38631&r2=38632&view=diff
==============================================================================
--- team/russell/frame_caching/channels/iax2-parser.c (original)
+++ team/russell/frame_caching/channels/iax2-parser.c Mon Jul 31 21:25:10 2006
@@ -49,6 +49,11 @@
 static int frames = 0;
 static int iframes = 0;
 static int oframes = 0;
+
+static unsigned int added_to_cache = 0;
+static unsigned int removed_from_cache = 0;
+static unsigned int frames_allocated = 0;
+static unsigned int frames_freed = 0;
 
 static void frame_cache_cleanup(void *data);
 
@@ -947,14 +952,19 @@
 				AST_LIST_REMOVE_CURRENT(iax_frames, list);
 				memset(fr, 0, sizeof(*fr));
 				fr->mallocd_datalen = mallocd_datalen;
+				ast_atomic_fetchadd_int((int *) &removed_from_cache, 1);
 				break;
 			}
 		}
 		AST_LIST_TRAVERSE_SAFE_END
 	}
 
-	if (!fr && !(fr = ast_calloc(1, sizeof(*fr) + datalen)))
-		return NULL;
+	if (!fr) {
+		if (!(fr = ast_calloc(1, sizeof(*fr) + datalen)))
+			return NULL;
+		ast_atomic_fetchadd_int((int *) &frames_allocated, 1);
+		fr->mallocd_datalen = datalen;
+	}
 
 	fr->direction = direction;
 	fr->retrans = -1;
@@ -986,15 +996,18 @@
 
 	if (!cache) {
 		free(fr);
+		ast_atomic_fetchadd_int((int *) &frames_freed, 1);
 		return;
 	}
 
 	if (!(iax_frames = ast_threadstorage_get(&frame_cache, sizeof(*iax_frames)))) {
 		free(fr);
+		ast_atomic_fetchadd_int((int *) &frames_freed, 1);
 		return;
 	}
 
 	AST_LIST_INSERT_HEAD(iax_frames, fr, list);
+	ast_atomic_fetchadd_int((int *) &added_to_cache, 1);
 }
 
 static void frame_cache_cleanup(void *data)
@@ -1002,8 +1015,10 @@
 	struct iax_frames *frames = data;
 	struct iax_frame *cur;
 
-	while ((cur = AST_LIST_REMOVE_HEAD(frames, list)))
+	while ((cur = AST_LIST_REMOVE_HEAD(frames, list))) {
 		__iax_frame_free(cur, 0);
+		ast_atomic_fetchadd_int((int *) &frames_freed, 1);
+	}
 
 	free(frames);
 }
@@ -1016,3 +1031,9 @@
 int iax_get_frames(void) { return frames; }
 int iax_get_iframes(void) { return iframes; }
 int iax_get_oframes(void) { return oframes; }
+
+unsigned int iax_get_added_to_cache(void) { return added_to_cache; }
+unsigned int iax_get_removed_from_cache(void) { return removed_from_cache; }
+unsigned int iax_get_frames_allocated(void) { return frames_allocated; }
+unsigned int iax_get_frames_freed(void) { return frames_freed; }
+

Modified: team/russell/frame_caching/channels/iax2-parser.h
URL: http://svn.digium.com/view/asterisk/team/russell/frame_caching/channels/iax2-parser.h?rev=38632&r1=38631&r2=38632&view=diff
==============================================================================
--- team/russell/frame_caching/channels/iax2-parser.h (original)
+++ team/russell/frame_caching/channels/iax2-parser.h Mon Jul 31 21:25:10 2006
@@ -152,6 +152,11 @@
 int iax_get_iframes(void);
 int iax_get_oframes(void);
 
+unsigned int iax_get_added_to_cache(void);
+unsigned int iax_get_removed_from_cache(void);
+unsigned int iax_get_frames_allocated(void);
+unsigned int iax_get_frames_freed(void);
+
 void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f);
 struct iax_frame *iax_frame_new(int direction, int datalen);
 void iax_frame_free(struct iax_frame *fr);

Modified: team/russell/frame_caching/frame.c
URL: http://svn.digium.com/view/asterisk/team/russell/frame_caching/frame.c?rev=38632&r1=38631&r2=38632&view=diff
==============================================================================
--- team/russell/frame_caching/frame.c (original)
+++ team/russell/frame_caching/frame.c Mon Jul 31 21:25:10 2006
@@ -60,6 +60,8 @@
 
 static unsigned int added_to_cache = 0;
 static unsigned int removed_from_cache = 0;
+static unsigned int headers_allocated = 0;
+static unsigned int headers_freed = 0;
 
 static void frame_cache_cleanup(void *data);
 
@@ -291,6 +293,8 @@
 	if (!(f = ast_calloc(1, sizeof(*f))))
 		return NULL;
 
+	ast_atomic_fetchadd_int((int *) &headers_allocated, 1);
+
 	f->mallocd_hdr_len = sizeof(*f);
 #ifdef TRACE_FRAMES
 	AST_LIST_LOCK(&headerlist);
@@ -307,8 +311,10 @@
 	struct ast_frames *frames = data;
 	struct ast_frame *f;
 
-	while ((f = AST_LIST_REMOVE_HEAD(frames, frame_list)))
+	while ((f = AST_LIST_REMOVE_HEAD(frames, frame_list))) {
 		free(f);
+		ast_atomic_fetchadd_int((int *) &headers_freed, 1);
+	}
 	
 	free(frames);
 }
@@ -372,6 +378,7 @@
 		AST_LIST_UNLOCK(&headerlist);
 #endif			
 		free(fr);
+		ast_atomic_fetchadd_int((int *) &headers_freed, 1);
 	}
 }
 
@@ -472,6 +479,7 @@
 	if (!buf) {
 		if (!(buf = ast_calloc(1, len)))
 			return NULL;
+		ast_atomic_fetchadd_int((int *) &headers_allocated, 1);
 		out = buf;
 		out->mallocd_hdr_len = len;
 	}
@@ -995,8 +1003,11 @@
 	ast_cli(fd, "Frame cache statistics\n"
 			"------------------------------------------------------------\n"
 			"Added to cache:      %d\n"
-			"Removed from cache:  %d\n",
-			added_to_cache, removed_from_cache);
+			"Removed from cache:  %d\n"
+			"Headers Allocated:   %d\n"
+			"Headers Freed:       %d\n\n",
+			added_to_cache, removed_from_cache,
+			headers_allocated, headers_freed);
 	
 	return RESULT_SUCCESS;
 }



More information about the asterisk-commits mailing list