FreeTDM: Rewrite "ftdm core" print_* functions (to use new span iterator)

Simplify code by using shared string constants using bool (0/1) index,
!!-operator and negation-via-XOR.

Future optimization: Preallocate and re-use of iterators, to avoid
repeatedly allocating and freeing of memory.

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
This commit is contained in:
Stefan Knoblich 2013-06-01 22:19:16 +02:00
parent 5154bd847b
commit e857527a3b
1 changed files with 118 additions and 141 deletions

View File

@ -4536,202 +4536,179 @@ FT_DECLARE(ftdm_status_t) ftdm_iterator_free(ftdm_iterator_t *iter)
return FTDM_SUCCESS;
}
static void print_channels_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *inspan, uint32_t inchan_id, unsigned long long flagval, int not, int *count)
static const char *print_neg_char[] = { "", "!" };
static const char *print_flag_state[] = { "OFF", "ON" };
static void print_channels_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *inspan, uint32_t inchan_id, uint64_t flagval, int not, int *count)
{
ftdm_hash_iterator_t *i = NULL;
ftdm_span_t *span;
ftdm_channel_t *fchan = NULL;
ftdm_iterator_t *citer = NULL;
ftdm_iterator_t *curr = NULL;
const void *key = NULL;
void *val = NULL;
uint32_t flag = (1 << flagval);
ftdm_bool_t neg = !!not;
const char *negind = print_neg_char[neg];
const char *flagname;
uint64_t flag = (1 << flagval);
int mycount = 0;
*count = 0;
flagname = ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid");
ftdm_mutex_lock(globals.mutex);
if (inspan) {
citer = ftdm_span_get_chan_iterator(inspan, NULL);
if (!citer) {
goto end;
}
for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) {
fchan = ftdm_iterator_current(curr);
if (!inchan_id || inchan_id == fchan->chan_id) {
if (not) {
if (!ftdm_test_flag(fchan, flag)) {
stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s) ON \n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid"));
ftdm_iterator_t *c_iter, *c_cur;
mycount++;
} else {
stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s) OFF \n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid"));
}
} else {
if (ftdm_test_flag(fchan, flag)) {
stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s) ON\n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid"));
c_iter = ftdm_span_get_chan_iterator(inspan, NULL);
mycount++;
} else {
stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s) OFF \n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid"));
}
}
}
}
ftdm_iterator_free(citer);
for (c_cur = c_iter; c_cur; c_cur = ftdm_iterator_next(c_cur)) {
ftdm_channel_t *fchan;
ftdm_bool_t cond;
} else {
for (i = hashtable_first(globals.span_hash); i; i = hashtable_next(i)) {
hashtable_this(i, &key, NULL, &val);
if (!key || !val) {
break;
}
span = val;
citer = ftdm_span_get_chan_iterator(span, NULL);
if (!citer) {
fchan = ftdm_iterator_current(c_cur);
if (inchan_id && inchan_id != fchan->chan_id) {
continue;
}
for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) {
fchan = ftdm_iterator_current(curr);
if (not && !ftdm_test_flag(fchan, flag)) {
stream->write_function(stream, "[s%dc%d][%d:%d] flag !%d(!%s)\n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid"));
mycount++;
} else if (!not && ftdm_test_flag(fchan, flag)) {
stream->write_function(stream, "[s%dc%d][%d:%d] flag %d(%s)\n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
flagval, ftdm_val2str(flag, channel_flag_strs, ftdm_array_len(channel_flag_strs), "invalid"));
cond = !!ftdm_test_flag(fchan, flag);
if (neg ^ cond) {
mycount++;
}
stream->write_function(stream, "[s%dc%d][%d:%d] flag %s%"FTDM_UINT64_FMT"(%s%s) %s\n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
negind, flagval, negind, flagname,
print_flag_state[cond]);
}
ftdm_iterator_free(c_iter);
} else {
ftdm_iterator_t *s_iter, *s_cur;
s_iter = ftdm_get_span_iterator(NULL);
for (s_cur = s_iter; s_cur; s_cur = ftdm_iterator_next(s_cur)) {
ftdm_iterator_t *c_iter, *c_cur;
ftdm_span_t *span;
span = ftdm_iterator_current(s_cur);
if (!span) {
break;
}
c_iter = ftdm_span_get_chan_iterator(span, NULL);
for (c_cur = c_iter; c_cur; c_cur = ftdm_iterator_next(c_cur)) {
ftdm_channel_t *fchan;
fchan = ftdm_iterator_current(c_cur);
if (neg ^ !!ftdm_test_flag(fchan, flag)) {
stream->write_function(stream, "[s%dc%d][%d:%d] flag %s%"FTDM_UINT64_FMT"(%s%s)\n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id,
negind, flagval, negind, flagname);
mycount++;
}
}
ftdm_iterator_free(citer);
ftdm_iterator_free(c_iter);
}
ftdm_iterator_free(s_iter);
}
*count = mycount;
end:
ftdm_mutex_unlock(globals.mutex);
}
static void print_spans_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *inspan, unsigned long long flagval, int not, int *count)
static void print_spans_by_flag(ftdm_stream_handle_t *stream, ftdm_span_t *inspan, uint64_t flagval, int not, int *count)
{
ftdm_hash_iterator_t *i = NULL;
ftdm_span_t *span;
const void *key = NULL;
void *val = NULL;
uint32_t flag = (1 << flagval);
ftdm_bool_t neg = !!not;
const char *negind = print_neg_char[neg];
const char *flagname;
uint64_t flag = (1 << flagval);
int mycount = 0;
*count = 0;
flagname = ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid");
ftdm_mutex_lock(globals.mutex);
if (inspan) {
if (not) {
if (!ftdm_test_flag(inspan, flag)) {
stream->write_function(stream, "[s%d] flag !%d(!%s) ON \n",
inspan->span_id,
flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid"));
ftdm_bool_t cond;
mycount++;
} else {
stream->write_function(stream, "[s%d] flag !%d(!%s) OFF \n",
inspan->span_id,
flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid"));
}
} else {
if (ftdm_test_flag(inspan, flag)) {
stream->write_function(stream, "[s%d] flag %d(%s) ON \n",
inspan->span_id,
flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid"));
mycount++;
} else {
stream->write_function(stream, "[s%d] flag %d(%s) OFF \n",
inspan->span_id,
flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid"));
}
cond = !!ftdm_test_flag(inspan, flag);
if (neg ^ cond) {
mycount++;
}
stream->write_function(stream, "[s%d] flag %s%"FTDM_UINT64_FMT"(%s%s) %s\n",
inspan->span_id, negind, flagval, negind, flagname,
print_flag_state[cond]);
} else {
for (i = hashtable_first(globals.span_hash); i; i = hashtable_next(i)) {
hashtable_this(i, &key, NULL, &val);
if (!key || !val) {
ftdm_iterator_t *s_iter, *s_cur;
s_iter = ftdm_get_span_iterator(NULL);
for (s_cur = s_iter; s_cur; s_cur = ftdm_iterator_next(s_cur)) {
ftdm_span_t *span;
span = ftdm_iterator_current(s_cur);
if (!span) {
break;
}
span = val;
if (not && !ftdm_test_flag(span, flag)) {
stream->write_function(stream, "[s%d] flag !%d(!%s)\n",
span->span_id,
flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid"));
mycount++;
} else if (!not && ftdm_test_flag(span, flag)) {
stream->write_function(stream, "[s%d] flag %d(%s)\n",
span->span_id,
flagval, ftdm_val2str(flag, span_flag_strs, ftdm_array_len(span_flag_strs), "invalid"));
if (neg ^ !!ftdm_test_flag(span, flag)) {
stream->write_function(stream, "[s%d] flag %s%"FTDM_UINT64_FMT"(%s%s)\n",
span->span_id, negind, flagval, negind, flagname);
mycount++;
}
}
ftdm_iterator_free(s_iter);
}
*count = mycount;
ftdm_mutex_unlock(globals.mutex);
}
static void print_channels_by_state(ftdm_stream_handle_t *stream, ftdm_channel_state_t state, int not, int *count)
{
ftdm_hash_iterator_t *i = NULL;
ftdm_span_t *span;
ftdm_channel_t *fchan = NULL;
ftdm_iterator_t *citer = NULL;
ftdm_iterator_t *curr = NULL;
const void *key = NULL;
void *val = NULL;
ftdm_iterator_t *s_iter, *s_cur;
ftdm_bool_t neg = !!not;
int mycount = 0;
*count = 0;
s_iter = ftdm_get_span_iterator(NULL);
ftdm_mutex_lock(globals.mutex);
for (i = hashtable_first(globals.span_hash); i; i = hashtable_next(i)) {
hashtable_this(i, &key, NULL, &val);
if (!key || !val) {
for (s_cur = s_iter; s_cur; s_cur = ftdm_iterator_next(s_cur)) {
ftdm_iterator_t *c_iter, *c_cur;
ftdm_span_t *span;
span = ftdm_iterator_current(s_cur);
if (!span) {
break;
}
span = val;
citer = ftdm_span_get_chan_iterator(span, NULL);
if (!citer) {
continue;
}
for (curr = citer ; curr; curr = ftdm_iterator_next(curr)) {
fchan = ftdm_iterator_current(curr);
if (not && (fchan->state != state)) {
stream->write_function(stream, "[s%dc%d][%d:%d] in state %s\n",
fchan->span_id, fchan->chan_id,
c_iter = ftdm_span_get_chan_iterator(span, NULL);
for (c_cur = c_iter ; c_cur; c_cur = ftdm_iterator_next(c_cur)) {
ftdm_channel_t *fchan = ftdm_iterator_current(c_cur);
if (neg ^ (fchan->state == state)) {
stream->write_function(stream, "[s%dc%d][%d:%d] in state %s\n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id, ftdm_channel_state2str(fchan->state));
(*count)++;
} else if (!not && (fchan->state == state)) {
stream->write_function(stream, "[s%dc%d][%d:%d] in state %s\n",
fchan->span_id, fchan->chan_id,
fchan->physical_span_id, fchan->physical_chan_id, ftdm_channel_state2str(fchan->state));
(*count)++;
mycount++;
}
}
ftdm_iterator_free(citer);
ftdm_iterator_free(c_iter);
}
*count = mycount;
ftdm_mutex_unlock(globals.mutex);
ftdm_iterator_free(s_iter);
}
static void print_core_usage(ftdm_stream_handle_t *stream)