[Vm-dev] [commit] r2368 - Update sqFilePluginBasicPrims.c for
COGMTVM.
commits at squeakvm.org
commits at squeakvm.org
Fri Mar 18 16:27:03 UTC 2011
Author: eliot
Date: 2011-03-18 09:27:03 -0700 (Fri, 18 Mar 2011)
New Revision: 2368
Modified:
branches/Cog/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c
Log:
Update sqFilePluginBasicPrims.c for COGMTVM.
Modified: branches/Cog/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c
===================================================================
--- branches/Cog/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c 2011-03-18 00:56:46 UTC (rev 2367)
+++ branches/Cog/platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c 2011-03-18 16:27:03 UTC (rev 2368)
@@ -26,7 +26,8 @@
* handling code. Note that the win32 platform #defines NO_STD_FILE_SUPPORT
* and thus bypasses this file
*/
-
+
+#include <errno.h>
#include "sq.h"
#ifndef NO_STD_FILE_SUPPORT
#include "FilePlugin.h"
@@ -52,11 +53,13 @@
positioning operation to be done automatically if needed.
typedef struct {
+ int sessionID;
File *file;
- int sessionID;
- int writable;
squeakFileOffsetType fileSize; //JMM Nov 8th 2001 64bits we hope
- int lastOp; // 0 = uncommitted, 1 = read, 2 = write //
+ char writable;
+ char lastOp; // 0 = uncommitted, 1 = read, 2 = write //
+ char lastChar; // one character peek for stdin //
+ char isStdioStream;
} SQFile;
***/
@@ -127,13 +130,24 @@
# define getSize(f) ((f)->fileSize)
#endif
+#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
+# define pfail() printf("\tFAIL\n");
+#else
+# define pentry(func) 0
+# define pexit(expr) expr
+# define pfail() 0
+#endif
+
sqInt sqFileAtEnd(SQFile *f) {
/* Return true if the file's read/write head is at the end of the file. */
if (!sqFileValid(f))
return interpreterProxy->success(false);
+ pentry(sqFileAtEnd);
if (f->isStdioStream)
- return feof(getFile(f));
+ return pexit(feof(getFile(f)));
return ftell(getFile(f)) == getSize(f);
}
@@ -176,6 +190,10 @@
if (!sqFileValid(f))
return interpreterProxy->success(false);
+ pentry(sqFileGetPosition);
+ if (f->isStdioStream
+ && !f->writable)
+ return pexit(f->lastChar == EOF ? 0 : 1);
position = ftell(getFile(f));
if (position == -1)
return interpreterProxy->success(false);
@@ -264,9 +282,13 @@
sqInt
sqFileStdioHandlesInto(SQFile files[3])
{
-#if defined(_IONBF)
+#if defined(_IONBF) && 0
if (isatty(fileno(stdin)))
- setvbuf(stdin,0,_IONBF,0);
+# if 0
+ setvbuf(stdin,0,_IONBF,1);
+# else
+ setvbuf(stdin,0,_IOFBF,0);
+# endif
#endif
files[0].sessionID = thisSession;
files[0].file = stdin;
@@ -312,6 +334,7 @@
if (!sqFileValid(f))
return interpreterProxy->success(false);
+ pentry(sqFileReadIntoAt);
file = getFile(f);
if (f->writable) {
if (f->isStdioStream)
@@ -321,18 +344,31 @@
}
dst = byteArrayIndex + startIndex;
#if COGMTVM
- if (f->isStdioStream)
- myThreadIndex = interpreterProxy->disownVM();
+ if (f->isStdioStream) {
+ if (interpreterProxy->isInMemory((sqInt)f)
+ && interpreterProxy->isYoung((sqInt)f)
+ || interpreterProxy->isInMemory((sqInt)dst)
+ && interpreterProxy->isYoung((sqInt)dst)) {
+ interpreterProxy->primitiveFailFor(PrimErrObjectMayMove);
+ return 0;
+ }
+ myThreadIndex = interpreterProxy->disownVM(DisownVMLockOutFullGC);
+ }
#endif
- bytesRead = fread(dst, 1, count, file);
+ do {
+ clearerr(file);
+ bytesRead = fread(dst, 1, count, file);
+ } while (bytesRead <= 0 && ferror(file) && errno == EINTR);
#if COGMTVM
if (f->isStdioStream)
interpreterProxy->ownVM(myThreadIndex);
#endif
/* support for skipping back 1 character for stdio streams */
- f->lastChar = bytesRead > 0 ? dst[bytesRead-1] : EOF;
+ if (f->isStdioStream)
+ if (bytesRead > 0)
+ f->lastChar = dst[bytesRead-1];
f->lastOp = READ_OP;
- return bytesRead;
+ return pexit(bytesRead);
}
sqInt sqFileRenameOldSizeNewSize(char* oldNameIndex, sqInt oldNameSize, char* newNameIndex, sqInt newNameSize) {
@@ -361,18 +397,20 @@
if (!sqFileValid(f))
return interpreterProxy->success(false);
if (f->isStdioStream) {
+ pentry(sqFileSetPosition);
/* support one character of pushback for stdio streams. */
if (!f->writable
&& f->lastChar != EOF) {
- squeakFileOffsetType currentPos = ftell(getFile(f));
+ squeakFileOffsetType currentPos = f->lastChar == EOF ? 0 : 1;
if (currentPos == position)
- return 1;
+ return pexit(1);
if (currentPos - 1 == position) {
ungetc(f->lastChar, getFile(f));
f->lastChar = EOF;
- return 1;
+ return pexit(1);
}
}
+ pfail();
return interpreterProxy->success(false);
}
fseek(getFile(f), position, SEEK_SET);
@@ -391,16 +429,15 @@
}
sqInt sqFileFlush(SQFile *f) {
- /* Return the length of the given file. */
if (!sqFileValid(f))
return interpreterProxy->success(false);
+ pentry(sqFileFlush);
fflush(getFile(f));
return 1;
}
sqInt sqFileTruncate(SQFile *f,squeakFileOffsetType offset) {
- /* Truncate the file*/
if (!sqFileValid(f))
return interpreterProxy->success(false);
@@ -431,7 +468,8 @@
if (!(sqFileValid(f) && f->writable))
return interpreterProxy->success(false);
- file= getFile(f);
+ pentry(sqFileWriteFromAt);
+ file = getFile(f);
if (f->lastOp == READ_OP) fseek(file, 0, SEEK_CUR); /* seek between reading and writing */
src = byteArrayIndex + startIndex;
bytesWritten = fwrite(src, 1, count, file);
@@ -445,11 +483,10 @@
interpreterProxy->success(false);
}
f->lastOp = WRITE_OP;
- return bytesWritten;
+ return pexit(bytesWritten);
}
sqInt sqFileThisSession() {
return thisSession;
}
-
#endif /* NO_STD_FILE_SUPPORT */
More information about the Vm-dev
mailing list