public Event EnqueueFillBuffer <T>(Mem <T> buffer, T[] pattern, uint offset, uint length, Event[] eventWaitList) where T : struct { var numEvents = 0; IntPtr[] events = null; if (eventWaitList != null) { numEvents = eventWaitList.Length; events = Event.ToIntPtr(eventWaitList); } IntPtr result = IntPtr.Zero; GCHandle gch = GCHandle.Alloc(pattern, GCHandleType.Pinned); try { var error = NativeMethods.clEnqueueFillBuffer( this.handle, buffer.handle, gch.AddrOfPinnedObject(), (IntPtr)(Marshal.SizeOf <T>() * pattern.Length), (IntPtr)offset, (IntPtr)length, (uint)numEvents, events, out result); if (error != ErrorCode.Success) { throw new OpenClException(error); } } finally { gch.Free(); } return(new Event(result)); }