Значит, есть у меня класс обертка над boost'ким file_mapping (memmty mapped file), и есть к ней тесты.
Одни из тестов проверяет следующую логику: 1. файл маппиться в средствами boost
file_mapping mmfile(filename.c_str(), read_write);
MMFile file(&mmfile, 1);
2. открываю этот же файл fopen как readonly
3. через MMFile.write я делаю запись, что грубо говоря сводиться к memcpy в текущий спамленный регион.
4. через fread и считываю эти данные. И вот тут происходят казусы типа считанные fread данные могут быть просто нулями (хотя fread возвращает что было считано столько сколько нужно), или что часть данных как нули и другая нормальная.
В начале это казалось просто чем то фантастическим, потому что у меня первая пара действия возвращает нормальные данные, вторая возвращает нули... но после 2-х часов упорного тестирования до меня начала доходить следующая мысль:
file_mapping отображает память ядра в юзерспейс, тем самым избегая одного этапа копирования. А вот fread как раз в начале копирует данные из ядра в юзерспейс а потом только отображает в пространство процесса. И что возможно данные после определенного memcpy не успевают с копироваться в userspace для fread.
Но тогда для меня странно что на винде например этот тест проходит, а на лине нет. И что например при следующий действиях именно такое поведение:
mmfile = file_mapping(file);
region_ = mapped_region( mmfile, read_write, 0, windowSize_ );
file = fopen(file, "r");
memcpy(data, dest, len);
fread(dest, 1, len); // тут у нас данные целиком
memcpy(data, dest, len);
// если тут вставим memcpy(dest, readBuf, len) то следующая fread уже считает реальные данные вместо нулей
fread(dest, 1, len); // тут у нас уже вместо данных нули
проверить это в тестировании явно не получается, потому что в одном случае данные не нулевые, в другой нулевые, в третьем их только половина. А разница между кейсами нету, просто меняем порядок и количество операций.
Из документации буста, и это явно не уловил возможно там этот «ненормальный - попытка работать с файлом одновременно как с MM и fopen» кейс просто не указан.