|
@@ -547,7 +547,7 @@ TYPE
|
|
|
|
|
|
File* = OBJECT (Files.File)
|
|
File* = OBJECT (Files.File)
|
|
VAR
|
|
VAR
|
|
- fd: LONGINT;
|
|
|
|
|
|
+ fd, fdTemp: LONGINT;
|
|
workName, registerName: Filename;
|
|
workName, registerName: Filename;
|
|
tempFile: BOOLEAN;
|
|
tempFile: BOOLEAN;
|
|
dev: Unix.DevT;
|
|
dev: Unix.DevT;
|
|
@@ -560,7 +560,7 @@ TYPE
|
|
|
|
|
|
PROCEDURE & Init( fs: Files.FileSystem );
|
|
PROCEDURE & Init( fs: Files.FileSystem );
|
|
BEGIN
|
|
BEGIN
|
|
- SELF.fs := fs; flags := {};
|
|
|
|
|
|
+ SELF.fs := fs; flags := {}; fdTemp := 0;
|
|
END Init;
|
|
END Init;
|
|
|
|
|
|
|
|
|
|
@@ -584,10 +584,10 @@ TYPE
|
|
done := fd >= 0; r := Unix.errno();
|
|
done := fd >= 0; r := Unix.errno();
|
|
IF (~done & (r IN {Unix.ENFILE, Unix.EMFILE})) THEN
|
|
IF (~done & (r IN {Unix.ENFILE, Unix.EMFILE})) THEN
|
|
Kernel.GC; (*! + wait ? *)
|
|
Kernel.GC; (*! + wait ? *)
|
|
-
|
|
|
|
fd := Unix.open( ADDRESSOF( workName ), CreateFlags, Unix.rwrwr );
|
|
fd := Unix.open( ADDRESSOF( workName ), CreateFlags, Unix.rwrwr );
|
|
done := fd >= 0
|
|
done := fd >= 0
|
|
END;
|
|
END;
|
|
|
|
+ IF tempFile THEN fdTemp:= fd END;
|
|
IF done THEN
|
|
IF done THEN
|
|
(*IF fd >= FileTabSize THEN
|
|
(*IF fd >= FileTabSize THEN
|
|
r := Unix.close( fd );
|
|
r := Unix.close( fd );
|
|
@@ -819,10 +819,10 @@ TYPE
|
|
Halt( SELF, FALSE, "UnixFiles.File.Register: rename failed" )
|
|
Halt( SELF, FALSE, "UnixFiles.File.Register: rename failed" )
|
|
END;
|
|
END;
|
|
|
|
|
|
- IF tempFile & (fd # 0) THEN
|
|
|
|
- res := Unix.close(fd);
|
|
|
|
- fd := NoDesc;
|
|
|
|
|
|
+ IF tempFile & (fdTemp # 0) THEN
|
|
|
|
+ res := Unix.close(fdTemp);
|
|
res := Unix.unlink( ADDRESSOF( workName ) );
|
|
res := Unix.unlink( ADDRESSOF( workName ) );
|
|
|
|
+ fdTemp := 0;
|
|
END;
|
|
END;
|
|
|
|
|
|
workName := registerName; registerName := ""; tempFile := FALSE;
|
|
workName := registerName; registerName := ""; tempFile := FALSE;
|
|
@@ -855,8 +855,8 @@ TYPE
|
|
r := Unix.unlink( ADDRESSOF( registerName ) );
|
|
r := Unix.unlink( ADDRESSOF( registerName ) );
|
|
fd := NoDesc;
|
|
fd := NoDesc;
|
|
ELSE
|
|
ELSE
|
|
|
|
+ FlushBuffers;
|
|
IF fd # NoDesc THEN
|
|
IF fd # NoDesc THEN
|
|
- FlushBuffers;
|
|
|
|
r := Unix.close( fd );
|
|
r := Unix.close( fd );
|
|
fd := NoDesc;
|
|
fd := NoDesc;
|
|
END;
|
|
END;
|