OberonCore
https://forum.oberoncore.ru/

жуки в HostFiles?
https://forum.oberoncore.ru/viewtopic.php?f=34&t=2539
Страница 1 из 1

Автор:  Роман М. [ Четверг, 08 Апрель, 2010 14:35 ]
Заголовок сообщения:  жуки в HostFiles?

Похоже, обнаружил ошибку в модуле 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#~

Автор:  Valery Solovey [ Четверг, 08 Апрель, 2010 14:51 ]
Заголовок сообщения:  Re: жуки в HostFiles?

У меня работает. Только я не выполнял сборку в один-единственный исполняемый файл и использовал Log вместо Console.

Автор:  Роман М. [ Четверг, 08 Апрель, 2010 15:05 ]
Заголовок сообщения:  Re: жуки в HostFiles?

А можно подробнее о том как проводился опыт? Это точно в Линуксе?

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

Автор:  Роман М. [ Четверг, 08 Апрель, 2010 16:14 ]
Заголовок сообщения:  Re: жуки в HostFiles?

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

Автор:  Димыч [ Четверг, 08 Апрель, 2010 16:57 ]
Заголовок сообщения:  Re: жуки в HostFiles?

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

Автор:  Роман М. [ Четверг, 08 Апрель, 2010 17:17 ]
Заголовок сообщения:  Re: жуки в HostFiles?

Да нашёл уже. В Old вызывается OpenFile. Мне кажется, там проблема с логикой возврата дескриптора файла и кодом ошибки.
Дома гляну.

Автор:  Евгений Темиргалеев [ Четверг, 08 Апрель, 2010 23:14 ]
Заголовок сообщения:  Re: жуки в HostFiles?

Есть мнение, и не только моё, что проблема просачивания invalid file ref может быть связана с errno...

Автор:  Valery Solovey [ Пятница, 09 Апрель, 2010 09:47 ]
Заголовок сообщения:  Re: жуки в HostFiles?

Прошу прощения, я не подумал, что это выполняется в Линуксе.

Автор:  Роман М. [ Суббота, 10 Апрель, 2010 15:32 ]
Заголовок сообщения:  Re: жуки в HostFiles?

Так и есть. На самом деле, 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#~

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

Ну вот, а у меня руки до FPC не дошли :oops:

Автор:  igor [ Воскресенье, 11 Апрель, 2010 08:59 ]
Заголовок сообщения:  Re: жуки в HostFiles?

Руки идут туда, куда им скажет голова :wink:

Автор:  Александр Ильин [ Воскресенье, 11 Апрель, 2010 09:41 ]
Заголовок сообщения:  Re: жуки в HostFiles?

Что такое FPC? First Person Chooter? Frames Per Cecond? : )

Автор:  Роман М. [ Воскресенье, 11 Апрель, 2010 10:44 ]
Заголовок сообщения:  Re: жуки в HostFiles?

В модуле 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
В случае необходимости это можно добавить в ЧаВО. :)

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

Александр Ильин писал(а):
Что такое FPC? First Person Chooter? Frames Per Cecond? : )

FreePascal Compiler.

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