OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 07:17

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 26 Декабрь, 2014 19:37 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Так получилось, что в результате обсуждений и голосований в Центре, существующие сборки разошлись на достаточно низком уровне и на уровне интерфейса 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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Ошибку увидел утром, вот так должно быть написано «Files.NewWriter возвращал NIL, если файл открыт в разделяемом (shared) режиме»...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Декабрь, 2014 00:37 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
До вызова NewWriter нельзя определить, в каком состоянии файл. Точнее, можно, но во время вызова NewWriter состояние уже может быть другим. Операция проверки и получения должна быть атомарной.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Декабрь, 2014 13:55 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Валерий, на мой взгляд, не совсем так. Это поведение свойственно самому каркасу и не привязывает его к конкретной ОС. Это состояние является переменной в HostFiles.File и берется оттуда, а не из операционной системы, поэтому оно никак не может измениться с момента открытия файла. Открывая файл в одном режиме гарантируется, что он в таком режиме и остается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Декабрь, 2014 15:43 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Вообще говоря, я в своих реализациях интерфейса Files.File тоже ориентировался на способ сообщения пользователю о невозможности записи с помощью NewWriter() = NIL


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Декабрь, 2014 20:21 
Аватара пользователя

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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB