@ -49,6 +49,7 @@ static int headers;
static AST_LIST_HEAD_STATIC ( headerlist , ast_frame ) ;
static AST_LIST_HEAD_STATIC ( headerlist , ast_frame ) ;
# endif
# endif
# if !defined(LOW_MEMORY)
static void frame_cache_cleanup ( void * data ) ;
static void frame_cache_cleanup ( void * data ) ;
/*! \brief A per-thread cache of frame headers */
/*! \brief A per-thread cache of frame headers */
@ -73,6 +74,7 @@ struct ast_frame_cache {
struct ast_frames list ;
struct ast_frames list ;
size_t size ;
size_t size ;
} ;
} ;
# endif
# define SMOOTHER_SIZE 8000
# define SMOOTHER_SIZE 8000
@ -288,6 +290,8 @@ void ast_smoother_free(struct ast_smoother *s)
static struct ast_frame * ast_frame_header_new ( void )
static struct ast_frame * ast_frame_header_new ( void )
{
{
struct ast_frame * f ;
struct ast_frame * f ;
# if !defined(LOW_MEMORY)
struct ast_frame_cache * frames ;
struct ast_frame_cache * frames ;
if ( ( frames = ast_threadstorage_get ( & frame_cache , sizeof ( * frames ) ) ) ) {
if ( ( frames = ast_threadstorage_get ( & frame_cache , sizeof ( * frames ) ) ) ) {
@ -300,6 +304,7 @@ static struct ast_frame *ast_frame_header_new(void)
return f ;
return f ;
}
}
}
}
# endif
if ( ! ( f = ast_calloc_cache ( 1 , sizeof ( * f ) ) ) )
if ( ! ( f = ast_calloc_cache ( 1 , sizeof ( * f ) ) ) )
return NULL ;
return NULL ;
@ -315,6 +320,7 @@ static struct ast_frame *ast_frame_header_new(void)
return f ;
return f ;
}
}
# if !defined(LOW_MEMORY)
static void frame_cache_cleanup ( void * data )
static void frame_cache_cleanup ( void * data )
{
{
struct ast_frame_cache * frames = data ;
struct ast_frame_cache * frames = data ;
@ -325,12 +331,14 @@ static void frame_cache_cleanup(void *data)
free ( frames ) ;
free ( frames ) ;
}
}
# endif
void ast_frame_free ( struct ast_frame * fr , int cache )
void ast_frame_free ( struct ast_frame * fr , int cache )
{
{
if ( ! fr - > mallocd )
if ( ! fr - > mallocd )
return ;
return ;
# if !defined(LOW_MEMORY)
if ( cache & & fr - > mallocd = = AST_MALLOCD_HDR ) {
if ( cache & & fr - > mallocd = = AST_MALLOCD_HDR ) {
/* Cool, only the header is malloc'd, let's just cache those for now
/* Cool, only the header is malloc'd, let's just cache those for now
* to keep things simple . . . */
* to keep things simple . . . */
@ -343,6 +351,7 @@ void ast_frame_free(struct ast_frame *fr, int cache)
return ;
return ;
}
}
}
}
# endif
if ( fr - > mallocd & AST_MALLOCD_DATA ) {
if ( fr - > mallocd & AST_MALLOCD_DATA ) {
if ( fr - > data )
if ( fr - > data )
@ -426,11 +435,14 @@ struct ast_frame *ast_frisolate(struct ast_frame *fr)
struct ast_frame * ast_frdup ( const struct ast_frame * f )
struct ast_frame * ast_frdup ( const struct ast_frame * f )
{
{
struct ast_frame_cache * frames ;
struct ast_frame * out = NULL ;
struct ast_frame * out = NULL ;
int len , srclen = 0 ;
int len , srclen = 0 ;
void * buf = NULL ;
void * buf = NULL ;
# if !defined(LOW_MEMORY)
struct ast_frame_cache * frames ;
# endif
/* Start with standard stuff */
/* Start with standard stuff */
len = sizeof ( * out ) + AST_FRIENDLY_OFFSET + f - > datalen ;
len = sizeof ( * out ) + AST_FRIENDLY_OFFSET + f - > datalen ;
/* If we have a source, add space for it */
/* If we have a source, add space for it */
@ -443,6 +455,7 @@ struct ast_frame *ast_frdup(const struct ast_frame *f)
if ( srclen > 0 )
if ( srclen > 0 )
len + = srclen + 1 ;
len + = srclen + 1 ;
# if !defined(LOW_MEMORY)
if ( ( frames = ast_threadstorage_get ( & frame_cache , sizeof ( * frames ) ) ) ) {
if ( ( frames = ast_threadstorage_get ( & frame_cache , sizeof ( * frames ) ) ) ) {
AST_LIST_TRAVERSE_SAFE_BEGIN ( & frames - > list , out , frame_list ) {
AST_LIST_TRAVERSE_SAFE_BEGIN ( & frames - > list , out , frame_list ) {
if ( out - > mallocd_hdr_len > = len ) {
if ( out - > mallocd_hdr_len > = len ) {
@ -457,6 +470,8 @@ struct ast_frame *ast_frdup(const struct ast_frame *f)
}
}
AST_LIST_TRAVERSE_SAFE_END
AST_LIST_TRAVERSE_SAFE_END
}
}
# endif
if ( ! buf ) {
if ( ! buf ) {
if ( ! ( buf = ast_calloc_cache ( 1 , len ) ) )
if ( ! ( buf = ast_calloc_cache ( 1 , len ) ) )
return NULL ;
return NULL ;