Skip to content

Commit

Permalink
media_exchange: keep media session until dlg ends
Browse files Browse the repository at this point in the history
This fixes situation when a media session is both started and ended from
different (MI) processes.
  • Loading branch information
razvancrainea committed Oct 2, 2024
1 parent d00607d commit d70b9c0
Showing 1 changed file with 26 additions and 10 deletions.
36 changes: 26 additions & 10 deletions modules/media_exchange/media_sessions.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,29 @@

static int media_session_dlg_idx;

void media_session_unref(void *param)
#define MEDIA_SESSION_DETACHED(ms) (ms->dlg == NULL)
#define MEDIA_SESSION_HAS_LEGS(ms) (ms->legs != NULL)

static void media_session_detach(struct media_session *ms)
{
if (MEDIA_SESSION_DETACHED(ms))
return;
media_dlg.dlg_ctx_put_ptr(ms->dlg, media_session_dlg_idx, NULL);
media_dlg.dlg_unref(ms->dlg, 1);
ms->dlg = NULL;
}

static void media_session_unref(void *param)
{
struct media_session *ms = (struct media_session *)param;
MEDIA_SESSION_LOCK(ms);
if (ms->legs)
media_session_detach(ms);
if (MEDIA_SESSION_HAS_LEGS(ms)) {
LM_WARN("media session %p still in use %p!\n", ms, ms->legs);
else
MEDIA_SESSION_UNLOCK(ms);
} else {
media_session_release(ms, 1);
}
}

int init_media_sessions(void)
Expand Down Expand Up @@ -88,24 +103,21 @@ void media_session_leg_free(struct media_session_leg *msl)

void media_session_release(struct media_session *ms, int unlock)
{
int existing_legs = (ms->legs != NULL);
int existing_legs = MEDIA_SESSION_HAS_LEGS(ms);

if (unlock)
MEDIA_SESSION_UNLOCK(ms);
if (existing_legs) {
LM_DBG("media session %p has onhoing legs!\n", ms);
return;
}
media_session_free(ms);
/* release only if detached from the dialog */
if (MEDIA_SESSION_DETACHED(ms))
media_session_free(ms);
}

void media_session_free(struct media_session *ms)
{

if (ms->dlg) {
media_dlg.dlg_ctx_put_ptr(ms->dlg, media_session_dlg_idx, NULL);
media_dlg.dlg_unref(ms->dlg, 1);
}
lock_destroy(&ms->lock);
LM_DBG("releasing media_session=%p\n", ms);
shm_free(ms);
Expand All @@ -126,6 +138,7 @@ static void media_session_dlg_end(struct dlg_cell *dlg, int type, struct dlg_cb_
return;

media_session_end(ms, MEDIA_LEG_BOTH, 0, 0);
media_session_unref(ms);
}

struct media_session *media_session_create(struct dlg_cell *dlg)
Expand All @@ -149,6 +162,7 @@ struct media_session *media_session_create(struct dlg_cell *dlg)
/* we are not storing media session in the dialog, as it might
* dissapear along the way, if the playback ends */
LM_ERR("could not register media_session_termination!\n");
media_session_detach(ms);
media_session_free(ms);
return NULL;
}
Expand Down Expand Up @@ -381,6 +395,8 @@ int media_session_end(struct media_session *ms, int leg, int nohold, int proxied

MEDIA_SESSION_LOCK(ms);
if (leg == MEDIA_LEG_BOTH) {
if (!ms->legs)
goto release;
msl = ms->legs;
nmsl = msl->next;
if (nmsl) {
Expand Down

0 comments on commit d70b9c0

Please sign in to comment.