]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: Only call fclose() once. Rename io_error() to io_error_if_not_EINTR() to be more...
authorDoug Coleman <doug.coleman@gmail.com>
Wed, 3 Jun 2015 21:35:48 +0000 (14:35 -0700)
committerDoug Coleman <doug.coleman@gmail.com>
Wed, 3 Jun 2015 21:35:48 +0000 (14:35 -0700)
Fixes #1335.

vm/io.cpp
vm/vm.hpp

index a2474a00e9f02ee7b2840220255bc0dbc9dc0edb..140d6bcfa36d75a000d0ae3f70778c0cd94c9d60 100644 (file)
--- a/vm/io.cpp
+++ b/vm/io.cpp
@@ -20,7 +20,7 @@ void factor_vm::init_c_io() {
 }
 
 /* Allocates memory */
-void factor_vm::io_error() {
+void factor_vm::io_error_if_not_EINTR() {
   if (errno == EINTR)
     return;
 
@@ -32,7 +32,7 @@ FILE* factor_vm::safe_fopen(char* filename, char* mode) {
   for (;;) {
     file = fopen(filename, mode);
     if (file == NULL)
-      io_error();
+      io_error_if_not_EINTR();
     else
       break;
   }
@@ -47,7 +47,7 @@ int factor_vm::safe_fgetc(FILE* stream) {
       if (feof(stream))
         return EOF;
       else
-        io_error();
+        io_error_if_not_EINTR();
     } else
       break;
   }
@@ -66,7 +66,7 @@ size_t factor_vm::safe_fread(void* ptr, size_t size, size_t nitems,
       if (feof(stream))
         break;
       else
-        io_error();
+        io_error_if_not_EINTR();
     }
     items_read += ret;
   } while (items_read != nitems);
@@ -77,7 +77,7 @@ size_t factor_vm::safe_fread(void* ptr, size_t size, size_t nitems,
 void factor_vm::safe_fputc(int c, FILE* stream) {
   for (;;) {
     if (putc(c, stream) == EOF)
-      io_error();
+      io_error_if_not_EINTR();
     else
       break;
   }
@@ -92,7 +92,7 @@ size_t factor_vm::safe_fwrite(void* ptr, size_t size, size_t nitems,
     ret = fwrite((void*)((int*)ptr + items_written * size), size,
                  nitems - items_written, stream);
     if (ret == 0)
-      io_error();
+      io_error_if_not_EINTR();
     items_written += ret;
   } while (items_written != nitems);
 
@@ -103,7 +103,7 @@ int factor_vm::safe_ftell(FILE* stream) {
   off_t offset;
   for (;;) {
     if ((offset = FTELL(stream)) == -1)
-      io_error();
+      io_error_if_not_EINTR();
     else
       break;
   }
@@ -127,7 +127,7 @@ void factor_vm::safe_fseek(FILE* stream, off_t offset, int whence) {
 
   for (;;) {
     if (FSEEK(stream, offset, whence) == -1)
-      io_error();
+      io_error_if_not_EINTR();
     else
       break;
   }
@@ -136,19 +136,16 @@ void factor_vm::safe_fseek(FILE* stream, off_t offset, int whence) {
 void factor_vm::safe_fflush(FILE* stream) {
   for (;;) {
     if (fflush(stream) == EOF)
-      io_error();
+      io_error_if_not_EINTR();
     else
       break;
   }
 }
 
+// Call fclose() once only. Issues #1335, #908.
 void factor_vm::safe_fclose(FILE* stream) {
-  for (;;) {
-    if (fclose(stream) == EOF)
-      io_error();
-    else
-      break;
-  }
+  if (fclose(stream) == EOF && errno != EINTR)
+    general_error(ERROR_IO, tag_fixnum(errno), false_object);
 }
 
 void factor_vm::primitive_fopen() {
@@ -210,7 +207,7 @@ void factor_vm::primitive_fwrite() {
 
   size_t written = safe_fwrite(text, 1, length, file);
   if (written != length)
-    io_error();
+    io_error_if_not_EINTR();
 }
 
 void factor_vm::primitive_ftell() {
index 315d7bd4cb0e9bc6abd9f3d681aab8b43a70b0e0..a0a9a142d42d860f29edb45083b5b4504909e7ab 100644 (file)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -537,7 +537,7 @@ struct factor_vm {
 
   // io
   void init_c_io();
-  void io_error();
+  void io_error_if_not_EINTR();
   FILE* safe_fopen(char* filename, char* mode);
   int safe_fgetc(FILE* stream);
   size_t safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream);