hothing писал(а):
[list][*] При компиляции больших списков модулей падает, если символьные файлы не созданы.
Трап, странный и не рабочий - мешанина символов.[/*]
Это скорее всего из-за коллизии при создании временных файлов.
Вот мы обсуждали как-то эту проблему. Если создается больше 200 временных файлов в секунду. То это теоретически может объяснить баг.
Код:
PROCEDURE CreateFile (f: File; VAR res: INTEGER);
VAR num, n: INTEGER;
BEGIN
IF f.name = "" THEN
num := WinApi.GetTickCount(); n := 200;
REPEAT
GetTempFileName(f.loc.path, f.name, num); INC(num); DEC(n);
OpenFile(create, f.name, f.ref, res)
UNTIL (res # fileExistsErr) & (res # alreadyExistsErr) & (res # paramErr) OR (n = 0)
ELSE
OpenFile(f.state, f.name, f.ref, res)
END
END CreateFile;
Это реально слабое место в системе. Но пока так.
В версии для Linux вот так сделано
Код:
PROCEDURE GetTempFileName (IN path: FullName; OUT name: FullName; num: INTEGER);
VAR i: INTEGER; str: ARRAY 16 OF CHAR;
BEGIN
str := tempName; i := 7;
WHILE i > 2 DO
str[i] := CHR(num MOD 10 + ORD("0")); DEC(i); num := num DIV 10
END;
Append(path, str, "", 8, name)
END GetTempFileName;
PROCEDURE CreateFile (f: File; VAR res: INTEGER);
VAR num, n: INTEGER;
BEGIN
IF f.name = "" THEN
num := LinLibc.clock(); n := 200;
REPEAT
GetTempFileName(f.loc.path, f.name, num); INC(num); DEC(n);
OpenFile(create, f.name, f.ref, res)
UNTIL (res # fileExistsErr) OR (n = 0)
ELSE
OpenFile(f.state, f.name, f.ref, res)
END
END CreateFile;