* 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
1 changed files with 15 additions and 4 deletions

View File

@ -305,7 +305,10 @@ void readFull(int fd, unsigned char * buf, size_t count)
while (count) {
checkInterrupt();
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");
count -= res;
buf += res;
@ -318,7 +321,10 @@ void writeFull(int fd, const unsigned char * buf, size_t count)
while (count) {
checkInterrupt();
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;
buf += res;
}
@ -397,6 +403,11 @@ volatile sig_atomic_t _isInterrupted = 0;
void _interrupted()
{
_isInterrupted = 0;
throw Error("interrupted by the user");
/* 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;
throw Error("interrupted by the user");
}
}