[svn-commits] tilghman: trunk r134867 - /trunk/channels/iax2-parser.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Jul 31 14:03:41 CDT 2008


Author: tilghman
Date: Thu Jul 31 14:03:41 2008
New Revision: 134867

URL: http://svn.digium.com/view/asterisk?view=rev&rev=134867
Log:
Optimize frame cache by realloc'ing the smallest frame when the cache is full.
This ensures that we don't just keep a cache of tiny frames, continually doing
an alloc/free for each data frame, thus negating the point of having a cache.

Modified:
    trunk/channels/iax2-parser.c

Modified: trunk/channels/iax2-parser.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/iax2-parser.c?view=diff&rev=134867&r1=134866&r2=134867
==============================================================================
--- trunk/channels/iax2-parser.c (original)
+++ trunk/channels/iax2-parser.c Thu Jul 31 14:03:41 2008
@@ -999,9 +999,11 @@
 
 #if !defined(LOW_MEMORY)
 	struct iax_frames *iax_frames = NULL;
+	struct iax_frame *smallest;
 
 	/* Attempt to get a frame from this thread's cache */
 	if ((iax_frames = ast_threadstorage_get(&frame_cache, sizeof(*iax_frames)))) {
+		smallest = AST_LIST_FIRST(&iax_frames->list);
 		AST_LIST_TRAVERSE_SAFE_BEGIN(&iax_frames->list, fr, list) {
 			if (fr->afdatalen >= datalen) {
 				size_t afdatalen = fr->afdatalen;
@@ -1010,12 +1012,21 @@
 				memset(fr, 0, sizeof(*fr));
 				fr->afdatalen = afdatalen;
 				break;
+			} else if (smallest->afdatalen > fr->afdatalen) {
+				smallest = fr;
 			}
 		}
 		AST_LIST_TRAVERSE_SAFE_END;
 	}
 	if (!fr) {
-		if (!(fr = ast_calloc_cache(1, sizeof(*fr) + datalen)))
+		if (iax_frames->size >= FRAME_CACHE_MAX_SIZE && smallest) {
+			/* Make useless cache into something more useful */
+			AST_LIST_REMOVE(&iax_frames->list, smallest, list);
+			if (!(fr = ast_realloc(smallest, sizeof(*fr) + datalen))) {
+				AST_LIST_INSERT_TAIL(&iax_frames->list, smallest, list);
+				return NULL;
+			}
+		} else if (!(fr = ast_calloc_cache(1, sizeof(*fr) + datalen)))
 			return NULL;
 		fr->afdatalen = datalen;
 	}
@@ -1065,7 +1076,13 @@
 
 	if (iax_frames->size < FRAME_CACHE_MAX_SIZE) {
 		fr->direction = 0;
-		AST_LIST_INSERT_HEAD(&iax_frames->list, fr, list);
+		/* Pseudo-sort: keep smaller frames at the top of the list. This should
+		 * increase the chance that we pick the smallest applicable frame for use. */
+		if (AST_LIST_FIRST(&iax_frames->list) && AST_LIST_FIRST(&iax_frames->list)->afdatalen < fr->afdatalen) {
+			AST_LIST_INSERT_TAIL(&iax_frames->list, fr, list);
+		} else {
+			AST_LIST_INSERT_HEAD(&iax_frames->list, fr, list);
+		}
 		iax_frames->size++;
 		return;
 	}




More information about the svn-commits mailing list