Destroy provider when fini 50/205650/4
authorhyunho <hhstark.kang@samsung.com>
Wed, 8 May 2019 07:22:06 +0000 (16:22 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Wed, 8 May 2019 23:43:10 +0000 (08:43 +0900)
Change-Id: Ic2a7b7e73940435059a9b87a0d7bcd3f144dd12a
Signed-off-by: hyunho <hhstark.kang@samsung.com>
screen_connector_provider/include/screen_connector_provider.h
screen_connector_provider/src/screen_connector_provider.c

index 1e52482321de210bd643c07f0c8f1b85d80893ee..b24085930278213b7f6c64f0653a480e50d1f3f6 100644 (file)
@@ -55,6 +55,7 @@ screen_connector_provider_h screen_connector_provider_create(const char *id,
                struct wl_surface *surface);
 int screen_connector_provider_set_event_filter(
                screen_connector_provider_h provider, unsigned int filter);
+int screen_connector_provider_destroy(screen_connector_provider_h provider);
 int screen_connector_provider_init(void);
 int screen_connector_provider_fini(void);
 
index 24add27ef8edb03fda5d338dd8c6c18caf009a4b..4164b9b73386db2c19d66c7c7ce53370436fa9ea 100755 (executable)
@@ -35,8 +35,9 @@
 
 #define LOG_TAG "SC_PROVIDER"
 
-static int __init_count = 0;
-static struct tizen_remote_surface_manager *__rsm = NULL;
+static int __init_count;
+static struct tizen_remote_surface_manager *__rsm;
+static GList *__providers;
 
 struct screen_connector_provider_s {
        struct wl_surface *surface;
@@ -170,10 +171,12 @@ EXPORT_API int screen_connector_provider_remote_enable(const char *id, struct wl
        screen_connector_provider_h handle;
 
        handle = screen_connector_provider_create(id, surface);
-       if (handle)
-               return 0;
+       if (!handle)
+               return -1;
+
+       __providers = g_list_append(__providers, handle);
 
-       return -1;
+       return 0;
 }
 
 EXPORT_API int screen_connector_provider_set_event_filter(screen_connector_provider_h provider, unsigned int filter)
@@ -194,6 +197,32 @@ EXPORT_API int screen_connector_provider_set_event_filter(screen_connector_provi
        return 0;
 }
 
+static void __destroy_provider(gpointer data)
+{
+       screen_connector_provider_h provider;
+
+       provider = (screen_connector_provider_h)data;
+
+       if (provider->rsp)
+               tizen_remote_surface_provider_destroy(provider->rsp);
+       if (provider->id)
+               free(provider->id);
+       free(provider);
+}
+
+EXPORT_API int screen_connector_provider_destroy(screen_connector_provider_h provider)
+{
+       if (!provider) {
+               LOGE("Invalid parameter");
+               return -1;
+       }
+
+       __providers = g_list_remove(__providers, provider);
+       __destroy_provider(provider);
+
+       return 0;
+}
+
 static void __shutdown_ecore_wl2_display()
 {
        LOGE("disconnect wl2_display");
@@ -256,10 +285,19 @@ EXPORT_API int screen_connector_provider_fini(void)
        if (__init_count > 1) {
                __init_count--;
                return 0;
+       } else if (__init_count == 0) {
+               return 0;
        }
 
-       if (__rsm)
+       if (__providers) {
+               g_list_free_full(__providers, __destroy_provider);
+               __providers = NULL;
+       }
+
+       if (__rsm) {
                tizen_remote_surface_manager_destroy(__rsm);
+               __rsm = NULL;
+       }
 
        __shutdown_ecore_wl2_display();