OberonCore
https://forum.oberoncore.ru/

Обработка ситуации с неразделяемым файлом
https://forum.oberoncore.ru/viewtopic.php?f=127&t=5300
Страница 1 из 1

Автор:  Иван Денисов [ Пятница, 26 Декабрь, 2014 19:37 ]
Заголовок сообщения:  Обработка ситуации с неразделяемым файлом

Так получилось, что в результате обсуждений и голосований в Центре, существующие сборки разошлись на достаточно низком уровне и на уровне интерфейса Files.
http://blackboxframework.org/unstable/m ... a1.037.zip

Был в ББ начат один тренд, связанный с тем, что раньше (как я понял в версии 1.4) Files.NewWriter возвращал NIL, если файл открыт в неразделяемом режиме, ну а в новых версиях это убрали, заменив аварийной остановкой. Это создало трудности, что до вызова NewWriter невозможно определить в каком состоянии файл и также нельзя определить был ли он уже закрыт или нет.

В сборке OberonCore проблема решилась возвращением NIL в качестве работы NewWriter, но центр решил пойти иным путем с подачи Криса Б. и при поддержке Джозефа Темпла, а также проголосовавших за (Robert, Ivan Denisov, luowy, bernhard, Zinn) было принято решение привести не код в соответствие к документации, а документацию в соответствие к коду. А проблему решить добавив две процедуры Closed и Shared. Таким образом в тех редких случаях, когда это действительно нужно, возможно перед открытием проверить статус файла.

Почему такие случаи действительно должны происходить редко. Поскольку в документации к Блэкбоксу прописано правило, что надо открывать файлы только в режиме для совместного пользования. «Открытие файла в разделяемом режиме (shared) является правилом в BlackBox; открытие файла в монопольном режиме (exclusive) — редкое исключение». Это значит, что открыв файл через Old вы никогда не можете вызвать для него NewWriter. Контроль над недопусканием такой ситуации ложиться на плечи программиста.

Однако, если представить, что запись о неком файле получена в нашем модуле извне, то определить в каком состоянии файл в каркасе нет возможности... вот для этого и добавлена процедура Shared(). Процедура Closed добавлена по аналогичной причине. Дело в том, что если все каретки над файлом удалены, то каркас может закрыть файл, при этом программист об этом узнать также никак не мог. Ситуации хотя редкие, тем не менее строгость в таком вопросе должна быть.

Вот такой получился длинный комментарий.

Автор:  Иван Денисов [ Суббота, 27 Декабрь, 2014 04:48 ]
Заголовок сообщения:  Re: Обработка ситуации с неразделяемым файлом

Ошибку увидел утром, вот так должно быть написано «Files.NewWriter возвращал NIL, если файл открыт в разделяемом (shared) режиме»...

Автор:  Valery Solovey [ Вторник, 30 Декабрь, 2014 00:37 ]
Заголовок сообщения:  Re: Обработка ситуации с неразделяемым файлом

До вызова NewWriter нельзя определить, в каком состоянии файл. Точнее, можно, но во время вызова NewWriter состояние уже может быть другим. Операция проверки и получения должна быть атомарной.

И если мне не изменяет память, то shared/exclusive - это виндовая фича. А значит, вы сейчас хотите привязаться к винде ещё сильнее, чем оно уже есть.

Автор:  Иван Денисов [ Вторник, 30 Декабрь, 2014 13:55 ]
Заголовок сообщения:  Re: Обработка ситуации с неразделяемым файлом

Валерий, на мой взгляд, не совсем так. Это поведение свойственно самому каркасу и не привязывает его к конкретной ОС. Это состояние является переменной в HostFiles.File и берется оттуда, а не из операционной системы, поэтому оно никак не может измениться с момента открытия файла. Открывая файл в одном режиме гарантируется, что он в таком режиме и остается.

Автор:  Пётр Кушнир [ Вторник, 30 Декабрь, 2014 15:43 ]
Заголовок сообщения:  Re: Обработка ситуации с неразделяемым файлом

Вообще говоря, я в своих реализациях интерфейса Files.File тоже ориентировался на способ сообщения пользователю о невозможности записи с помощью NewWriter() = NIL

Автор:  Иван Денисов [ Вторник, 30 Декабрь, 2014 20:21 ]
Заголовок сообщения:  Re: Обработка ситуации с неразделяемым файлом

Пётр Кушнир писал(а):
Вообще говоря, я в своих реализациях интерфейса Files.File тоже ориентировался на способ сообщения пользователю о невозможности записи с помощью NewWriter() = NIL

Видимо это приводило к каким-то ошибкам, раз в Oberon microsystems предпочли поставить аварийную остановку... теоретически возможно придумать такую ситуацию. Скажем, Writer может быть NIL по разным причинам (файл не удалось открыть, файл открыт в разделяемом режиме, файл уже был закрыт), а потом его отличие от NIL может быть условием для запуска других команд. Неопределенность создает проблемы при обработке исключений. Поэтому в версиях 1.5 - 1.6 они сделали так, что NIL возможен только если ни разу не вызывался NewWriter.

Получается, что из постусловия они перенесли требования неразделяемости файла в предусловие, но документацию не поправили. Этот перенос из постусловия в предусловие, подчеркивает то, что написано в документации, а именно, что контроль состояния файла — задача программиста.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/