Skip to content

Commit

Permalink
Make 'logger' a std::unique_ptr
Browse files Browse the repository at this point in the history
This prevents it from being leaked (see
bb411e4 for an example of this).
  • Loading branch information
edolstra committed Feb 17, 2025
1 parent 1f688d6 commit 26439f3
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 42 deletions.
17 changes: 6 additions & 11 deletions src/libexpr-tests/primops.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,15 @@ namespace nix {
};

class CaptureLogging {
Logger * oldLogger;
std::unique_ptr<CaptureLogger> tempLogger;
std::unique_ptr<Logger> oldLogger;
public:
CaptureLogging() : tempLogger(std::make_unique<CaptureLogger>()) {
oldLogger = logger;
logger = tempLogger.get();
CaptureLogging() {
oldLogger = std::move(logger);
logger = std::make_unique<CaptureLogger>();
}

~CaptureLogging() {
logger = oldLogger;
}

std::string get() const {
return tempLogger->get();
logger = std::move(oldLogger);
}
};

Expand Down Expand Up @@ -113,7 +108,7 @@ namespace nix {
CaptureLogging l;
auto v = eval("builtins.trace \"test string 123\" 123");
ASSERT_THAT(v, IsIntEq(123));
auto text = l.get();
auto text = (dynamic_cast<CaptureLogger *>(logger.get()))->get();
ASSERT_NE(text.find("test string 123"), std::string::npos);
}

Expand Down
15 changes: 10 additions & 5 deletions src/libmain/loggers.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ namespace nix {

LogFormat defaultLogFormat = LogFormat::raw;

LogFormat parseLogFormat(const std::string & logFormatStr) {
LogFormat parseLogFormat(const std::string & logFormatStr)
{
if (logFormatStr == "raw" || getEnv("NIX_GET_COMPLETIONS"))
return LogFormat::raw;
else if (logFormatStr == "raw-with-logs")
Expand All @@ -20,7 +21,8 @@ LogFormat parseLogFormat(const std::string & logFormatStr) {
throw Error("option 'log-format' has an invalid value '%s'", logFormatStr);
}

Logger * makeDefaultLogger() {
std::unique_ptr<Logger> makeDefaultLogger()
{
switch (defaultLogFormat) {
case LogFormat::raw:
return makeSimpleLogger(false);
Expand All @@ -40,16 +42,19 @@ Logger * makeDefaultLogger() {
}
}

void setLogFormat(const std::string & logFormatStr) {
void setLogFormat(const std::string & logFormatStr)
{
setLogFormat(parseLogFormat(logFormatStr));
}

void setLogFormat(const LogFormat & logFormat) {
void setLogFormat(const LogFormat & logFormat)
{
defaultLogFormat = logFormat;
createDefaultLogger();
}

void createDefaultLogger() {
void createDefaultLogger()
{
logger = makeDefaultLogger();
}

Expand Down
23 changes: 12 additions & 11 deletions src/libmain/progress-bar.cc
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,15 @@ class ProgressBar : public Logger
{
{
auto state(state_.lock());
if (!state->active) return;
state->active = false;
writeToStderr("\r\e[K");
updateCV.notify_one();
quitCV.notify_one();
if (state->active) {
state->active = false;
writeToStderr("\r\e[K");
updateCV.notify_one();
quitCV.notify_one();
}
}
updateThread.join();
if (updateThread.joinable())
updateThread.join();
}

void pause() override {
Expand Down Expand Up @@ -553,9 +555,9 @@ class ProgressBar : public Logger
}
};

Logger * makeProgressBar()
std::unique_ptr<Logger> makeProgressBar()
{
return new ProgressBar(isTTY());
return std::make_unique<ProgressBar>(isTTY());
}

void startProgressBar()
Expand All @@ -565,9 +567,8 @@ void startProgressBar()

void stopProgressBar()
{
auto progressBar = dynamic_cast<ProgressBar *>(logger);
if (progressBar) progressBar->stop();

if (auto progressBar = dynamic_cast<ProgressBar *>(logger.get()))
progressBar->stop();
}

}
2 changes: 1 addition & 1 deletion src/libmain/progress-bar.hh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace nix {

Logger * makeProgressBar();
std::unique_ptr<Logger> makeProgressBar();

void startProgressBar();

Expand Down
12 changes: 8 additions & 4 deletions src/libstore/daemon.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1041,11 +1041,15 @@ void processConnection(
conn.protoVersion = protoVersion;
conn.features = features;

auto tunnelLogger = new TunnelLogger(conn.to, protoVersion);
auto prevLogger = nix::logger;
auto tunnelLogger_ = std::make_unique<TunnelLogger>(conn.to, protoVersion);
auto tunnelLogger = tunnelLogger_.get();
std::unique_ptr<Logger> prevLogger_;
auto prevLogger = logger.get();
// FIXME
if (!recursive)
logger = tunnelLogger;
if (!recursive) {
prevLogger_ = std::move(logger);
logger = std::move(tunnelLogger_);
}

unsigned int opCount = 0;

Expand Down
10 changes: 5 additions & 5 deletions src/libutil/logging.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ void setCurActivity(const ActivityId activityId)
curActivity = activityId;
}

Logger * logger = makeSimpleLogger(true);
std::unique_ptr<Logger> logger = makeSimpleLogger(true);

void Logger::warn(const std::string & msg)
{
Expand Down Expand Up @@ -128,9 +128,9 @@ void writeToStderr(std::string_view s)
}
}

Logger * makeSimpleLogger(bool printBuildLogs)
std::unique_ptr<Logger> makeSimpleLogger(bool printBuildLogs)
{
return new SimpleLogger(printBuildLogs);
return std::make_unique<SimpleLogger>(printBuildLogs);
}

std::atomic<uint64_t> nextId{0};
Expand Down Expand Up @@ -262,9 +262,9 @@ struct JSONLogger : Logger {
}
};

Logger * makeJSONLogger(Descriptor fd)
std::unique_ptr<Logger> makeJSONLogger(Descriptor fd)
{
return new JSONLogger(fd);
return std::make_unique<JSONLogger>(fd);
}

static Logger::Fields getFields(nlohmann::json & json)
Expand Down
6 changes: 3 additions & 3 deletions src/libutil/logging.hh
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,11 @@ struct PushActivity
~PushActivity() { setCurActivity(prevAct); }
};

extern Logger * logger;
extern std::unique_ptr<Logger> logger;

Logger * makeSimpleLogger(bool printBuildLogs = true);
std::unique_ptr<Logger> makeSimpleLogger(bool printBuildLogs = true);

Logger * makeJSONLogger(Descriptor fd);
std::unique_ptr<Logger> makeJSONLogger(Descriptor fd);

/**
* @param source A noun phrase describing the source of the message, e.g. "the builder".
Expand Down
2 changes: 0 additions & 2 deletions src/nix/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,6 @@ void mainWrapped(int argc, char * * argv)
}
#endif

Finally f([] { logger->stop(); });

programPath = argv[0];
auto programName = std::string(baseNameOf(programPath));
auto extensionPos = programName.find_last_of(".");
Expand Down

0 comments on commit 26439f3

Please sign in to comment.