[Mono-dev] Mono.Unix.Native
Greg Young
gregoryyoung1 at gmail.com
Mon Jan 12 01:55:50 UTC 2015
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
More information about the Mono-devel-list
mailing list