[NUI] Make we flush DisposeQueue before app start
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 11 Dec 2023 03:09:39 +0000 (12:09 +0900)
committerbshsqa <32317749+bshsqa@users.noreply.github.com>
Mon, 11 Dec 2023 06:49:58 +0000 (15:49 +0900)
If we don't call DisposeQueue.Instance.Initialize(), it might not flush
the dispose queue.

Before #5806 and until currently, we didn't allow to call ProcessDisposables()
before Initialize(). It might occure memory leak if app try to create & dispose
unlimitly before Application start.

To make ensure it, let we make ProcessDisposables() API can be called even if
DisposeQueue is not initialized.

Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
src/Tizen.NUI/src/internal/Common/DisposeQueue.cs
src/Tizen.NUI/src/internal/Common/ProcessorController.cs

index c0ea1d1..460134b 100755 (executable)
@@ -52,6 +52,11 @@ namespace Tizen.NUI
         {
             Tizen.Log.Debug("NUI", $"DisposeQueue is destroyed\n");
             initialied = false;
+            if (processorRegistered && ProcessorController.Instance.Initialized)
+            {
+                processorRegistered = false;
+                ProcessorController.Instance.ProcessorOnceEvent -= TriggerProcessDisposables;
+            }
         }
 
         public static DisposeQueue Instance
@@ -90,10 +95,19 @@ namespace Tizen.NUI
                 disposables.Add(disposable);
             }
 
-            if (initialied && eventThreadCallback != null && !eventThreadCallbackTriggered)
+            if (initialied && eventThreadCallback != null)
+            {
+                if (!eventThreadCallbackTriggered)
+                {
+                    eventThreadCallbackTriggered = true;
+                    eventThreadCallback.Trigger();
+                }
+            }
+            else
             {
-                eventThreadCallbackTriggered = true;
-                eventThreadCallback.Trigger();
+                // Flush Disposable queue synchronously if it is not initialized yet.
+                // TODO : Need to check thread here if we need.
+                ProcessDisposables();
             }
         }
 
@@ -101,10 +115,19 @@ namespace Tizen.NUI
         {
             processorRegistered = false;
 
-            if (eventThreadCallback != null && !eventThreadCallbackTriggered)
+            if (initialied && eventThreadCallback != null)
+            {
+                if (!eventThreadCallbackTriggered)
+                {
+                    eventThreadCallbackTriggered = true;
+                    eventThreadCallback.Trigger();
+                }
+            }
+            else
             {
-                eventThreadCallbackTriggered = true;
-                eventThreadCallback.Trigger();
+                // Flush Disposable queue synchronously if it is not initialized yet.
+                // TODO : Need to check thread here if we need.
+                ProcessDisposables();
             }
         }
 
index 0132e90..ff77166 100755 (executable)
@@ -129,6 +129,8 @@ namespace Tizen.NUI
             internalProcessorOnceEvent[1] = null;
             ProcessorEvent = null;
             LayoutProcessorEvent = null;
+            initialied = false;
+
             GC.SuppressFinalize(this);
 
             base.Dispose(type);