public unsafe void WriteBuffer(long position, byte *srcPosition, int sizeToWrite)
        {
            var offset = Convert.ToUInt64(sizeToWrite);

            var result = Syscall.pwrite(_fd, srcPosition, (ulong)sizeToWrite, (long)offset);

            if (result == -1)
            {
                var err = Marshal.GetLastWin32Error();
                PosixHelper.ThrowLastError(err);
            }
        }
예제 #2
0
        private unsafe void WriteFile(long position, byte *p, int numberOf4Kb)
        {
            if (numberOf4Kb == 0)
            {
                return; // nothing to do
            }
            var  nNumberOfBytesToWrite = (ulong)numberOf4Kb * (4 * Constants.Size.Kilobyte);
            long actuallyWritten       = 0;
            long result;

            using (_options.IoMetrics.MeterIoRate(_filename.FullPath, IoMetrics.MeterType.JournalWrite, (long)nNumberOfBytesToWrite))
            {
                do
                {
                    result = Syscall.pwrite(_fd, p, nNumberOfBytesToWrite - (ulong)actuallyWritten,
                                            position * 4 * Constants.Size.Kilobyte);
                    if (result < 1)
                    {
                        break;
                    }
                    actuallyWritten += result;
                    p += actuallyWritten;
                } while ((ulong)actuallyWritten < nNumberOfBytesToWrite);
            }
            if (result == -1)
            {
                var err = Marshal.GetLastWin32Error();
                Syscall.ThrowLastError(err, "when writing to " + _filename);
            }
            else if (result == 0)
            {
                var err = Marshal.GetLastWin32Error();
                throw new IOException($"pwrite reported zero bytes written, after write of {actuallyWritten} bytes out of {nNumberOfBytesToWrite}. lastErrNo={err} on {_filename}");
            }
            else if ((ulong)actuallyWritten != nNumberOfBytesToWrite)
            {
                var err = Marshal.GetLastWin32Error();
                throw new IOException($"pwrite couln't write {nNumberOfBytesToWrite} to file. only {actuallyWritten} written. lastErrNo={err} on {_filename}");
            }
        }