aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/trace.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2025-08-22 18:16:09 +0200
committerGitHub Enterprise <[email protected]>2025-08-22 18:16:09 +0200
commitfb6426127354415505dbedacd63b3a16116dac2f (patch)
treebbc39a085433b1e837fb07ea4e4399ba932dbdca /src/zencore/trace.cpp
parentavoid new in static IoBuffer (#472) (diff)
downloadzen-fb6426127354415505dbedacd63b3a16116dac2f.tar.xz
zen-fb6426127354415505dbedacd63b3a16116dac2f.zip
clean up trace options parsing (#473)
* clean up trace command line options explicitly shut down worker pools * some additional startup trace scopes
Diffstat (limited to 'src/zencore/trace.cpp')
-rw-r--r--src/zencore/trace.cpp114
1 files changed, 75 insertions, 39 deletions
diff --git a/src/zencore/trace.cpp b/src/zencore/trace.cpp
index ef7cbf596..fe8fb9a5d 100644
--- a/src/zencore/trace.cpp
+++ b/src/zencore/trace.cpp
@@ -11,19 +11,18 @@
# define TRACE_IMPLEMENT 1
# include <zencore/trace.h>
+# include <zencore/memory/fmalloc.h>
# include <zencore/memory/memorytrace.h>
namespace zen {
void
-TraceConfigure()
+TraceConfigure(const TraceOptions& Options)
{
// Configure channels based on command line options
using namespace std::literals;
- constexpr std::string_view TraceOption = "--trace="sv;
-
std::function<void(const std::string_view&)> ProcessChannelList;
auto ProcessTraceArg = [&](const std::string_view& Arg) {
@@ -63,25 +62,32 @@ TraceConfigure()
ProcessChannelList = [&](const std::string_view& OptionArgs) { IterateCommaSeparatedValue(OptionArgs, ProcessTraceArg); };
- bool TraceOptionPresent = false;
-
- std::function<void(const std::string_view&)> ProcessArg = [&](const std::string_view& Arg) {
- if (Arg.starts_with(TraceOption))
- {
- const std::string_view OptionArgs = Arg.substr(TraceOption.size());
-
- TraceOptionPresent = true;
-
- ProcessChannelList(OptionArgs);
- }
- };
+ if (Options.Channels.empty())
+ {
+ ProcessTraceArg("default"sv);
+ }
+ else
+ {
+ ProcessChannelList(Options.Channels);
+ }
- IterateCommandlineArgs(ProcessArg);
+ if (Options.Host.size())
+ {
+ trace::SendTo(Options.Host.c_str());
+ }
+ else if (Options.File.size())
+ {
+ trace::WriteTo(Options.File.c_str());
+ }
- if (!TraceOptionPresent)
+# if ZEN_WITH_MEMTRACK
+ FMalloc* TraceMalloc = MemoryTrace_Create(GMalloc, Options);
+ if (TraceMalloc != GMalloc)
{
- ProcessTraceArg("default"sv);
+ GMalloc = TraceMalloc;
+ MemoryTrace_Initialize();
}
+# endif
}
void
@@ -122,8 +128,6 @@ TraceInit(std::string_view ProgramName)
trace::Update();
TraceShutdown();
});
-
- TraceConfigure();
}
void
@@ -139,25 +143,6 @@ IsTracing()
return trace::IsTracing();
}
-void
-TraceStart(std::string_view ProgramName, const char* HostOrPath, TraceType Type)
-{
- TraceInit(ProgramName);
- switch (Type)
- {
- case TraceType::Network:
- trace::SendTo(HostOrPath);
- break;
-
- case TraceType::File:
- trace::WriteTo(HostOrPath);
- break;
-
- case TraceType::None:
- break;
- }
-}
-
bool
TraceStop()
{
@@ -168,6 +153,57 @@ TraceStop()
return false;
}
+bool
+GetTraceOptionsFromCommandline(TraceOptions& OutOptions)
+{
+ bool HasOptions = false;
+
+# if ZEN_WITH_TRACE
+ using namespace std::literals;
+
+ auto MatchesArg = [](std::string_view Option, std::string_view Arg) -> std::optional<std::string_view> {
+ if (Arg.starts_with(Option))
+ {
+ std::string_view::value_type DelimChar = Arg[Option.length()];
+ if (DelimChar == ' ' || DelimChar == '=')
+ {
+ return Arg.substr(Option.size() + 1);
+ }
+ }
+ return {};
+ };
+
+ constexpr std::string_view TraceOption = "--trace"sv;
+ constexpr std::string_view TraceHostOption = "--tracehost"sv;
+ constexpr std::string_view TraceFileOption = "--tracefile"sv;
+
+ std::function<void(const std::string_view&)> ProcessArg = [&](const std::string_view& Arg) {
+ if (auto Host = MatchesArg(TraceHostOption, Arg); Host.has_value())
+ {
+ OutOptions.Host = Host.value();
+ HasOptions = true;
+ }
+ else if (auto File = MatchesArg(TraceFileOption, Arg); File.has_value())
+ {
+ OutOptions.File = File.value();
+ HasOptions = true;
+ }
+ else if (auto Channels = MatchesArg(TraceOption, Arg); Channels.has_value())
+ {
+ if (!OutOptions.Channels.empty())
+ {
+ OutOptions.Channels = ","sv;
+ }
+ OutOptions.Channels += Channels.value();
+ HasOptions = true;
+ }
+ };
+
+ IterateCommandlineArgs(ProcessArg);
+# endif // ZEN_WITH_TRACE
+ return HasOptions;
+}
+
} // namespace zen
#endif // ZEN_WITH_TRACE