Let we free allocated heap memory by Mashal.
It might cause memory leak issue if user try to use VertexBuffer.
And also, let we also fix FrameBrokerBase implementation
that might be the guideline who want to use custom Geometry class.
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
vertex3.position = new Vec2(0.5f, -0.5f);
vertex4.position = new Vec2(0.5f, 0.5f);
-
TexturedQuadVertex[] texturedQuadVertexData = new TexturedQuadVertex[4] { vertex1, vertex2, vertex3, vertex4 };
- int lenght = Marshal.SizeOf(vertex1);
- IntPtr pA = Marshal.AllocHGlobal(lenght * 4);
+ int length = Marshal.SizeOf(vertex1);
+ IntPtr pA = Marshal.AllocHGlobal(checked(length * 4));
- for (int i = 0; i < 4; i++)
+ try
+ {
+ for (int i = 0; i < 4; i++)
+ {
+ Marshal.StructureToPtr(texturedQuadVertexData[i], pA + i * length, true);
+ }
+ vertexData.SetData(pA, 4);
+ }
+ finally
{
- Marshal.StructureToPtr(texturedQuadVertexData[i], pA + i * lenght, true);
+ // Free AllocHGlobal memory after call PropertyBuffer.SetData()
+ Marshal.FreeHGlobal(pA);
}
- vertexData.SetData(pA, 4);
Geometry geometry = new Geometry();
geometry.AddVertexBuffer(vertexData);
public Vec2 position;
};
- private IntPtr RectangleDataPtr()
+ private PropertyBuffer CreateQuadPropertyBuffer()
{
+ /* Create Property buffer */
+ PropertyValue value = new PropertyValue((int)PropertyType.Vector2);
+ PropertyMap vertexFormat = new PropertyMap();
+ vertexFormat.Add("aPosition", value);
+
+ PropertyBuffer vertexBuffer = new PropertyBuffer(vertexFormat);
+
TexturedQuadVertex vertex1 = new TexturedQuadVertex();
TexturedQuadVertex vertex2 = new TexturedQuadVertex();
TexturedQuadVertex vertex3 = new TexturedQuadVertex();
TexturedQuadVertex[] texturedQuadVertexData = new TexturedQuadVertex[4] { vertex1, vertex2, vertex3, vertex4 };
- int lenght = Marshal.SizeOf(vertex1);
- IntPtr pA = Marshal.AllocHGlobal(lenght * 4);
+ int length = Marshal.SizeOf(vertex1);
+ IntPtr pA = Marshal.AllocHGlobal(checked(length * 4));
- for (int i = 0; i < 4; i++)
+ try
{
- Marshal.StructureToPtr(texturedQuadVertexData[i], pA + i * lenght, true);
+ for (int i = 0; i < 4; i++)
+ {
+ Marshal.StructureToPtr(texturedQuadVertexData[i], pA + i * length, true);
+ }
+
+ vertexBuffer.SetData(pA, 4);
+ }
+ finally
+ {
+ // Free AllocHGlobal memory after call PropertyBuffer.SetData()
+ Marshal.FreeHGlobal(pA);
}
- return pA;
+ value.Dispose();
+ vertexFormat.Dispose();
+
+ return vertexBuffer;
}
private Geometry CreateQuadGeometry()
{
- /* Create Property buffer */
- PropertyValue value = new PropertyValue((int)PropertyType.Vector2);
- PropertyMap vertexFormat = new PropertyMap();
- vertexFormat.Add("aPosition", value);
-
- PropertyBuffer vertexBuffer = new PropertyBuffer(vertexFormat);
- vertexBuffer.SetData(RectangleDataPtr(), 4);
+ PropertyBuffer vertexBuffer = CreateQuadPropertyBuffer();
Geometry geometry = new Geometry();
geometry.AddVertexBuffer(vertexBuffer);
geometry.SetType(Geometry.Type.TRIANGLE_STRIP);
- value.Dispose();
- vertexFormat.Dispose();
vertexBuffer.Dispose();
return geometry;
texturesArray[i] = HandleRef.ToIntPtr(Texture.getCPtr(textures[i]));
}
IntPtr unmanagedPointer = Marshal.AllocHGlobal(intptrBytes);
- Marshal.Copy(texturesArray, 0, unmanagedPointer, texturesArray.Length);
-
- Interop.GLView.GlViewBindTextureResources(SwigCPtr, unmanagedPointer, texturesArray.Length);
- Marshal.FreeHGlobal(unmanagedPointer);
+ try
+ {
+ Marshal.Copy(texturesArray, 0, unmanagedPointer, texturesArray.Length);
+ Interop.GLView.GlViewBindTextureResources(SwigCPtr, unmanagedPointer, texturesArray.Length);
+ }
+ finally
+ {
+ Marshal.FreeHGlobal(unmanagedPointer);
+ }
}
}
}
Marshal.StructureToPtr(ad, ptr, false);
Interop.ControlDevel.DaliAccessibilitySetAccessibilityDelegate(ptr, Convert.ToUInt32(size));
+
+ // Do not free AllocHGlobal memory, for performance. It will be used for native side very frequencly.
+ // Note that Marshal.AllocHGlobal memory will be freed after process terminated.
}
private static View GetViewFromRefObject(IntPtr refObjectPtr)
/// <remarks>
/// Internal Dali resources with BaseHandle has reference count internally.<br/>
/// And Dali resources will release the object only if reference count become zero.<br/>
- /// It mean, even we call <see cref="Dispose"/>, the reousrce will not be released if some native has reference count.
+ /// It mean, even we call <see cref="Dispose()"/>, the reousrce will not be released if some native has reference count.
/// </remarks>
/// <since_tizen> 3 </since_tizen>
public class BaseHandle : Element, global::System.IDisposable
int structSize = Marshal.SizeOf<VertexType>();
global::System.IntPtr buffer = Marshal.AllocHGlobal(checked(structSize * vertices.Length));
- for (int i = 0; i < vertices.Length; i++)
+ try
{
- Marshal.StructureToPtr(vertices[i], buffer + i * structSize, true);
+ for (int i = 0; i < vertices.Length; i++)
+ {
+ Marshal.StructureToPtr(vertices[i], buffer + i * structSize, true);
+ }
+
+ Interop.VertexBuffer.SetData(SwigCPtr, buffer, (uint)vertices.Length);
+ }
+ finally
+ {
+ // Free AllocHGlobal memory after call Interop.VertexBuffer.SetData()
+ Marshal.FreeHGlobal(buffer);
}
- Interop.VertexBuffer.SetData(SwigCPtr, buffer, (uint)vertices.Length);
if (NDalicPINVOKE.SWIGPendingException.Pending)
throw NDalicPINVOKE.SWIGPendingException.Retrieve();
}