Add test for pinned gc handle.
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 29 Jun 2012 21:27:18 +0000 (18:27 -0300)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 29 Jun 2012 21:27:59 +0000 (18:27 -0300)
mono/tests/gchandles.cs

index 14e9d983e46006ba089159f89d455bce829660a6..0f5fd37221c83694135584ea2f6b2112d3c4962a 100644 (file)
@@ -1,6 +1,30 @@
 using System;
+using System.Threading;
 using System.Runtime.InteropServices;
 
+[StructLayout(LayoutKind.Explicit)]
+internal struct ObjectWrapper {
+       [FieldOffset(0)] object obj;
+       [FieldOffset(0)] IntPtr handle;
+
+       internal static IntPtr Convert (object obj) {
+               ObjectWrapper wrapper = new ObjectWrapper ();
+
+               wrapper.obj = obj;
+
+               return wrapper.handle;
+       }
+       
+       internal static object Convert (IntPtr ptr) 
+       {
+               ObjectWrapper wrapper = new ObjectWrapper ();
+               
+               wrapper.handle = ptr;
+                       
+               return wrapper.obj;
+       }
+}
+
 public class Test1
 {
        public GCHandle self;
@@ -66,4 +90,24 @@ public class Tests
                System.Threading.Thread.Sleep (100);
                return Test2.fail ? 1 : 0;
        }
+
+       static GCHandle handle;
+       static IntPtr original_addr;
+       
+       static void alloc_handle () {
+               var obj = new object ();
+               handle = GCHandle.Alloc (obj, GCHandleType.Pinned);
+               original_addr =  ObjectWrapper.Convert (obj);
+       }
+
+       public static int test_0_pinned_handle_pins_target () {
+               var t = new Thread (alloc_handle);
+               t.Start ();
+               t.Join ();
+               GC.Collect ();
+
+               var newAddr = ObjectWrapper.Convert (handle.Target);
+
+               return original_addr == newAddr ? 0 : 1;
+       }
 }
\ No newline at end of file