]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-3381 --resolve Memory leak in mod_managed by EventBinding and swig delete_switch_event
authorJeff Lenk <jeff@jefflenk.com>
Sat, 9 Jul 2011 22:02:33 +0000 (17:02 -0500)
committerJeff Lenk <jeff@jefflenk.com>
Sat, 9 Jul 2011 22:02:33 +0000 (17:02 -0500)
src/mod/languages/mod_managed/managed/EventBinding.cs

index f8de8891d6b8731fb0bb59ee86924c5624afd5a7..0090d6e3b1ad95998c38073ec09edebadca9a5c6 100644 (file)
@@ -38,6 +38,38 @@ using FreeSWITCH.Native;
 \r
 namespace FreeSWITCH\r
 {\r
+    /*  When this class is used you must call Dispose on the object when done or you will leak the unmanaged switch_event */\r
+    public class SwitchEventWrap : switch_event, IDisposable\r
+    {\r
+        private bool disposed;\r
+        private SWIGTYPE_p_p_switch_event p_p_switch_event;\r
+        private IntPtr native_ptr_ptr;\r
+\r
+        internal SwitchEventWrap(IntPtr ptrPtr) : base((IntPtr)Marshal.PtrToStructure(ptrPtr, typeof(IntPtr)), false)\r
+        {\r
+            native_ptr_ptr = ptrPtr;\r
+            p_p_switch_event = new SWIGTYPE_p_p_switch_event(ptrPtr, false);\r
+        }\r
+\r
+        ~SwitchEventWrap()\r
+        {\r
+            dispose();\r
+        }\r
+\r
+        public override void Dispose()\r
+        {\r
+            dispose();\r
+            GC.SuppressFinalize(this);\r
+        }\r
+\r
+        internal void dispose()\r
+        {\r
+            if (disposed) return;\r
+            disposed = true;\r
+            freeswitch.switch_event_destroy(p_p_switch_event);\r
+            Marshal.FreeCoTaskMem(native_ptr_ptr);\r
+        }\r
+    }\r
 \r
     public class EventBinding : IDisposable\r
     {\r
@@ -82,9 +114,7 @@ namespace FreeSWITCH
         {\r
             IntPtr clone_ptr_ptr = Marshal.AllocCoTaskMem(IntPtr.Size);\r
             freeswitch.switch_event_dup(new SWIGTYPE_p_p_switch_event(clone_ptr_ptr, false), evt);\r
-            IntPtr event_ptr = (IntPtr)Marshal.PtrToStructure(clone_ptr_ptr, typeof(IntPtr));\r
-            switch_event dupe_evt = new switch_event(event_ptr, false);\r
-            Marshal.FreeCoTaskMem(clone_ptr_ptr);\r
+            SwitchEventWrap dupe_evt = new SwitchEventWrap(clone_ptr_ptr);\r
             return dupe_evt;\r
         }\r
         public static IDisposable Bind(string id, switch_event_types_t event_types, string subclass_name, Action<EventBindingArgs> f, bool dupe)\r