-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
videoroom: Release some references created by remote publishers #3359
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -2713,6 +2713,8 @@ static void janus_videoroom_publisher_dereference_nodebug(janus_videoroom_publis | |||
janus_refcount_decrease_nodebug(&p->ref); | ||||
} | ||||
|
||||
static void janus_videoroom_session_destroy(janus_videoroom_session *session); | ||||
|
||||
static void janus_videoroom_publisher_destroy(janus_videoroom_publisher *p) { | ||||
if(p && g_atomic_int_compare_and_exchange(&p->destroyed, 0, 1)) { | ||||
janus_mutex_lock(&p->streams_mutex); | ||||
|
@@ -2750,6 +2752,9 @@ static void janus_videoroom_publisher_destroy(janus_videoroom_publisher *p) { | |||
} | ||||
janus_mutex_unlock(&p->rtp_forwarders_mutex); | ||||
janus_mutex_unlock(&p->streams_mutex); | ||||
/* Release dummy session of the forwarder */ | ||||
if(p->remote && p->session) | ||||
janus_videoroom_session_destroy(p->session); | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this here, and why does this mention a dummy session? This is not a function only used for dummy publishers: it's the destroy function for all publishers, and is not meant to be called directly, it's the callback for the cleanup from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's the session created here: janus-gateway/src/plugins/janus_videoroom.c Line 7379 in 195bac0
It belongs to a regular publisher, so |
||||
janus_refcount_decrease(&p->ref); | ||||
} | ||||
} | ||||
|
@@ -2799,7 +2804,8 @@ static void janus_videoroom_session_destroy(janus_videoroom_session *session) { | |||
static void janus_videoroom_session_free(const janus_refcount *session_ref) { | ||||
janus_videoroom_session *session = janus_refcount_containerof(session_ref, janus_videoroom_session, ref); | ||||
/* Remove the reference to the core plugin session */ | ||||
janus_refcount_decrease(&session->handle->ref); | ||||
if (session->handle) | ||||
janus_refcount_decrease(&session->handle->ref); | ||||
/* This session can be destroyed, free all the resources */ | ||||
janus_mutex_destroy(&session->mutex); | ||||
g_free(session); | ||||
|
@@ -7291,6 +7297,7 @@ static json_t *janus_videoroom_process_synchronous_request(janus_videoroom_sessi | |||
json_object_set_new(response, "id", string_ids ? json_string(publisher->user_id_str) : json_integer(publisher->user_id)); | ||||
json_object_set_new(response, "remote_id", json_string(remote_id)); | ||||
janus_refcount_decrease(&publisher->ref); /* This is just to handle the request for now */ | ||||
janus_refcount_decrease(&videoroom->ref); | ||||
goto prepare_response; | ||||
} else if(!strcasecmp(request_text, "unpublish_remotely")) { | ||||
/* Configure a local publisher to stop restreaming to a remote VideoRomm instance */ | ||||
|
@@ -13795,7 +13802,7 @@ static void *janus_videoroom_remote_publisher_thread(void *user_data) { | |||
} | ||||
g_list_free(subscribers); | ||||
/* Free streams */ | ||||
g_list_free(publisher->streams); | ||||
g_list_free_full(publisher->streams, (GDestroyNotify)(janus_videoroom_publisher_stream_unref)); | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Other places use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure if this should be a destroy, then, and the related maps both be unrefs. Besides, if that's the rationale for the list, then it should not only be fixed for remote publishers, but for all of them, since we do a simple There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I did some debugging and it looks like that at the time However at the end of the remove publisher thread, the streams list is not empty, resulting in the leak if |
||||
publisher->streams = NULL; | ||||
g_hash_table_remove_all(publisher->streams_byid); | ||||
g_hash_table_remove_all(publisher->streams_bymid); | ||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if you want the forward declaration or if one of the two functions should be moved.