mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 20:20:07 +00:00
In case we have some processing threads that free more frames than they allocate,
do not let the frame cache grow forever. (closes issue #13160) Reported by: tavius Tested by: tavius, russell git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@134814 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -58,7 +58,14 @@ AST_THREADSTORAGE_CUSTOM(frame_cache, frame_cache_init, frame_cache_cleanup);
|
|||||||
|
|
||||||
/*! \brief This is just so iax_frames, a list head struct for holding a list of
|
/*! \brief This is just so iax_frames, a list head struct for holding a list of
|
||||||
* iax_frame structures, is defined. */
|
* iax_frame structures, is defined. */
|
||||||
AST_LIST_HEAD_NOLOCK(iax_frames, iax_frame);
|
AST_LIST_HEAD_NOLOCK(iax_frame_list, iax_frame);
|
||||||
|
|
||||||
|
struct iax_frames {
|
||||||
|
struct iax_frame_list list;
|
||||||
|
size_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FRAME_CACHE_MAX_SIZE 20
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void internaloutput(const char *str)
|
static void internaloutput(const char *str)
|
||||||
@@ -957,10 +964,11 @@ struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheab
|
|||||||
|
|
||||||
/* Attempt to get a frame from this thread's cache */
|
/* Attempt to get a frame from this thread's cache */
|
||||||
if ((iax_frames = ast_threadstorage_get(&frame_cache, sizeof(*iax_frames)))) {
|
if ((iax_frames = ast_threadstorage_get(&frame_cache, sizeof(*iax_frames)))) {
|
||||||
AST_LIST_TRAVERSE_SAFE_BEGIN(iax_frames, fr, list) {
|
AST_LIST_TRAVERSE_SAFE_BEGIN(&iax_frames->list, fr, list) {
|
||||||
if (fr->afdatalen >= datalen) {
|
if (fr->afdatalen >= datalen) {
|
||||||
size_t afdatalen = fr->afdatalen;
|
size_t afdatalen = fr->afdatalen;
|
||||||
AST_LIST_REMOVE_CURRENT(iax_frames, list);
|
AST_LIST_REMOVE_CURRENT(&iax_frames->list, list);
|
||||||
|
iax_frames->size--;
|
||||||
memset(fr, 0, sizeof(*fr));
|
memset(fr, 0, sizeof(*fr));
|
||||||
fr->afdatalen = afdatalen;
|
fr->afdatalen = afdatalen;
|
||||||
break;
|
break;
|
||||||
@@ -1017,11 +1025,14 @@ void iax_frame_free(struct iax_frame *fr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (iax_frames->size < FRAME_CACHE_MAX_SIZE) {
|
||||||
fr->direction = 0;
|
fr->direction = 0;
|
||||||
AST_LIST_INSERT_HEAD(iax_frames, fr, list);
|
AST_LIST_INSERT_HEAD(&iax_frames->list, fr, list);
|
||||||
#else
|
iax_frames->size++;
|
||||||
free(fr);
|
return;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
free(fr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(LOW_MEMORY)
|
#if !defined(LOW_MEMORY)
|
||||||
@@ -1030,7 +1041,7 @@ static void frame_cache_cleanup(void *data)
|
|||||||
struct iax_frames *frames = data;
|
struct iax_frames *frames = data;
|
||||||
struct iax_frame *cur;
|
struct iax_frame *cur;
|
||||||
|
|
||||||
while ((cur = AST_LIST_REMOVE_HEAD(frames, list)))
|
while ((cur = AST_LIST_REMOVE_HEAD(&frames->list, list)))
|
||||||
free(cur);
|
free(cur);
|
||||||
|
|
||||||
free(frames);
|
free(frames);
|
||||||
|
Reference in New Issue
Block a user