mirror of
https://github.com/NixOS/nix.git
synced 2024-11-29 02:02:27 +00:00
Merged R8632
This commit is contained in:
parent
3800f55b54
commit
8e9c7d9338
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -81,6 +82,23 @@ struct RemoveTempRoots
|
|||||||
void initDerivationsHelpers();
|
void initDerivationsHelpers();
|
||||||
|
|
||||||
|
|
||||||
|
static void closeStore()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
throw;
|
||||||
|
} catch (std::exception & e) {
|
||||||
|
printMsg(lvlError,
|
||||||
|
format("FATAL: unexpected exception (closing store and aborting): %1%") % e.what());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
store.reset((StoreAPI *) 0);
|
||||||
|
} catch (...) {
|
||||||
|
ignoreException();
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Initialize and reorder arguments, then call the actual argument
|
/* Initialize and reorder arguments, then call the actual argument
|
||||||
processor. */
|
processor. */
|
||||||
static void initAndRun(int argc, char * * argv)
|
static void initAndRun(int argc, char * * argv)
|
||||||
@ -206,6 +224,12 @@ static void initAndRun(int argc, char * * argv)
|
|||||||
exit. */
|
exit. */
|
||||||
RemoveTempRoots removeTempRoots; /* unused variable - don't remove */
|
RemoveTempRoots removeTempRoots; /* unused variable - don't remove */
|
||||||
|
|
||||||
|
/* Make sure that the database gets closed properly, even if
|
||||||
|
terminate() is called (which happens sometimes due to bugs in
|
||||||
|
destructor/exceptions interaction, but that needn't preclude a
|
||||||
|
clean shutdown of the database). */
|
||||||
|
std::set_terminate(closeStore);
|
||||||
|
|
||||||
run(remaining);
|
run(remaining);
|
||||||
|
|
||||||
/* Close the Nix database. */
|
/* Close the Nix database. */
|
||||||
|
@ -697,8 +697,8 @@ DerivationGoal::~DerivationGoal()
|
|||||||
try {
|
try {
|
||||||
killChild();
|
killChild();
|
||||||
deleteTmpDir(false);
|
deleteTmpDir(false);
|
||||||
} catch (Error & e) {
|
} catch (...) {
|
||||||
printMsg(lvlError, format("error (ignored): %1%") % e.msg());
|
ignoreException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,7 +274,11 @@ LocalStore::LocalStore(bool reserveSpace)
|
|||||||
LocalStore::~LocalStore()
|
LocalStore::~LocalStore()
|
||||||
{
|
{
|
||||||
/* If the database isn't open, this is a NOP. */
|
/* If the database isn't open, this is a NOP. */
|
||||||
nixDB.close();
|
try {
|
||||||
|
nixDB.close();
|
||||||
|
} catch (...) {
|
||||||
|
ignoreException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -149,8 +149,8 @@ RemoteStore::~RemoteStore()
|
|||||||
fdSocket.close();
|
fdSocket.close();
|
||||||
if (child != -1)
|
if (child != -1)
|
||||||
child.wait(true);
|
child.wait(true);
|
||||||
} catch (Error & e) {
|
} catch (...) {
|
||||||
printMsg(lvlError, format("error (ignored): %1%") % e.msg());
|
ignoreException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,7 +446,11 @@ void warnOnce(bool & haveWarned, const format & f)
|
|||||||
|
|
||||||
static void defaultWriteToStderr(const unsigned char * buf, size_t count)
|
static void defaultWriteToStderr(const unsigned char * buf, size_t count)
|
||||||
{
|
{
|
||||||
writeFull(STDERR_FILENO, buf, count);
|
try {
|
||||||
|
writeFull(STDERR_FILENO, buf, count);
|
||||||
|
} catch (SysError & e) {
|
||||||
|
/* ignore EPIPE etc. */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -548,8 +552,8 @@ AutoCloseFD::~AutoCloseFD()
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
close();
|
close();
|
||||||
} catch (Error & e) {
|
} catch (...) {
|
||||||
printMsg(lvlError, format("error (ignored): %1%") % e.msg());
|
ignoreException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1046,6 +1050,15 @@ string unsignedInt2String(unsigned int n)
|
|||||||
return str.str();
|
return str.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ignoreException()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
throw;
|
||||||
|
} catch (std::exception & e) {
|
||||||
|
printMsg(lvlError, format("error (ignored): %1%") % e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool string2UnsignedInt(const string & s, unsigned int & n)
|
bool string2UnsignedInt(const string & s, unsigned int & n)
|
||||||
{
|
{
|
||||||
std::istringstream str(s);
|
std::istringstream str(s);
|
||||||
|
@ -336,6 +336,10 @@ void removeSymlink(const string & path);
|
|||||||
|
|
||||||
void ensureStateDir(const Path & statePath, const string & user, const string & group, const string & chmod);
|
void ensureStateDir(const Path & statePath, const string & user, const string & group, const string & chmod);
|
||||||
|
|
||||||
|
/* Exception handling in destructors: print an error message, then
|
||||||
|
ignore the exception. */
|
||||||
|
void ignoreException();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !__UTIL_H */
|
#endif /* !__UTIL_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user