To answer my own question in case anyone runs into this. Try this:
private byte* Align(IntPtr buf, uint alignTo) { //The buffer must originally be at least one alignment bigger! var diff = alignTo - (buf.ToInt64() % alignTo); var aligned = (IntPtr)(buf.ToInt64() + diff); return (byte*) aligned; } On Mon, Jan 12, 2015 at 4:19 AM, Greg Young <gregoryyou...@gmail.com> wrote: > Oops read is failing as well. > > Aside from having aligned buffer sizes do I need to do something like > memalign? > > Cheers, > > Greg > > On Mon, Jan 12, 2015 at 3:55 AM, Greg Young <gregoryyou...@gmail.com> wrote: >> I have been trying to use Syscalls a bit but am getting an exception I >> can't figure out why. >> >> Opening code throws no exceptions: >> var flags = OpenFlags.O_RDWR | OpenFlags.O_DIRECT | >> OpenFlags.O_CREAT; >> //var f = NativeConvert.FromOpenFlags(flags); not needed? >> var han = Syscall.open(path, flags, FilePermissions.S_IRWXU); >> if(han < 0) >> throw new Win32Exception(); >> >> var handle = new SafeFileHandle((IntPtr) han, true); >> if(handle.IsInvalid) throw new Exception("Invalid handle"); >> return handle; >> >> Then I call write: >> >> fixed (byte* b = buffer) >> { >> long ret = 0; >> do { >> ret = Syscall.write >> (handle.DangerousGetHandle().ToInt32(), b ,count); >> } while (Mono.Unix.UnixMarshal.ShouldRetrySyscall ((int) >> ret)); >> if(ret == -1) >> Mono.Unix.UnixMarshal.ThrowExceptionForLastErrorIf >> ((int) ret); >> } >> >> I get an invalid parameter exception. Read seems to work following a >> similar pattern so not quite sure whats wrong. >> >> My writes are of size 4096. Perhaps the issue is needing to call >> memalign? I would expect reads to fail as well then though >> >> Cheers, >> >> Greg >> >> >> 13) Test Error : >> EventStore.Core.Tests.TransactionLog.Unbuffered.UnbufferedTests.when_writing_then_seeking_exact_to_alignment_and_writing_again >> System.ArgumentException : Invalid argument >> ----> Mono.Unix.UnixIOException : Invalid argument [EINVAL]. >> at Mono.Unix.UnixMarshal.ThrowExceptionForLastError () [0x00000] in >> <filename unknown>:0 >> at Mono.Unix.UnixMarshal.ThrowExceptionForLastErrorIf (Int32 retval) >> [0x00000] in <filename unknown>:0 >> at EventStore.Core.TransactionLog.Unbuffered.NativeFile.Write >> (Microsoft.Win32.SafeHandles.SafeFileHandle handle, System.Byte[] >> buffer, UInt32 count, System.Int32& written) [0x00000] in <filename >> unknown>:0 >> at >> EventStore.Core.TransactionLog.Unbuffered.UnbufferedIOFileStream.InternalWrite >> (System.Byte[] buffer, UInt32 count) [0x00000] in <filename unknown>:0 >> at EventStore.Core.TransactionLog.Unbuffered.UnbufferedIOFileStream.Flush >> () [0x00000] in <filename unknown>:0 >> at EventStore.Core.TransactionLog.Unbuffered.UnbufferedIOFileStream.Dispose >> (Boolean disposing) [0x00000] in <filename unknown>:0 >> at System.IO.Stream.Close () [0x00000] in <filename unknown>:0 >> at System.IO.Stream.Dispose () [0x00000] in <filename unknown>:0 >> at >> EventStore.Core.Tests.TransactionLog.Unbuffered.UnbufferedTests.when_writing_then_seeking_exact_to_alignment_and_writing_again >> () [0x00000] in <filename unknown>:0 >> at (wrapper managed-to-native) >> System.Reflection.MonoMethod:InternalInvoke >> (System.Reflection.MonoMethod,object,object[],System.Exception&) >> at System.Reflection.MonoMethod.Invoke (System.Object obj, >> BindingFlags invokeAttr, System.Reflection.Binder binder, >> System.Object[] parameters, System.Globalization.CultureInfo culture) >> [0x00000] in <filename unknown>:0 >> --UnixIOException >> >> >> >> -- >> Studying for the Turing test > > > > -- > Studying for the Turing test -- Studying for the Turing test _______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-devel-list