From 14ebde52893263930cdcde1406cc91cc5c42556f Mon Sep 17 00:00:00 2001 From: Christian Theune Date: Tue, 5 Jan 2016 00:40:40 +0100 Subject: First hit at providing support for floats in the language. --- src/libmain/shared.hh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/libmain/shared.hh') diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index 65b288e1ff3e..a350f496d19f 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -66,6 +66,30 @@ template N getIntArg(const string & opt, return n * multiplier; } +template N getFloatArg(const string & opt, + Strings::iterator & i, const Strings::iterator & end, bool allowUnit) +{ + ++i; + if (i == end) throw UsageError(format("‘%1%’ requires an argument") % opt); + string s = *i; + N multiplier = 1; + if (allowUnit && !s.empty()) { + char u = std::toupper(*s.rbegin()); + if (std::isalpha(u)) { + if (u == 'K') multiplier = 1ULL << 10; + else if (u == 'M') multiplier = 1ULL << 20; + else if (u == 'G') multiplier = 1ULL << 30; + else if (u == 'T') multiplier = 1ULL << 40; + else throw UsageError(format("invalid unit specifier ‘%1%’") % u); + s.resize(s.size() - 1); + } + } + N n; + if (!string2Float(s, n)) + throw UsageError(format("‘%1%’ requires a float argument") % opt); + return n * multiplier; +} + /* Show the manual page for the specified program. */ void showManPage(const string & name); -- cgit 1.4.1 From 934642155c036ce6880e57854f095f2863ab80f1 Mon Sep 17 00:00:00 2001 From: Christian Theune Date: Wed, 6 Jan 2016 08:25:58 +0100 Subject: @eelco's feedback: downgrade to regular float for size, remove unused function. --- src/libexpr/value.hh | 2 +- src/libmain/shared.hh | 23 ----------------------- 2 files changed, 1 insertion(+), 24 deletions(-) (limited to 'src/libmain/shared.hh') diff --git a/src/libexpr/value.hh b/src/libexpr/value.hh index 88424106cdeb..62bdd9281f08 100644 --- a/src/libexpr/value.hh +++ b/src/libexpr/value.hh @@ -39,7 +39,7 @@ class XMLWriter; typedef long NixInt; -typedef double NixFloat; +typedef float NixFloat; /* External values must descend from ExternalValueBase, so that * type-agnostic nix functions (e.g. showType) can be implemented diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index a350f496d19f..32183d6a6cb0 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -66,29 +66,6 @@ template N getIntArg(const string & opt, return n * multiplier; } -template N getFloatArg(const string & opt, - Strings::iterator & i, const Strings::iterator & end, bool allowUnit) -{ - ++i; - if (i == end) throw UsageError(format("‘%1%’ requires an argument") % opt); - string s = *i; - N multiplier = 1; - if (allowUnit && !s.empty()) { - char u = std::toupper(*s.rbegin()); - if (std::isalpha(u)) { - if (u == 'K') multiplier = 1ULL << 10; - else if (u == 'M') multiplier = 1ULL << 20; - else if (u == 'G') multiplier = 1ULL << 30; - else if (u == 'T') multiplier = 1ULL << 40; - else throw UsageError(format("invalid unit specifier ‘%1%’") % u); - s.resize(s.size() - 1); - } - } - N n; - if (!string2Float(s, n)) - throw UsageError(format("‘%1%’ requires a float argument") % opt); - return n * multiplier; -} /* Show the manual page for the specified program. */ void showManPage(const string & name); -- cgit 1.4.1 From 840056af04561e7fed31c459948be7c0e038864a Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 22 Feb 2016 14:49:15 +0100 Subject: Make OpenSSL usage thread-safe OpenSSL can randomly segfault unless we register a callback function to do locking. https://www.openssl.org/docs/manmaster/crypto/threads.html --- src/libmain/local.mk | 2 ++ src/libmain/shared.cc | 24 ++++++++++++++++++++---- src/libmain/shared.hh | 4 ++++ 3 files changed, 26 insertions(+), 4 deletions(-) (limited to 'src/libmain/shared.hh') diff --git a/src/libmain/local.mk b/src/libmain/local.mk index 16dbf752823d..4ff114e4b332 100644 --- a/src/libmain/local.mk +++ b/src/libmain/local.mk @@ -6,6 +6,8 @@ libmain_DIR := $(d) libmain_SOURCES := $(wildcard $(d)/*.cc) +libutil_LDFLAGS = $(OPENSSL_LIBS) + libmain_LIBS = libstore libutil libformat libmain_ALLOW_UNDEFINED = 1 diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 88ed52497fb9..8f2aa842036a 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -5,10 +5,11 @@ #include "store-api.hh" #include "util.hh" -#include +#include #include #include -#include +#include +#include #include #include @@ -16,7 +17,7 @@ #include #include -extern char * * environ; +#include namespace nix { @@ -103,7 +104,18 @@ string getArg(const string & opt, } -void detectStackOverflow(); +/* OpenSSL is not thread-safe by default - it will randomly crash + unless the user supplies a mutex locking function. So let's do + that. */ +static std::vector opensslLocks; + +static void opensslLockCallback(int mode, int type, const char * file, int line) +{ + if (mode & CRYPTO_LOCK) + opensslLocks[type].lock(); + else + opensslLocks[type].unlock(); +} void initNix() @@ -119,6 +131,10 @@ void initNix() if (getEnv("IN_SYSTEMD") == "1") logType = ltSystemd; + /* Initialise OpenSSL locking. */ + opensslLocks = std::vector(CRYPTO_num_locks()); + CRYPTO_set_locking_callback(opensslLockCallback); + settings.processEnvironment(); settings.loadConfFile(); diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index 3f3f6f7232e0..0682267fa376 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -101,4 +101,8 @@ struct PrintFreed }; +/* Install a SIGSEGV handler to detect stack overflows. */ +void detectStackOverflow(); + + } -- cgit 1.4.1