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? |
Вряд ли дело в средствах вывода. Могу сделать такие заключения:
|
Автор: | Димыч [ Четверг, 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 не дошли |
Автор: | igor [ Воскресенье, 11 Апрель, 2010 08:59 ] |
Заголовок сообщения: | Re: жуки в HostFiles? |
Руки идут туда, куда им скажет голова |
Автор: | Александр Ильин [ Воскресенье, 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/ |