* Ignore interrupt signals while handling an exception.

* Ignore EINTR in reads and writes.
This commit is contained in:
Eelco Dolstra 2004-05-11 13:48:25 +00:00
parent a9858c9f26
commit aea436503e

View file

@ -305,7 +305,10 @@ void readFull(int fd, unsigned char * buf, size_t count)
while (count) { while (count) {
checkInterrupt(); checkInterrupt();
ssize_t res = read(fd, (char *) buf, count); ssize_t res = read(fd, (char *) buf, count);
if (res == -1) throw SysError("reading from file"); if (res == -1) {
if (errno == EINTR) continue;
throw SysError("reading from file");
}
if (res == 0) throw Error("unexpected end-of-file"); if (res == 0) throw Error("unexpected end-of-file");
count -= res; count -= res;
buf += res; buf += res;
@ -318,7 +321,10 @@ void writeFull(int fd, const unsigned char * buf, size_t count)
while (count) { while (count) {
checkInterrupt(); checkInterrupt();
ssize_t res = write(fd, (char *) buf, count); ssize_t res = write(fd, (char *) buf, count);
if (res == -1) throw SysError("writing to file"); if (res == -1) {
if (errno == EINTR) continue;
throw SysError("writing to file");
}
count -= res; count -= res;
buf += res; buf += res;
} }
@ -397,6 +403,11 @@ volatile sig_atomic_t _isInterrupted = 0;
void _interrupted() void _interrupted()
{ {
/* Block user interrupts while an exception is being handled.
Throwing an exception while another exception is being handled
kills the program! */
if (!uncaught_exception()) {
_isInterrupted = 0; _isInterrupted = 0;
throw Error("interrupted by the user"); throw Error("interrupted by the user");
} }
}