From: Youngwoo Cho Date: Tue, 23 Jul 2024 07:58:00 +0000 (+0900) Subject: src: Fix reference count error (miracast server) X-Git-Tag: accepted/tizen/unified/20240724.120348^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=88dbf5f90e2795d48313d6012ede13fea48099ee;p=platform%2Fcore%2Fapi%2Fscreen-mirroring.git src: Fix reference count error (miracast server) - fix reference count management method - match action of scmirroring connect/disconnect Change-Id: I7d067eac4552cecec5a29cae353052b5e67505bc Signed-off-by: Youngwoo Cho --- diff --git a/miracast_server/miracast_server.c b/miracast_server/miracast_server.c index 8833cbf..d6fff5a 100755 --- a/miracast_server/miracast_server.c +++ b/miracast_server/miracast_server.c @@ -52,6 +52,9 @@ int main(int argc, char *argv[]) scmirroring_debug("miracast server run loop"); g_main_loop_run(mainloop); + g_main_loop_unref(mainloop); + g_object_unref(server); + scmirroring_debug("MIRACAST SERVER EXIT"); exit(0); } diff --git a/miracast_server/miracast_server.h b/miracast_server/miracast_server.h index 499c068..21bea3c 100644 --- a/miracast_server/miracast_server.h +++ b/miracast_server/miracast_server.h @@ -50,6 +50,7 @@ struct _MiracastServer { gint connection_mode; gint multisink; gint coupling_mode; + guint source_id; gpointer _gst_reserved[GST_PADDING]; }; diff --git a/miracast_server/miracast_server_impl.c b/miracast_server/miracast_server_impl.c index ee642cf..7e8470c 100644 --- a/miracast_server/miracast_server_impl.c +++ b/miracast_server/miracast_server_impl.c @@ -147,6 +147,7 @@ static void miracast_server_init(MiracastServer *obj, gpointer dummy) obj->factory = NULL; obj->resolution = 0; obj->multisink = SCMIRRORING_MULTISINK_ENABLE; + obj->source_id = 0; obj->coupling_mode = FALSE; } @@ -211,9 +212,7 @@ void __miracast_server_quit_program(MiracastServer *server) klass = MIRACAST_SERVER_GET_CLASS(server); void *pool = NULL; - int i; int ret = 0; - int serv_ref_cnt = 0; if (server->server == NULL) { scmirroring_error("server is already NULL"); @@ -230,11 +229,11 @@ void __miracast_server_quit_program(MiracastServer *server) g_object_unref(pool); } - serv_ref_cnt = GST_OBJECT_REFCOUNT_VALUE(server->server); - scmirroring_debug("serv ref cnt:%d", serv_ref_cnt); + if (server->source_id > 0) + g_source_remove(server->source_id); + server->source_id = 0; - for (i = 0; i < serv_ref_cnt; i++) - g_object_unref(server->server); + g_object_unref(server->server); done: klass->send_response(server, "OK:DESTROY"); @@ -724,6 +723,8 @@ int __miracast_server_start(MiracastServer *server_obj) if ((id = gst_rtsp_server_attach(GST_RTSP_SERVER_CAST(server), NULL)) == 0) goto failed; + server_obj->source_id = id; + g_signal_connect(server, "client-connected", G_CALLBACK(__miracast_server_client_connected_cb), server_obj); server_obj->server = (void *) server; diff --git a/packaging/capi-media-screen-mirroring.spec b/packaging/capi-media-screen-mirroring.spec index 4e39881..bbbe480 100644 --- a/packaging/capi-media-screen-mirroring.spec +++ b/packaging/capi-media-screen-mirroring.spec @@ -1,7 +1,7 @@ Name: capi-media-screen-mirroring Summary: A screen mirroring library in Tizen C API Version: 0.2.35 -Release: 2 +Release: 3 Group: Multimedia/API License: Apache-2.0 Source0: %{name}-%{version}.tar.gz diff --git a/src/scmirroring_src.c b/src/scmirroring_src.c index 140477f..8400183 100644 --- a/src/scmirroring_src.c +++ b/src/scmirroring_src.c @@ -58,11 +58,19 @@ static gboolean __scmirroring_src_callback_call(gpointer data) SCMIRRORING_SAFE_FREE(scmirroring->port); SCMIRRORING_SAFE_FREE(scmirroring->scmirroring_state_cb); - g_io_channel_shutdown(scmirroring->channel, FALSE, NULL); - g_io_channel_unref(scmirroring->channel); + if (scmirroring->channel != NULL) { + g_io_channel_shutdown(scmirroring->channel, FALSE, NULL); + g_io_channel_unref(scmirroring->channel); + scmirroring->channel = NULL; + } + + if (scmirroring->sock != -1) { + close(scmirroring->sock); + scmirroring->sock = -1; + } SCMIRRORING_SAFE_G_FREE(scmirroring->sock_path); - SCMIRRORING_SAFE_FREE(scmirroring); + scmirroring->connected = NOT_CONNECTED_TO_SERVER; } return FALSE; @@ -571,20 +579,6 @@ int scmirroring_src_disconnect(scmirroring_src_h scmirroring) if (ret != SCMIRRORING_ERROR_NONE) scmirroring_error("Failed to destroy miracast server [%d]", ret); - if (_scmirroring->channel != NULL) { - g_io_channel_shutdown(_scmirroring->channel, FALSE, NULL); - g_io_channel_unref(_scmirroring->channel); - _scmirroring->channel = NULL; - } - - if (_scmirroring->sock != -1) { - close(_scmirroring->sock); - _scmirroring->sock = -1; - } - - SCMIRRORING_SAFE_G_FREE(_scmirroring->sock_path); - _scmirroring->connected = NOT_CONNECTED_TO_SERVER; - scmirroring_debug_fleave(); return ret;