add Context::withCurrentTask

This commit is contained in:
Dustin J. Mitchell
2021-12-18 00:48:12 +00:00
committed by Tomas Babej
parent 2ea6dd627e
commit 53127bf844
2 changed files with 42 additions and 0 deletions

View File

@@ -1328,6 +1328,12 @@ void Context::debugTiming (const std::string& details, const Timer& timer)
debug (out.str ());
}
////////////////////////////////////////////////////////////////////////////////
CurrentTask Context::withCurrentTask (const Task *task)
{
return CurrentTask(this, task);
}
////////////////////////////////////////////////////////////////////////////////
// This capability is to answer the question of 'what did I just do to generate
// this output?'.
@@ -1429,6 +1435,19 @@ void Context::debug (const std::string& input)
debugMessages.push_back (input);
}
////////////////////////////////////////////////////////////////////////////////
CurrentTask::CurrentTask (Context *context, const Task *task)
: context {context}, previous {context->currentTask}
{
context->currentTask = task;
}
////////////////////////////////////////////////////////////////////////////////
CurrentTask::~CurrentTask ()
{
context->currentTask = previous;
}
////////////////////////////////////////////////////////////////////////////////
// vim ts=2:sw=2

View File

@@ -38,6 +38,8 @@
#include <Timer.h>
#include <set>
class CurrentTask;
class Context
{
public:
@@ -73,6 +75,9 @@ public:
void decomposeSortField (const std::string&, std::string&, bool&, bool&);
void debugTiming (const std::string&, const Timer&);
CurrentTask withCurrentTask (const Task *);
friend class CurrentTask;
private:
void staticInitialization ();
void createDefaultConfig ();
@@ -115,6 +120,24 @@ public:
long time_sort_us {0};
long time_render_us {0};
long time_hooks_us {0};
// the current task for DOM references, or NULL if there is no task
const Task * currentTask {NULL};
};
////////////////////////////////////////////////////////////////////////////////
// CurrentTask resets Context::currentTask to NULL on destruction; this ensures
// that this context value is not a dangling pointer.
class CurrentTask {
~CurrentTask();
private:
CurrentTask(Context *context, const Task *previous);
Context *context;
const Task *previous;
friend class Context;
};
#endif