printMsg(): Don't check for interrupts
Having the logger function potentially throw exceptions is Heisenbuggy.
This commit is contained in:
parent
2e1493037b
commit
054be50257
3 changed files with 15 additions and 17 deletions
|
@ -60,14 +60,12 @@ void warnOnce(bool & haveWarned, const FormatOrString & fs)
|
||||||
void writeToStderr(const string & s)
|
void writeToStderr(const string & s)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
writeFull(STDERR_FILENO, s);
|
writeFull(STDERR_FILENO, s, false);
|
||||||
} catch (SysError & e) {
|
} catch (SysError & e) {
|
||||||
/* Ignore failing writes to stderr if we're in an exception
|
/* Ignore failing writes to stderr. We need to ignore write
|
||||||
handler, otherwise throw an exception. We need to ignore
|
errors to ensure that cleanup code that logs to stderr runs
|
||||||
write errors in exception handlers to ensure that cleanup
|
to completion if the other side of stderr has been closed
|
||||||
code runs to completion if the other side of stderr has
|
unexpectedly. */
|
||||||
been closed unexpectedly. */
|
|
||||||
if (!std::uncaught_exception()) throw;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -474,24 +474,24 @@ void readFull(int fd, unsigned char * buf, size_t count)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void writeFull(int fd, const unsigned char * buf, size_t count)
|
void writeFull(int fd, const unsigned char * buf, size_t count, bool allowInterrupts)
|
||||||
{
|
{
|
||||||
while (count) {
|
while (count) {
|
||||||
checkInterrupt();
|
|
||||||
ssize_t res = write(fd, (char *) buf, count);
|
ssize_t res = write(fd, (char *) buf, count);
|
||||||
if (res == -1) {
|
if (res == -1 && errno != EINTR)
|
||||||
if (errno == EINTR) continue;
|
|
||||||
throw SysError("writing to file");
|
throw SysError("writing to file");
|
||||||
|
if (res > 0) {
|
||||||
|
count -= res;
|
||||||
|
buf += res;
|
||||||
}
|
}
|
||||||
count -= res;
|
if (allowInterrupts) checkInterrupt();
|
||||||
buf += res;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void writeFull(int fd, const string & s)
|
void writeFull(int fd, const string & s, bool allowInterrupts)
|
||||||
{
|
{
|
||||||
writeFull(fd, (const unsigned char *) s.data(), s.size());
|
writeFull(fd, (const unsigned char *) s.data(), s.size(), allowInterrupts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -120,8 +120,8 @@ void replaceSymlink(const Path & target, const Path & link);
|
||||||
/* Wrappers arount read()/write() that read/write exactly the
|
/* Wrappers arount read()/write() that read/write exactly the
|
||||||
requested number of bytes. */
|
requested number of bytes. */
|
||||||
void readFull(int fd, unsigned char * buf, size_t count);
|
void readFull(int fd, unsigned char * buf, size_t count);
|
||||||
void writeFull(int fd, const unsigned char * buf, size_t count);
|
void writeFull(int fd, const unsigned char * buf, size_t count, bool allowInterrupts = true);
|
||||||
void writeFull(int fd, const string & s);
|
void writeFull(int fd, const string & s, bool allowInterrupts = true);
|
||||||
|
|
||||||
MakeError(EndOfFile, Error)
|
MakeError(EndOfFile, Error)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue