Информация об изменениях

Сообщение Итог: Для O_DIRECT надо выравнивать адрес буфера тоже от 15.05.2019 18:37

Изменено 15.05.2019 19:27 VladCore

Re: Как этот O_DIRECT передать? :???:
Здравствуйте, VladCore, Вы писали:

VC>В Windows кто не в курсе отключить кеширование и чтения и записи можно в конструкторе FileStream секретной опцией:


VC>в линуксе нужно передавать O_DIRECT

VC># define O_DIRECT 040000

Черт. В линуксе кеш на чтение не выключается вот атким методом:
const int O_DIRECT = 0x4000;
using (var stream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length,
    (FileOptions) O_DIRECT | FileOptions.WriteThrough))
{
   ....
}

Это .net core 2.2 если что
Я могу конечно в mono проверить, но мне надо в Core.
Что то пошло не так?
Re: Как этот O_DIRECT передать? :???:
Здравствуйте, VladCore, Вы писали:

VC>В Windows кто не в курсе отключить кеширование и чтения и записи можно в конструкторе FileStream секретной опцией:


VC>в линуксе нужно передавать O_DIRECT

VC># define O_DIRECT 040000

Черт. В линуксе кеш на чтение не выключается вот атким методом:
const int O_DIRECT = 0x4000;
using (var stream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length,
    (FileOptions) O_DIRECT | FileOptions.WriteThrough))
{
   ....
}

Это .net core 2.2 если что
Я могу конечно в mono проверить, но мне надо в Core.
Что то пошло не так?

Update: Отвечаю сам себе. В core все подряд нельзя передавать в FileOptions. Приехали:

    private static Interop.Sys.OpenFlags PreOpenConfigurationFromOptions(
      FileMode mode,
      FileAccess access,
      FileShare share,
      FileOptions options)
    {
      Interop.Sys.OpenFlags openFlags = Interop.Sys.OpenFlags.O_RDONLY;
      switch (mode)
      {
        case FileMode.CreateNew:
          openFlags |= Interop.Sys.OpenFlags.O_CREAT | Interop.Sys.OpenFlags.O_EXCL;
          break;
        case FileMode.Create:
        case FileMode.OpenOrCreate:
        case FileMode.Append:
          openFlags |= Interop.Sys.OpenFlags.O_CREAT;
          break;
      }
      switch (access)
      {
        case FileAccess.Read:
          openFlags |= Interop.Sys.OpenFlags.O_RDONLY;
          break;
        case FileAccess.Write:
          openFlags |= Interop.Sys.OpenFlags.O_WRONLY;
          break;
        case FileAccess.ReadWrite:
          openFlags |= Interop.Sys.OpenFlags.O_RDWR;
          break;
      }
      if ((share & FileShare.Inheritable) == FileShare.None)
        openFlags |= Interop.Sys.OpenFlags.O_CLOEXEC;
        // Вот тут только FileOptions читается и всё
      if ((options & FileOptions.WriteThrough) != FileOptions.None)
        openFlags |= Interop.Sys.OpenFlags.O_SYNC;
      return openFlags;
    }


Надо как то самому получить SafeFileHandle и передать его в констутор
public FileStream(SafeFileHandle handle, FileAccess access, int bufferSize, bool isAsync);