[asterisk-commits] rmudgett: trunk r367520 - /trunk/channels/iax2-parser.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed May 23 19:36:23 CDT 2012


Author: rmudgett
Date: Wed May 23 19:36:19 2012
New Revision: 367520

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=367520
Log:
Made use IAX frame cache only for cacheable frame types.

Modified:
    trunk/channels/iax2-parser.c

Modified: trunk/channels/iax2-parser.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/iax2-parser.c?view=diff&rev=367520&r1=367519&r2=367520
==============================================================================
--- trunk/channels/iax2-parser.c (original)
+++ trunk/channels/iax2-parser.c Wed May 23 19:36:19 2012
@@ -1168,51 +1168,60 @@
 
 struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheable)
 {
-	struct iax_frame *fr = NULL;
+	struct iax_frame *fr;
 
 #if !defined(LOW_MEMORY)
-	struct iax_frames *iax_frames = NULL;
-	struct iax_frame *smallest = NULL;
-
-	/* 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;
-				AST_LIST_REMOVE_CURRENT(list);
-				iax_frames->size--;
-				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 (iax_frames && 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);
+	if (cacheable) {
+		struct iax_frames *iax_frames;
+		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;
+					AST_LIST_REMOVE_CURRENT(list);
+					iax_frames->size--;
+					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 (iax_frames->size >= FRAME_CACHE_MAX_SIZE && smallest) {
+					/* Make useless cache into something more useful */
+					AST_LIST_REMOVE(&iax_frames->list, smallest, list);
+					iax_frames->size--;
+					ast_free(smallest);
+				}
+				if (!(fr = ast_calloc_cache(1, sizeof(*fr) + datalen))) {
+					return NULL;
+				}
+				fr->afdatalen = datalen;
+			}
+		} else {
+			if (!(fr = ast_calloc_cache(1, sizeof(*fr) + datalen))) {
 				return NULL;
 			}
-		} else if (!(fr = ast_calloc_cache(1, sizeof(*fr) + datalen)))
+			fr->afdatalen = datalen;
+		}
+		fr->cacheable = 1;
+	} else
+#endif
+	{
+		if (!(fr = ast_calloc(1, sizeof(*fr) + datalen))) {
 			return NULL;
+		}
 		fr->afdatalen = datalen;
 	}
-#else
-	if (!(fr = ast_calloc(1, sizeof(*fr) + datalen)))
-		return NULL;
-	fr->afdatalen = datalen;
-#endif
 
 
 	fr->direction = direction;
 	fr->retrans = -1;
-	fr->cacheable = cacheable;
 	
 	if (fr->direction == DIRECTION_INGRESS)
 		ast_atomic_fetchadd_int(&iframes, 1);




More information about the asterisk-commits mailing list