OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 03:00

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: жуки в HostFiles?
СообщениеДобавлено: Четверг, 08 Апрель, 2010 14:35 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Похоже, обнаружил ошибку в модуле HostFiles в процедуре Old. При вызове процедуры с несуществующим указанным файлом срабатывает капкан (trap) под номером 107.
Процедура вызывается из создаваемой библиотеки.
Код:
MODULE TestFiles;

   IMPORT Files, (*Log := StdLog*) Console, LinConsole;
   
   PROCEDURE WriteLn(s: ARRAY OF CHAR);
   BEGIN
      (*Log.String(s); Log.Ln*)
      Console.WriteStr(s); Console.WriteLn
   END WriteLn;
   
   PROCEDURE WriteInt(x: INTEGER);
   BEGIN
      (*Log.Int(x); Log.Ln*)
      Console.WriteChar(CHR(x + ORD('0'))); Console.WriteLn
   END WriteInt;
   
   PROCEDURE Do*;
      VAR f: Files.File; loc: Files.Locator;
   BEGIN
      loc := Files.dir.This(".");
      f := Files.dir.Old (loc, "Test1.cmps", Files.shared);
      IF f # NIL THEN
         WriteLn("Opened.");
         f.Close()
      ELSE
         WriteLn("Failed.");
         IF loc.res # 0 THEN
            WriteInt(loc.res)
         END
      END
   END Do;
   
BEGIN
   Console.Open;
   Do
END TestFiles.


TestFiles.Do

DevElfLinker.LinkDll libfiles.so := Kernel+ Files HostFiles Console LinConsole TestFiles#~


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Четверг, 08 Апрель, 2010 14:51 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Четверг, 08 Апрель, 2010 15:05 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
А можно подробнее о том как проводился опыт? Это точно в Линуксе?

Я скомпоновал в библиотеку libfiles.so, которую затем подгружал внешней программой-загрузчиком библиотек .so . Кстати, Log не пробовал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Четверг, 08 Апрель, 2010 16:14 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Вряд ли дело в средствах вывода.
Могу сделать такие заключения:
  1. модуль (Lin)HostFiles отличается от твоего (я брал из bb-nix-0.1, Oberon Revival)
  2. что-то связано с Kernel и при выполнении в консоли происходит сбой. Неверная сборка библиотеки? Вызов её?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Четверг, 08 Апрель, 2010 16:57 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Роман М. писал(а):
Похоже, обнаружил ошибку в модуле HostFiles в процедуре Old. При вызове процедуры с несуществующим указанным файлом срабатывает капкан (trap) под номером 107.
Поищи ASSERT(…, 107); ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Четверг, 08 Апрель, 2010 17:17 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Да нашёл уже. В Old вызывается OpenFile. Мне кажется, там проблема с логикой возврата дескриптора файла и кодом ошибки.
Дома гляну.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Четверг, 08 Апрель, 2010 23:14 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Есть мнение, и не только моё, что проблема просачивания invalid file ref может быть связана с errno...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Пятница, 09 Апрель, 2010 09:47 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Прошу прощения, я не подумал, что это выполняется в Линуксе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Суббота, 10 Апрель, 2010 15:32 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Так и есть. На самом деле, errno имеет особый статус: она может быть глобальной переменной или функцией, в зависимости от условной директивы _REENTRANT, определяющей многопоточность.

Покопавшись в исходниках FPC, я увидел, что errno определяется по символу __errno_location. В итоге, в LinLibc я определил
Код:
   TYPE
      PInt* = POINTER TO ARRAY [untagged] 1 OF INTEGER;

   PROCEDURE [ccall] geterrno* ["__errno_location"] (): PInt; (* get last error for streams *)
   PROCEDURE [ccall] seterrno* ["__errno_location"] (err: PInt); (* set last error for streams *)


Проверял на этом коде:
Код:
MODULE TestFilesLibc;

   IMPORT Libc := LinLibc;

   CONST   
      pathLen = 260;
      invalid = Libc.NULL;
      temp = 0; new = 1; shared = 2; hidden = 3; exclusive = 4; closed = 5;   (* file states *)
      ok = 0;
   
   TYPE
      ShortName = ARRAY pathLen OF SHORTCHAR;
   
   PROCEDURE Msg(IN ss: ARRAY OF CHAR);
      VAR res, l: INTEGER; s: ARRAY 1024 OF SHORTCHAR;
   BEGIN
      s := SHORT(ss);
      l := LEN(ss$);
      s[l] := 0AX; s[l + 1] := 0X;
      res := Libc.printf(s);
      res := Libc.fflush(Libc.NULL)
   END Msg;
   
   PROCEDURE Int (x: LONGINT);
      VAR j, k: INTEGER; ch: CHAR; a, s: ARRAY 32 OF CHAR;
   BEGIN
      IF x # MIN(LONGINT) THEN
         IF x < 0 THEN s[0] := "-"; k := 1; x := -x ELSE k := 0 END;
         j := 0; REPEAT a[j] := CHR(x MOD 10 + ORD("0")); x := x DIV 10; INC(j) UNTIL x = 0
      ELSE
         a := "8085774586302733229"; s[0] := "-"; k := 1;
         j := 0; WHILE a[j] # 0X DO INC(j) END
      END;
      ASSERT(k + j < LEN(s), 20);
      REPEAT DEC(j); ch := a[j]; s[k] := ch; INC(k) UNTIL j = 0;
      s[k] := 0X;
      Msg(s);
   END Int;
   
   PROCEDURE LastError (): INTEGER;
      VAR err: INTEGER; Pres: Libc.PInt;
   BEGIN
      Pres := Libc.geterrno();
      err := Pres[0];
      Pres[0] := 0; (* reset last error *)
      RETURN err
   END LastError;
   
   PROCEDURE Open (name: ARRAY OF CHAR; state: INTEGER);
      VAR n: ShortName; ref, res: INTEGER;
   BEGIN
      n := SHORT(name$);
      
      IF state = shared THEN
         Msg(" shared fopen");
         ref := Libc.fopen(n, "r")
      ELSE
         Msg(" excl fopen");
         ref := Libc.fopen(n, "r+")
      END;
      Msg("--");
      
      res := LastError();
      IF (res = ok) & (ref # invalid) THEN
         res := Libc.fclose(ref)
      END;
      
      IF (res = ok) THEN
         Msg(" OK")
      ELSE
         Msg(" res="); Int(res)
      END
   END Open;
   
   PROCEDURE Do*;
      VAR pathToFile: ARRAY pathLen OF SHORTCHAR;
         res: INTEGER;
   BEGIN
      pathToFile := "./Test1.cmps";
      Msg("Starting: ");
      res := LastError();
      Open(pathToFile$, shared)
   END Do;
   
BEGIN
   Do
END TestFilesLibc.

DevElfLinker.LinkDll libfiles.so := Kernel+ Files HostFiles TestFilesLibc#~


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Суббота, 10 Апрель, 2010 17:46 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Ну вот, а у меня руки до FPC не дошли :oops:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Воскресенье, 11 Апрель, 2010 08:59 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Руки идут туда, куда им скажет голова :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Воскресенье, 11 Апрель, 2010 09:41 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Что такое FPC? First Person Chooter? Frames Per Cecond? : )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Воскресенье, 11 Апрель, 2010 10:44 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
В модуле HostFiles я немного изменил способ определения ошибок. Считаю верным определять успешное получение дескриптора файла не по ненулевому дескриптору, а по успешности выполнения последней операции, сверяя LastError() с нулём.
Код:
   PROCEDURE LastError (): INTEGER;
      VAR err: INTEGER; Pres: Libc.PInt;
   BEGIN
      Pres := Libc.geterrno();
      err := Pres[0];
      Pres[0] := 0; (* reset last error *)
      RETURN err
   END LastError;
   
   PROCEDURE NewFileRef (state: INTEGER; VAR name: FullName; VAR ref, res: INTEGER);
      VAR n: ShortName;
   BEGIN
      n := SHORT(name$);
      IF state = create THEN (* Create should fail if file already exists *)
         IF ExistingFile(n) THEN
            res := fileExistsErr
         ELSE
            ref := Libc.fopen(n, "w+"); res := LastError()
         END
      ELSIF state = shared THEN
         ref := Libc.fopen(n, "r"); res := LastError()
      ELSE
         ref := Libc.fopen(n, "r+"); res := LastError()
      END
   END NewFileRef;
   
   PROCEDURE OpenFile (state: INTEGER; VAR name: FullName; VAR ref, res: INTEGER);
   BEGIN
      NewFileRef(state, name, ref, res);
      IF res = tooManyOpenFilesErr THEN
         Kernel.Collect;
         NewFileRef(state, name, ref, res);
         IF res = tooManyOpenFilesErr THEN
            SearchFileToClose;
            NewFileRef(state, name, ref, res)
         END
      END
   END OpenFile;


Цитата:
Что такое FPC?

В контексте форума паскалеподобных языков программирования оно может означать лишь известный компилятор одного известного диалекта Паскаля,
googel: fpc
В случае необходимости это можно добавить в ЧаВО. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: жуки в HostFiles?
СообщениеДобавлено: Воскресенье, 11 Апрель, 2010 12:50 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Александр Ильин писал(а):
Что такое FPC? First Person Chooter? Frames Per Cecond? : )

FreePascal Compiler.


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

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


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

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


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

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