src: Fix reference count error (miracast server) 22/314922/4 accepted/tizen_unified_dev accepted/tizen/unified/20240724.120348 accepted/tizen/unified/dev/20240729.000824 accepted/tizen/unified/toolchain/20240812.132344 accepted/tizen/unified/x/20240724.211513 accepted/tizen/unified/x/asan/20240813.230639
authorYoungwoo Cho <young222.cho@samsung.com>
Tue, 23 Jul 2024 07:58:00 +0000 (16:58 +0900)
committerYoungwoo Cho <young222.cho@samsung.com>
Wed, 24 Jul 2024 00:22:31 +0000 (09:22 +0900)
- fix reference count management method
- match action of scmirroring connect/disconnect

Change-Id: I7d067eac4552cecec5a29cae353052b5e67505bc
Signed-off-by: Youngwoo Cho <young222.cho@samsung.com>
miracast_server/miracast_server.c
miracast_server/miracast_server.h
miracast_server/miracast_server_impl.c
packaging/capi-media-screen-mirroring.spec
src/scmirroring_src.c

index 8833cbf196cde33fe054a17b3b89db8ecb9e3495..d6fff5a961104735210ac44bc8b92d0b6f95c2ac 100755 (executable)
@@ -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);
 }
index 499c06830b1d30e59e63746388f2b077c9a695a6..21bea3c80ff0fabde927d8d8c4f4640c28fbaccc 100644 (file)
@@ -50,6 +50,7 @@ struct _MiracastServer {
        gint connection_mode;
        gint multisink;
        gint coupling_mode;
+       guint source_id;
 
        gpointer _gst_reserved[GST_PADDING];
 };
index ee642cf5bf59ea1b2fb2922911c4b8ac7f545aa0..7e8470c10e7e05eed677c41e1919959302b97a56 100644 (file)
@@ -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;
index 4e398814b096ece9b124bca097e9c438691ce966..bbbe48069541d67297340618d28e153ac8093500 100644 (file)
@@ -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
index 140477fc8b503e951c893017044b871ba8c25eb3..840018363a5b94ad3a69a2e940ca972ea09ca5f7 100644 (file)
@@ -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;