На самом деле речь пойдёт о режимах разделения файлов с другими задачами.
Взаимодействие подсистем при замещении блокировок
Как я понимаю блокирование
Для Windows:
Если файл открыт на чтение, его могут блокировать все, также открывающие его на чтение. При попытке заблокировать на запись будет ошибка.
Если файл открыт на запись, заблокировать область можно только если она уже не заблокирована любым образом.
По-другому:
Если мы читаем – не даём никому туда писать
Если мы пишем – не даём никому туда писать и читать
Результаты тестов в Linux
На данный момент по результатам запуска тестовых программ, можно сделать следующие выводы:
Установка блокировок в одном процессе ВСЕГДА успешна. Т.е. попытка повторно заблокировать область блокированную ранее в этом же процессе завершается успешно
Блокировки НА ЧТЕНИЕ разрешено ставить многим процессам, если при этом не стоит блокировка на запись.
Блокировки НА ЗАПИСЬ разрешено ставить только одному процессу. Соответственно если хоть один процесс создал блокировку на чтение, то попытка установить блокирование на запись будет НЕ удачной.
Блокирование НА ЧТЕНИЕ возможно только если файл открыт на чтение или на чтение-запись
Блокирование НА ЗАПИСЬ возможно только если файл открыт на запись или на чтение-запись
При блокировании на чтение несколькими процессами F_GETLK возвращает pid первого заблокировавшего процесса. Если при этом первый процесс разблокировал занятую область, то F_GETLK будет возвращать pid следующего процесса и так пока все процессы установившие блокировку на чтение не снимут её.
Написать реализацию отображения блокировок (в wineserver) и проверить в WINE тестовую программу
Блокировки должны наводиться с помощью Lock File?. Для Lock File?: Проверить, отображает ли WINE блокируемую область в ядро.
За проверку режима разделения файла отвечает check_sharing в файле wine/server/fd.c
По возможности блокирование перенести в libwine из wineserver
Старое
Проверить файловые блокировки в WINE
Построить на них SHARING
Другой процесс закроет файл – отразится ли у всех?