1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-30 03:23:16 +02:00

Figure out the user's home directory if $HOME is not set

This commit is contained in:
Eelco Dolstra 2017-05-05 16:40:12 +02:00
parent eba840c8a1
commit 465cb68244
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
8 changed files with 84 additions and 36 deletions

48
src/libutil/lazy.hh Normal file
View file

@ -0,0 +1,48 @@
#include <exception>
#include <functional>
#include <mutex>
namespace nix {
/* A helper class for lazily-initialized variables.
Lazy<T> var([]() { return value; });
declares a variable of type T that is initialized to 'value' (in a
thread-safe way) on first use, that is, when var() is first
called. If the initialiser code throws an exception, then all
subsequent calls to var() will rethrow that exception. */
template<typename T>
class Lazy
{
typedef std::function<T()> Init;
Init init;
std::once_flag done;
T value;
std::exception_ptr ex;
public:
Lazy(Init init) : init(init)
{ }
const T & operator () ()
{
std::call_once(done, [&]() {
try {
value = init();
} catch (...) {
ex = std::current_exception();
}
});
if (ex) std::rethrow_exception(ex);
return value;
}
};
}