diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-25 05:37:29 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-25 05:37:29 +0000 |
commit | b902e3122f0c3b08f04123e6c879282fe2f47031 (patch) | |
tree | 5e5272d767d810b7e249a917ab3a10a118a88564 /utils | |
parent | b89088272a8ece7a5158f040d1975ff607f667a0 (diff) |
don't leak almost 200 bytes for each new channel and store the active
channel list using the linked list macros (issue #6330)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@8618 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'utils')
-rw-r--r-- | utils/astman.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/utils/astman.c b/utils/astman.c index c74f5f787..09f290060 100644 --- a/utils/astman.c +++ b/utils/astman.c @@ -39,6 +39,7 @@ #include "asterisk/md5.h" #include "asterisk/manager.h" +#include "asterisk/linkedlists.h" #undef gethostbyname @@ -60,15 +61,17 @@ static struct ast_mansession { int inlen; } session; -static struct ast_chan { +struct ast_chan { char name[80]; char exten[20]; char context[20]; char priority[20]; char callerid[40]; char state[10]; - struct ast_chan *next; -} *chans; + AST_LIST_ENTRY(ast_chan) list; +}; + +static AST_LIST_HEAD_NOLOCK_STATIC(chans, ast_chan); /* dummy functions to be compatible with the Asterisk core for md5.c */ void ast_register_file_version(const char *file, const char *version); @@ -83,39 +86,31 @@ void ast_unregister_file_version(const char *file) static struct ast_chan *find_chan(char *name) { - struct ast_chan *prev = NULL, *chan = chans; - while(chan) { + struct ast_chan *chan; + AST_LIST_TRAVERSE(&chans, chan, list) { if (!strcmp(name, chan->name)) return chan; - prev = chan; - chan = chan->next; } chan = malloc(sizeof(struct ast_chan)); if (chan) { memset(chan, 0, sizeof(struct ast_chan)); strncpy(chan->name, name, sizeof(chan->name) - 1); - if (prev) - prev->next = chan; - else - chans = chan; + AST_LIST_INSERT_TAIL(&chans, chan, list); } return chan; } static void del_chan(char *name) { - struct ast_chan *prev = NULL, *chan = chans; - while(chan) { + struct ast_chan *chan; + AST_LIST_TRAVERSE_SAFE_BEGIN(&chans, chan, list) { if (!strcmp(name, chan->name)) { - if (prev) - prev->next = chan->next; - else - chans = chan->next; + AST_LIST_REMOVE_CURRENT(&chans, list); + free(chan); return; } - prev = chan; - chan = chan->next; } + AST_LIST_TRAVERSE_SAFE_END } static void fdprintf(int fd, char *fmt, ...) @@ -246,8 +241,7 @@ static void rebuild_channels(newtComponent c) int x=0; prev = newtListboxGetCurrent(c); newtListboxClear(c); - chan = chans; - while(chan) { + AST_LIST_TRAVERSE(&chans, chan, list) { snprintf(tmpn, sizeof(tmpn), "%s (%s)", chan->name, chan->callerid); if (strlen(chan->exten)) snprintf(tmp, sizeof(tmp), "%-30s %8s -> %s@%s:%s", @@ -258,7 +252,6 @@ static void rebuild_channels(newtComponent c) tmpn, chan->state); newtListboxAppendEntry(c, tmp, chan); x++; - chan = chan->next; } if (!x) newtListboxAppendEntry(c, " << No Active Channels >> ", NULL); |