From 8c60c29097b42a3612c1e3d9883f5f03198fa365 Mon Sep 17 00:00:00 2001 From: Levente Uzonyi Date: Tue, 10 Oct 2017 22:15:00 +0200 Subject: [PATCH 1/3] Do not cache fileSize in SQFile - removed references to fileSize and setSize() in sqFilePluginBasicPrims.c - removed setSize() itself and rewrote getSize() to return the actual size of the file - removed the fileSize field of SQFile in FilePlugin.h --- .../Cross/plugins/FilePlugin/FilePlugin.h | 1 - .../FilePlugin/sqFilePluginBasicPrims.c | 45 +++++-------------- 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/platforms/Cross/plugins/FilePlugin/FilePlugin.h b/platforms/Cross/plugins/FilePlugin/FilePlugin.h index 0b8f8322b1..45b342916d 100644 --- a/platforms/Cross/plugins/FilePlugin/FilePlugin.h +++ b/platforms/Cross/plugins/FilePlugin/FilePlugin.h @@ -27,7 +27,6 @@ typedef int mode_t; typedef struct { int sessionID; /* ikp: must be first */ void *file; - squeakFileOffsetType fileSize; /* 64-bits we hope. */ #if defined(ACORN) // ACORN has to have 'lastOp' as at least a 32 bit field in order to work int lastOp; // actually used to save file position diff --git a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c index 6ee54c55fe..3e40167f76 100755 --- a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c +++ b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c @@ -65,7 +65,6 @@ typedef struct { int sessionID; File *file; - squeakFileOffsetType fileSize; //JMM Nov 8th 2001 64bits we hope char writable; char lastOp; // 0 = uncommitted, 1 = read, 2 = write // char lastChar; // one character peek for stdin // @@ -107,27 +106,21 @@ static void setFile(SQFile *f, FILE *file) void *out= (void *)&f->file; memcpy(out, in, sizeof(FILE *)); } -static squeakFileOffsetType getSize(SQFile *f) -{ - squeakFileOffsetType size; - void *in= (void *)&f->fileSize; - void *out= (void *)&size; - memcpy(out, in, sizeof(squeakFileOffsetType)); - return size; -} -static void setSize(SQFile *f, squeakFileOffsetType size) -{ - void *in= (void *)&size; - void *out= (void *)&f->fileSize; - memcpy(out, in, sizeof(squeakFileOffsetType)); -} #else /* OBJECTS_32BIT_ALIGNED */ # define getFile(f) ((FILE *)((f)->file)) # define setFile(f,fileptr) ((f)->file = (fileptr)) -# define getSize(f) ((f)->fileSize) -# define setSize(f,size) ((f)->fileSize = (size)) #endif /* OBJECTS_32BIT_ALIGNED */ +static squeakFileOffsetType getSize(SQFile *f) +{ + FILE *file = getFile(f); + squeakFileOffsetType currentPosition = ftell(file); + fseek(file, 0, SEEK_END); + squeakFileOffsetType size = ftell(file); + fseek(file, currentPosition, SEEK_SET); + return size; +} + #if 0 # define pentry(func) do { int fn = fileno(getFile(f)); if (f->isStdioStream) printf("\n"#func "(%s) %lld %d\n", fn == 0 ? "in" : fn == 1 ? "out" : "err", (long long)ftell(getFile(f)), f->lastChar); } while (0) # define pexit(expr) (f->isStdioStream && printf("\n\t^"#expr " %lld %d\n", (long long)(sqFileValid(f) ? ftell(getFile(f)) : -1), f->lastChar)), expr @@ -163,7 +156,6 @@ sqFileClose(SQFile *f) { setFile(f, NULL); f->sessionID = 0; f->writable = false; - setSize(f, 0); f->lastOp = UNCOMMITTED; /* @@ -369,11 +361,6 @@ sqFileOpen(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt writeFlag) { f->sessionID = thisSession; setFile(f, file); - /* compute and cache file size */ - fseek(file, 0, SEEK_END); - setSize(f, ftell(file)); - fseek(file, 0, SEEK_SET); - f->writable = writeFlag ? true : false; f->lastOp = UNCOMMITTED; return 1; @@ -386,7 +373,6 @@ sqFileOpen(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt writeFlag) { } f->sessionID = 0; - setSize(f, 0); f->writable = false; return interpreterProxy->success(false); } @@ -455,7 +441,6 @@ sqFileOpenNew(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt *exists) if (file != NULL) { f->sessionID = thisSession; setFile(f, file); - setSize(f, 0); f->writable = true; f->lastOp = UNCOMMITTED; return 1; @@ -470,7 +455,6 @@ sqFileOpenNew(SQFile *f, char *sqFileName, sqInt sqFileNameSize, sqInt *exists) } f->sessionID = 0; - setSize(f, 0); f->writable = false; return interpreterProxy->success(false); } @@ -493,7 +477,6 @@ sqFileStdioHandlesInto(SQFile files[]) #endif files[0].sessionID = thisSession; files[0].file = stdin; - files[0].fileSize = 0; files[0].writable = false; files[0].lastOp = READ_OP; files[0].isStdioStream = isatty(fileno(stdin)); @@ -501,7 +484,6 @@ sqFileStdioHandlesInto(SQFile files[]) files[1].sessionID = thisSession; files[1].file = stdout; - files[1].fileSize = 0; files[1].writable = true; files[1].isStdioStream = true; files[1].lastChar = EOF; @@ -509,7 +491,6 @@ sqFileStdioHandlesInto(SQFile files[]) files[2].sessionID = thisSession; files[2].file = stderr; - files[2].fileSize = 0; files[2].writable = true; files[2].isStdioStream = true; files[2].lastChar = EOF; @@ -695,7 +676,6 @@ sqFileTruncate(SQFile *f, squeakFileOffsetType offset) { return interpreterProxy->success(false); if (sqFTruncate(getFile(f), offset)) return interpreterProxy->success(false); - setSize(f, ftell(getFile(f))); return 1; } @@ -727,11 +707,6 @@ sqFileWriteFromAt(SQFile *f, size_t count, char *byteArrayIndex, size_t startInd src = byteArrayIndex + startIndex; bytesWritten = fwrite(src, 1, count, file); - position = ftell(file); - if (position > getSize(f)) { - setSize(f, position); /* update file size */ - } - if (bytesWritten != count) { interpreterProxy->success(false); } From bc6c3e4c275858192c4b524f5597ebe96c73d9c4 Mon Sep 17 00:00:00 2001 From: Levente Uzonyi Date: Wed, 11 Oct 2017 22:17:29 +0200 Subject: [PATCH 2/3] Removed further references to fileSize --- platforms/Mac OS/vm/sqMacNSPlugin.c | 10 ---------- platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c | 4 ---- 2 files changed, 14 deletions(-) diff --git a/platforms/Mac OS/vm/sqMacNSPlugin.c b/platforms/Mac OS/vm/sqMacNSPlugin.c index 5c3f37f3ef..0b6707e577 100644 --- a/platforms/Mac OS/vm/sqMacNSPlugin.c +++ b/platforms/Mac OS/vm/sqMacNSPlugin.c @@ -1033,22 +1033,12 @@ void OpenFileReadOnly(SQFile *f, char *MacfileName) { if (f->file == NULL) { f->sessionID = 0; - f->fileSize = 0; interpreterProxy->success(false); return; } else { extern int thisSession; /* from sqFilePrims.c: */ f->sessionID = thisSession; - /* compute and cache file size */ - fseek(f->file, 0, SEEK_END); - { - squeakFileOffsetType size=ftello(f->file); - void *in= (void *)&size; - void *out= (void *)&f->fileSize; - memcpy(out, in, sizeof(squeakFileOffsetType)); - } - fseek(f->file, 0, SEEK_SET); } f->lastOp = 0; } diff --git a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c index c4358c03e2..7bc262f683 100644 --- a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c +++ b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c @@ -53,7 +53,6 @@ extern struct VirtualMachine *interpreterProxy; typedef struct { int sessionID; (* ikp: must be first *) void *file; - squeakFileOffsetType fileSize; (* 64-bits we hope. *) char writable; char lastOp; (* 0 = uncommitted, 1 = read, 2 = write *) char lastChar; @@ -262,7 +261,6 @@ sqFileStdioHandlesInto(SQFile files[3]) files[0].sessionID = thisSession; files[0].file = GetStdHandle(STD_INPUT_HANDLE); - files[0].fileSize = 0; files[0].writable = false; files[0].lastOp = 0; /* unused on win32 */ files[0].isStdioStream = GetConsoleMode(files[0].file, &mode) != 0; @@ -270,7 +268,6 @@ sqFileStdioHandlesInto(SQFile files[3]) files[1].sessionID = thisSession; files[1].file = GetStdHandle(STD_OUTPUT_HANDLE); - files[1].fileSize = 0; files[1].writable = true; files[1].lastOp = 0; /* unused on win32 */ files[1].isStdioStream = GetConsoleMode(files[1].file, &mode) != 0; @@ -278,7 +275,6 @@ sqFileStdioHandlesInto(SQFile files[3]) files[2].sessionID = thisSession; files[2].file = GetStdHandle(STD_ERROR_HANDLE); - files[2].fileSize = 0; files[2].writable = true; files[2].lastOp = 0; /* unused on win32 */ files[2].isStdioStream = GetConsoleMode(files[2].file, &mode) != 0; From cb4e6ab3fef056c4b55eb9803b5ccc6c3c06910e Mon Sep 17 00:00:00 2001 From: Levente Uzonyi Date: Thu, 15 Mar 2018 11:00:38 +0100 Subject: [PATCH 3/3] Removed the last remaining setSize call --- platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c | 1 - 1 file changed, 1 deletion(-) diff --git a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c index 1f09e68cb1..5947054ad8 100755 --- a/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c +++ b/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c @@ -486,7 +486,6 @@ sqFileFileOpen(SQFile *sqFile, FILE *file, sqInt writeFlag) * writeFlag indicates whether the file is read-only or writable. */ setFile(sqFile, file); - setSize(sqFile, 0); sqFile->sessionID = thisSession; sqFile->lastOp = UNCOMMITTED; sqFile->writable = writeFlag;