fixed_callduration_and_added_termination_reason_20141125:

callduration fix + dier termination reason, warum/wie der
call beendet wurde.

Author:    Frederic-Philippe Metz <Frederic.Metz@1und1.de>
pull/60/head
Frederic-Philippe Metz 11 years ago committed by Richard Fuchs
parent 9886de4654
commit 947b35e889

@ -122,7 +122,15 @@ const struct transport_protocol transport_protocols[] = {
};
const int num_transport_protocols = G_N_ELEMENTS(transport_protocols);
const char * get_term_reason_text(char *buf, enum termination_reason t) {
if (t==TIMEOUT) { buf = "TIMEOUT"; return buf; }
if (t==REGULAR) { buf = "REGULAR"; return buf; }
if (t==FORCED) { buf = "FORCED"; return buf; }
if (t==SILENT_TIMEOUT) { buf = "SILENT_TIMEOUT"; return buf; }
buf = "UNKNOWN";
return buf;
}
static void determine_handler(struct packet_stream *in, const struct packet_stream *out);
@ -981,6 +989,7 @@ static int call_timer_delete_monologues(struct call *c) {
}
__monologue_destroy(ml);
ml->deleted = 0;
if (!g_hash_table_size(c->tags)) {
@ -1015,6 +1024,9 @@ static void call_timer_iterator(void *key, void *val, void *ptr) {
int good = 0;
struct packet_stream *ps;
struct stream_fd *sfd;
int tmp_t_reason=0;
struct call_monologue *ml;
GSList *i;
rwlock_lock_r(&c->master_lock);
log_info_call(c);
@ -1056,8 +1068,11 @@ no_sfd:
goto next;
check = cm->conf.timeout;
if (!MEDIA_ISSET(ps->media, RECV) || !sfd)
tmp_t_reason = 1;
if (!MEDIA_ISSET(ps->media, RECV) || !sfd) {
check = cm->conf.silent_timeout;
tmp_t_reason = 2;
}
if (poller_now - ps->last_packet < check)
good = 1;
@ -1069,6 +1084,18 @@ next:
if (good)
goto out;
for (i = c->monologues; i; i = i->next) {
ml = i->data;
ml->terminated = time(NULL);
if (tmp_t_reason==1) {
ml->term_reason = TIMEOUT;
} else if (tmp_t_reason==2) {
ml->term_reason = SILENT_TIMEOUT;
} else {
ml->term_reason = UNKNOWN;
}
}
ilog(LOG_INFO, "Closing call due to timeout");
drop:
@ -2313,6 +2340,7 @@ void call_destroy(struct call *c) {
GList *k, *o;
char buf[64];
static const int CDRBUFLENGTH = 4096*2;
char reasonbuf[16]; memset(&reasonbuf,0,16);
char cdrbuffer[CDRBUFLENGTH]; memset(&cdrbuffer,0,CDRBUFLENGTH);
char* cdrbufcur = cdrbuffer;
int cdrlinecnt = 0;
@ -2344,11 +2372,10 @@ void call_destroy(struct call *c) {
"ml%i_termination=%s, "
"ml%i_local_tag=%s, "
"ml%i_remote_tag=%s, ",
cdrlinecnt, (unsigned int)ml->created,
cdrlinecnt, (unsigned int)poller_now,
cdrlinecnt, (unsigned int)poller_now-(unsigned int)ml->created,
cdrlinecnt, "TOBEDONE",
cdrlinecnt, (unsigned int)ml->terminated,
cdrlinecnt, (unsigned int)ml->terminated-(unsigned int)ml->created,
cdrlinecnt, get_term_reason_text(reasonbuf,ml->term_reason),
cdrlinecnt, ml->tag.s,
cdrlinecnt, ml->active_dialogue ? ml->active_dialogue->tag.s : "(none)");
}
@ -2804,6 +2831,7 @@ int call_delete_branch(struct callmaster *m, const str *callid, const str *branc
struct call_monologue *ml;
int ret;
const str *match_tag;
GSList *i;
c = call_get(callid, m);
if (!c) {
@ -2811,6 +2839,12 @@ int call_delete_branch(struct callmaster *m, const str *callid, const str *branc
goto err;
}
for (i = c->monologues; i; i = i->next) {
ml = i->data;
ml->terminated = time(NULL);
ml->term_reason = REGULAR;
}
if (!fromtag || !fromtag->s || !fromtag->len)
goto del_all;
@ -2843,7 +2877,7 @@ int call_delete_branch(struct callmaster *m, const str *callid, const str *branc
ilog(LOG_INFO, "Scheduling deletion of call branch '"STR_FORMAT"' in %d seconds",
STR_FMT(&ml->tag), DELETE_DELAY);
ml->deleted = poller_now + 30;
ml->deleted = poller_now + DELETE_DELAY;
if (!c->ml_deleted || c->ml_deleted > ml->deleted)
c->ml_deleted = ml->deleted;
goto success_unlock;

@ -12,7 +12,13 @@
#include "compat.h"
enum termination_reason {
UNKNOWN=0,
REGULAR=1,
FORCED=2,
TIMEOUT=3,
SILENT_TIMEOUT=4
};
enum stream_address_format {
SAF_TCP,
@ -299,6 +305,8 @@ struct call_monologue {
str tag;
time_t created; /* RO */
time_t deleted;
time_t terminated;
enum termination_reason term_reason;
GHashTable *other_tags;
struct call_monologue *active_dialogue;

Loading…
Cancel
Save