WINE/Разработчику/ФайловыеБлокировки

Материал из Русский WINE
Перейти к: навигация, поиск
Wackowiki-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была автоматически перемещена с old.wiki.etersoft.ru.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.


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

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

Взаимодействие подсистем при замещении блокировок

http://download.etersoft.ru/pub/people/lav/www/LockWINE.png

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

Для Windows:

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

Если файл открыт на запись, заблокировать область можно только если она уже не заблокирована любым образом.

По-другому:

  • Если мы читаем - не даём никому туда писать
  • Если мы пишем - не даём никому туда писать и читать

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

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

  • Установка блокировок в одном процессе ВСЕГДА успешна. Т.е. попытка повторно заблокировать область блокированную ранее в этом же процессе завершается успешно
  • Блокировки НА ЧТЕНИЕ разрешено ставить многим процессам, если при этом не стоит блокировка на запись.
  • Блокировки НА ЗАПИСЬ разрешено ставить только одному процессу. Соответственно если хоть один процесс создал блокировку на чтение, то попытка установить блокирование на запись будет НЕ удачной.
  • Блокирование НА ЧТЕНИЕ возможно только если файл открыт на чтение или на чтение-запись
  • Блокирование НА ЗАПИСЬ возможно только если файл открыт на запись или на чтение-запись
  • При блокировании на чтение несколькими процессами F_GETLK возвращает pid первого заблокировавшего процесса. Если при этом первый процесс разблокировал занятую область, то F_GETLK будет возвращать pid следующего процесса и так пока все процессы установившие блокировку на чтение не снимут её.

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

#define LOCKOFFSET (0xffffffff - 10)

...

 memset (&lock, 0, sizeof(lock));

 lock.l_type = F_WRLCK;

 rw = fcntl (fd, F_SETLK, &lock);

Для CreateFile:

ShareMode

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 все попытки CreateFile

2

GENERIC_READ

SHARE_READ

failed все попытки CreateFile с GENERIC_WRITE и failed с GENERIC_READ если нет FILE_SHARE_READ

3

GENERIC_READ

SHARE_WRITE

failed если нет FILE_SHARE_WRITE

4

GENERIC_WRITE

0

failed все попытки CreateFile

5

GENERIC_WRITE

SHARE_READ

failed если нет FILE_SHARE_READ

6

GENERIC_WRITE

SHARE_WRITE

failed если нет FILE_SHARE_WRITE

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

Блокировки должны наводиться с помощью LockFile. Для LockFile: Проверить, отображает ли WINE блокируемую область в ядро.

За проверку режима разделения файла отвечает check_sharing в файле wine/server/fd.c

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

Старое

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

Ссылки

WINE

MSDN

Остальное

Wine
Search.png
Программы работающие в Wine • Скачать • Школьный Wine
WINE@Etersoft Общие сведения • Установка на 64-битные ОС • Особенности разработки • Патчи для WINE@Etersoft • Административная установка • Дополнительные компоненты • Как получить WINE@Etersoft? • Лицензия на документацию • Глоссарий • Использование аппаратных ключей защиты в Linux • Дополнительная информация • [ Совместная работа | по CIFS • по NFS ] • Изменение системных ограничений • Регистрация продукта • Пошаговая инструкция по установке rpm-пакетов • Обращение в службу поддержки • Терминальные решения • Установка WINE@Etersoft • Подписка на обновления • Настройка WINE@Etersoft • Разработчику • Enterprise • Что такое WINE@Etersoft SQL • Возможности • Среда для запуска приложений Windows • Использование WINE@Etersoft • FAQ по использованию WINE@Etersoft • Основные команды • WINE@Etersoft/Local • Что такое WINE@Etersoft Local
Программы Запуск БЭСТ 4+ • Запуск Консультант+ (сетевой версии) • ГарантF1 • Инфо-Бухгалтер 8.x • Налогоплательщик ЮЛ
1C Отличия от обычного Wine • Местоположение базы 1С • 1C: Предприятие 7.7 в WINE • Настройка 1С 7.7 для работы с SQL-сервером • Установка 1С: Предприятия 8.1 • Установка 1С: Предприятия 8.1 в трёхзвенном режиме
Пользователю
Помощь Использование Winecfg • Использование Regedit • Публичный префикс • Несколько версий • Ключи regedit
Легальность DCOM95 • IE5 • DCOM • MSXML
Утилиты для работы с Wine Winetricks • WineTools • Q4Wine • PlayOnLinux • IEs4Linux • Wine-Doors • Swine • Wine Launcher • Lutris
Разработчику
Компоненты Windows • Запрет отключения защиты программы • Управление обработчиком исключений • StraceNT • Измерение скорости функций WinAPI • GL • Устройство чтения смарт-карт • Профилирование • Тесты для проверки интерфейсов • Написание тестов в системе Wine • Аутентификация в домене AD • Репозитории • Применение Git-патчей
Помощь Создание патчей • Написание приложения под wine • Отправка патчей • Сборка eterhack • Сборка wine-public
Отладка Способы отладки • WINEDEBUG • Winedbg
Разработка WINE
1C • ODBC • WinHelp • Компас • Методика • Тестирование доступа • Цвета • Файловый диалог • Тестирование • Литература • Изображения • Win32 • Шрифты • Файловые блокировки • Ссылки • Ключи защиты • RPM • WineGecko • ListView • Упаковка Wine
Производителю
Родственные проекты
LUK • ReactOS • ARWINSS • CrossOver • KernelEx
Прочее
PageSetupDlg • FreeBSD • Wwr