Вход:  Пароль:  
FreeSource: WINE/Разработчику/ФайловыеБлокировки ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |

Файловые блокировки


На самом деле речь пойдёт о режимах разделения файлов с другими задачами.


Взаимодействие подсистем при замещении блокировок
http://download.etersoft.ru/pub/people/lav/www/LockWINE.png

Как я понимаю блокирование

Для Windows:
Если файл открыт на чтение, его могут блокировать все, также открывающие его на чтение. При попытке заблокировать на запись будет ошибка.
Если файл открыт на запись, заблокировать область можно только если она уже не заблокирована любым образом.
По-другому:

Результаты тестов в Linux

На данный момент по результатам запуска тестовых программ, можно сделать следующие выводы:

Таблицы отображения режимов в блокировки файлов



Для Create File?:

Share Mode? offset
0 LOCKOFFSET +?
FILE_SHARE_READ LOCKOFFSET + 1
FILE_SHARE_WRITE LOCKOFFSET +2
FILE_SHARE_DELETE LOCKOFFSET +4

Access offset
0 LOCKOFFSET + ?
GENERIC_READ (0x8...) LOCKOFFSET + 5
GENERIC_WRITE (0x4...) LOCKOFFSET + 6

unlink LOCKOFFSET + 7

Комментарий

По поводу значения LOCKOFFSET – старший бит знаковый, поэтому ?0xfffffff? Иначе не работает fcntl...


Возможные варианты реализации:


  1. Написать тестовую программу на SHARING (взять из WINE?) и проверить в Windows / WINE?.

Этап generic sharemode
1 GENERIC_READ 0 failed все попытки Create File?
2 GENERIC_READ SHARE_READ failed все попытки Create File? с GENERIC_WRITE и failed с GENERIC_READ если нет FILE_SHARE_READ
3 GENERIC_READ SHARE_WRITE failed если нет FILE_SHARE_WRITE
4 GENERIC_WRITE 0 failed все попытки Create File?
5 GENERIC_WRITE SHARE_READ failed если нет FILE_SHARE_READ
6 GENERIC_WRITE SHARE_WRITE failed если нет FILE_SHARE_WRITE

  1. Написать реализацию отображения блокировок (в wineserver) и проверить в WINE тестовую программу

Блокировки должны наводиться с помощью Lock File?. Для Lock File?: Проверить, отображает ли WINE блокируемую область в ядро.
За проверку режима разделения файла отвечает check_sharing в файле wine/server/fd.c


  1. По возможности блокирование перенести в libwine из wineserver

Старое

  1. Проверить файловые блокировки в WINE
  2. Построить на них SHARING
  3. Другой процесс закроет файл – отразится ли у всех?

Ссылки

WINE

MSDN

Остальное


Страницы, ссылающиеся на данную: WINE/Разработчику


 
Файлы [Скрыть файлы/форму]
Комментариев нет. [Показать комментарии/форму]