|
|
|
@ -2427,6 +2427,20 @@ static int monologue_destroy(struct call_monologue *ml) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/* must be called with call->master_lock held in W */ |
|
|
|
static void __fix_other_tags(struct call_monologue *one) { |
|
|
|
struct call_monologue *two; |
|
|
|
|
|
|
|
if (!one || !one->tag.len) |
|
|
|
return; |
|
|
|
two = one->active_dialogue; |
|
|
|
if (!two || !two->tag.len) |
|
|
|
return; |
|
|
|
|
|
|
|
g_hash_table_insert(one->other_tags, &two->tag, two); |
|
|
|
g_hash_table_insert(two->other_tags, &one->tag, one); |
|
|
|
} |
|
|
|
|
|
|
|
/* must be called with call->master_lock held in W */ |
|
|
|
static struct call_monologue *call_get_monologue(struct call *call, const str *fromtag, const str *totag, |
|
|
|
const str *viabranch) |
|
|
|
@ -2437,7 +2451,6 @@ static struct call_monologue *call_get_monologue(struct call *call, const str *f |
|
|
|
STR_FMT(fromtag), STR_FMT(&call->callid)); |
|
|
|
ret = g_hash_table_lookup(call->tags, fromtag); |
|
|
|
if (!ret) { |
|
|
|
__C_DBG("creating new monologue"); |
|
|
|
ret = __monologue_create(call); |
|
|
|
__monologue_tag(ret, fromtag); |
|
|
|
goto new_branch; |
|
|
|
@ -2479,8 +2492,11 @@ new_branch: |
|
|
|
__monologue_viabranch(os, viabranch); |
|
|
|
|
|
|
|
ok_check_tag: |
|
|
|
if (totag && totag->s && !ret->active_dialogue->tag.s) |
|
|
|
__monologue_tag(ret->active_dialogue, totag); |
|
|
|
os = ret->active_dialogue; |
|
|
|
if (totag && totag->s && !os->tag.s) { |
|
|
|
__monologue_tag(os, totag); |
|
|
|
__fix_other_tags(ret); |
|
|
|
} |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
@ -2527,12 +2543,11 @@ static struct call_monologue *call_get_dialogue(struct call *call, const str *fr |
|
|
|
if (!ft->tag.s) |
|
|
|
__monologue_tag(ft, fromtag); |
|
|
|
|
|
|
|
g_hash_table_insert(ft->other_tags, &tt->tag, tt); |
|
|
|
g_hash_table_insert(tt->other_tags, &ft->tag, ft); |
|
|
|
__monologue_unkernelize(ft->active_dialogue); |
|
|
|
__monologue_unkernelize(tt->active_dialogue); |
|
|
|
ft->active_dialogue = tt; |
|
|
|
tt->active_dialogue = ft; |
|
|
|
__fix_other_tags(ft); |
|
|
|
|
|
|
|
done: |
|
|
|
__monologue_unkernelize(ft); |
|
|
|
|