diff options
| author | Dan Engelbrecht <[email protected]> | 2025-08-22 18:16:09 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-08-22 18:16:09 +0200 |
| commit | fb6426127354415505dbedacd63b3a16116dac2f (patch) | |
| tree | bbc39a085433b1e837fb07ea4e4399ba932dbdca /src/zencore/trace.cpp | |
| parent | avoid new in static IoBuffer (#472) (diff) | |
| download | zen-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.cpp | 114 |
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 |