vm: Only call fclose() once. Rename io_error() to io_error_if_not_EINTR() to be more explicit.
Fixes #1335.db4
parent
fbc146d97a
commit
27590b514c
29
vm/io.cpp
29
vm/io.cpp
|
@ -20,7 +20,7 @@ void factor_vm::init_c_io() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocates memory */
|
/* Allocates memory */
|
||||||
void factor_vm::io_error() {
|
void factor_vm::io_error_if_not_EINTR() {
|
||||||
if (errno == EINTR)
|
if (errno == EINTR)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ FILE* factor_vm::safe_fopen(char* filename, char* mode) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
file = fopen(filename, mode);
|
file = fopen(filename, mode);
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ int factor_vm::safe_fgetc(FILE* stream) {
|
||||||
if (feof(stream))
|
if (feof(stream))
|
||||||
return EOF;
|
return EOF;
|
||||||
else
|
else
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ size_t factor_vm::safe_fread(void* ptr, size_t size, size_t nitems,
|
||||||
if (feof(stream))
|
if (feof(stream))
|
||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
}
|
}
|
||||||
items_read += ret;
|
items_read += ret;
|
||||||
} while (items_read != nitems);
|
} 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) {
|
void factor_vm::safe_fputc(int c, FILE* stream) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (putc(c, stream) == EOF)
|
if (putc(c, stream) == EOF)
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
else
|
else
|
||||||
break;
|
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,
|
ret = fwrite((void*)((int*)ptr + items_written * size), size,
|
||||||
nitems - items_written, stream);
|
nitems - items_written, stream);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
items_written += ret;
|
items_written += ret;
|
||||||
} while (items_written != nitems);
|
} while (items_written != nitems);
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ int factor_vm::safe_ftell(FILE* stream) {
|
||||||
off_t offset;
|
off_t offset;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if ((offset = FTELL(stream)) == -1)
|
if ((offset = FTELL(stream)) == -1)
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ void factor_vm::safe_fseek(FILE* stream, off_t offset, int whence) {
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (FSEEK(stream, offset, whence) == -1)
|
if (FSEEK(stream, offset, whence) == -1)
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -136,19 +136,16 @@ void factor_vm::safe_fseek(FILE* stream, off_t offset, int whence) {
|
||||||
void factor_vm::safe_fflush(FILE* stream) {
|
void factor_vm::safe_fflush(FILE* stream) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (fflush(stream) == EOF)
|
if (fflush(stream) == EOF)
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Call fclose() once only. Issues #1335, #908.
|
||||||
void factor_vm::safe_fclose(FILE* stream) {
|
void factor_vm::safe_fclose(FILE* stream) {
|
||||||
for (;;) {
|
if (fclose(stream) == EOF && errno != EINTR)
|
||||||
if (fclose(stream) == EOF)
|
general_error(ERROR_IO, tag_fixnum(errno), false_object);
|
||||||
io_error();
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void factor_vm::primitive_fopen() {
|
void factor_vm::primitive_fopen() {
|
||||||
|
@ -210,7 +207,7 @@ void factor_vm::primitive_fwrite() {
|
||||||
|
|
||||||
size_t written = safe_fwrite(text, 1, length, file);
|
size_t written = safe_fwrite(text, 1, length, file);
|
||||||
if (written != length)
|
if (written != length)
|
||||||
io_error();
|
io_error_if_not_EINTR();
|
||||||
}
|
}
|
||||||
|
|
||||||
void factor_vm::primitive_ftell() {
|
void factor_vm::primitive_ftell() {
|
||||||
|
|
|
@ -537,7 +537,7 @@ struct factor_vm {
|
||||||
|
|
||||||
// io
|
// io
|
||||||
void init_c_io();
|
void init_c_io();
|
||||||
void io_error();
|
void io_error_if_not_EINTR();
|
||||||
FILE* safe_fopen(char* filename, char* mode);
|
FILE* safe_fopen(char* filename, char* mode);
|
||||||
int safe_fgetc(FILE* stream);
|
int safe_fgetc(FILE* stream);
|
||||||
size_t safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream);
|
size_t safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream);
|
||||||
|
|
Loading…
Reference in New Issue