- int numEvents = kevent_notimeout (conn, changes, changes.Length, eventBuffer, eventBuffer.Length, IntPtr.Zero);
+ // We are calling an icall, so have to marshal manually
+ // Marshal in
+ int ksize = Marshal.SizeOf<kevent> ();
+ var changesNative = Marshal.AllocHGlobal (ksize * changes.Length);
+ for (int i = 0; i < changes.Length; ++i)
+ Marshal.StructureToPtr (changes [i], changesNative + (i * ksize), false);
+ var eventBufferNative = Marshal.AllocHGlobal (ksize * eventBuffer.Length);
+
+ int numEvents = kevent_notimeout (ref conn, changesNative, changes.Length, eventBufferNative, eventBuffer.Length);
+
+ // Marshal out
+ Marshal.FreeHGlobal (changesNative);
+ for (int i = 0; i < numEvents; ++i)
+ eventBuffer [i] = Marshal.PtrToStructure<kevent> (eventBufferNative + (i * ksize));
+ Marshal.FreeHGlobal (eventBufferNative);