Add API for release IntPtr
authorXiaohui Fang <xiaohui.fang@samsung.com>
Tue, 11 Mar 2025 01:38:55 +0000 (09:38 +0800)
committerWonsik Jung <sidein@samsung.com>
Wed, 12 Mar 2025 04:26:52 +0000 (13:26 +0900)
src/Tizen.NUI/src/internal/Common/IntPtrPool.cs
src/Tizen.NUI/src/public/Common/Position.cs
src/Tizen.NUI/src/public/Common/Position2D.cs
src/Tizen.NUI/src/public/Common/Vector2.cs
src/Tizen.NUI/src/public/Common/Vector3.cs
src/Tizen.NUI/src/public/Common/Vector4.cs

index 150d0d809ceace444c3832393f302bcbab604482..89ed8722d53e0e242f6390edf6a767b033e328b0 100755 (executable)
@@ -25,21 +25,35 @@ namespace Tizen.NUI
 {
     internal class IntPtrPool
     {
-        private System.Collections.Generic.Stack<IntPtr> pool = new System.Collections.Generic.Stack<IntPtr>();
+        private Queue<IntPtr> ptrQueue = new Queue<IntPtr>();
         private CreatePtrCallback createPtrCb;
+        private DeletePtrCallback deletePtrCb;
+
+        private static List<IntPtrPool> pools = new List<IntPtrPool>();
 
         public delegate IntPtr CreatePtrCallback();
+        public delegate void DeletePtrCallback(IntPtr ptr);
+
+        public static void ClearPools()
+        {
+            foreach (var pool in pools)
+            {
+                pool.ClearPtrs();
+            }
+        }
 
-        public IntPtrPool(CreatePtrCallback createPtrCb)
+        public IntPtrPool(CreatePtrCallback createPtrCb, DeletePtrCallback deletePtrCb)
         {
             this.createPtrCb = createPtrCb;
+            this.deletePtrCb = deletePtrCb;
+            pools.Add(this);
         }
 
         public IntPtr GetPtr()
         {
             IntPtr ret = IntPtr.Zero;
 
-            if (0 == pool.Count)
+            if (0 == ptrQueue.Count)
             {
                 if (null == createPtrCb)
                 {
@@ -50,7 +64,7 @@ namespace Tizen.NUI
             }
             else
             {
-                ret = pool.Pop();
+                ret = ptrQueue.Dequeue();
             }
 
             return ret;
@@ -58,7 +72,16 @@ namespace Tizen.NUI
 
         public void PutPtr(IntPtr ptr)
         {
-            pool.Push(ptr);
+            ptrQueue.Enqueue(ptr);
+        }
+
+        public void ClearPtrs()
+        {
+            while (ptrQueue.Count > 0)
+            {
+                var ptr = ptrQueue.Dequeue();
+                deletePtrCb?.Invoke(ptr);
+            }
         }
     }
 }
index bee4051589e4b9644b243412d434cf00f063cc84..3b336ca4bdd0e3f2171e3daeee4af294d0f0a26b 100755 (executable)
@@ -40,7 +40,7 @@ namespace Tizen.NUI
             {
                 if (null == ptrPool)
                 {
-                    ptrPool = new IntPtrPool(CreateEmptryPtr);
+                    ptrPool = new IntPtrPool(CreateEmptryPtr, DeletePtr);
                 }
 
                 return ptrPool;
@@ -52,6 +52,12 @@ namespace Tizen.NUI
             return Interop.Vector3.NewVector3();
         }
 
+        private static void DeletePtr(IntPtr ptr)
+        {
+            var swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, ptr);
+            Interop.Vector3.DeleteVector3(swigCPtr);
+        }
+
         internal static new void Preload()
         {
             // Do nothing. Just call for load static values.
index c3ed0039a00e52f70cbc2dc57b2ed1c379e6d310..7ab34aad0a568628da70fe6ba5139bfdbc6b2ed9 100755 (executable)
@@ -37,7 +37,7 @@ namespace Tizen.NUI
             {
                 if (null == ptrPool)
                 {
-                    ptrPool = new IntPtrPool(CreateEmptryPtr);
+                    ptrPool = new IntPtrPool(CreateEmptryPtr, DeletePtr);
                 }
 
                 return ptrPool;
@@ -49,6 +49,11 @@ namespace Tizen.NUI
             return Interop.Vector2.NewVector2();
         }
 
+        private static void DeletePtr(IntPtr ptr)
+        {
+            var swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, ptr);
+            Interop.Vector2.DeleteVector2(swigCPtr);
+        }
         /// <summary>
         /// The constructor.
         /// </summary>
index 38531832580efbdc4d2d1b40172b1f4467c55212..ecfddc96fd9d30fb52d4d609661e2a17a8446a89 100755 (executable)
@@ -42,7 +42,7 @@ namespace Tizen.NUI
             {
                 if (null == ptrPool)
                 {
-                    ptrPool = new IntPtrPool(CreateEmptryPtr);
+                    ptrPool = new IntPtrPool(CreateEmptryPtr, DeletePtr);
                 }
 
                 return ptrPool;
@@ -54,6 +54,12 @@ namespace Tizen.NUI
             return Interop.Vector2.NewVector2();
         }
 
+        private static void DeletePtr(IntPtr ptr)
+        {
+            var swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, ptr);
+            Interop.Vector2.DeleteVector2(swigCPtr);
+        }
+
         internal static new void Preload()
         {
             // Do nothing. Just call for load static values.
index d4382d1f39c0a4b88f30277567b023ee038cfbc3..16c24010e2d23e22ddb8d13fd148996e232aa4c1 100755 (executable)
@@ -45,7 +45,7 @@ namespace Tizen.NUI
             {
                 if (null == ptrPool)
                 {
-                    ptrPool = new IntPtrPool(CreateEmptryPtr);
+                    ptrPool = new IntPtrPool(CreateEmptryPtr, DeletePtr);
                 }
 
                 return ptrPool;
@@ -57,6 +57,12 @@ namespace Tizen.NUI
             return Interop.Vector3.NewVector3();
         }
 
+        private static void DeletePtr(IntPtr ptr)
+        {
+            var swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, ptr);
+            Interop.Vector3.DeleteVector3(swigCPtr);
+        }
+
         internal static new void Preload()
         {
             // Do nothing. Just call for load static values.
index 2c77c04e789e3703ac5e1b93172d3c6b8a897dea..f34998bca35a5edbe8cc84a890666feb9b5b5deb 100755 (executable)
@@ -42,7 +42,7 @@ namespace Tizen.NUI
             {
                 if (null == ptrPool)
                 {
-                    ptrPool = new IntPtrPool(CreateEmptryPtr);
+                    ptrPool = new IntPtrPool(CreateEmptryPtr, DeletePtr);
                 }
 
                 return ptrPool;
@@ -54,6 +54,12 @@ namespace Tizen.NUI
             return Interop.Vector4.NewVector4();
         }
 
+        private static void DeletePtr(IntPtr ptr)
+        {
+            var swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, ptr);
+            Interop.Vector4.DeleteVector4(swigCPtr);
+        }
+
         internal static new void Preload()
         {
             // Do nothing. Just call for load static values.