* Optimize parser property lookup with persistent name-to-index map
Replace the per-event deque/linear-scan property cache with a two-level
scheme: a persistent name-to-index map in schema_locator (built once per
event type, shared across all events) and a flat vector<property_info>
in parser indexed by property position. This eliminates per-event hash
table allocation and removes string comparisons during the blob walk.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Use std::wstring_view for parser property name parameters
Replace const std::wstring& with std::wstring_view in parser's
public API (parse, try_parse, view_of) and internal helpers
(find_property, assert_valid_assignment, throw_if_invalid).
This eliminates heap-allocating std::wstring temporaries when
callers pass string literals (the common case). Property names
longer than MSVC's SSO threshold of 7 wchar_t previously caused
a heap allocation and free per field access.
Not a breaking change - std::wstring_view is implicitly
constructible from both std::wstring and const wchar_t*.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Bump NuGet version to 4.4.8
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Native tests: build/pack, raw value roundtrip, schema read, not-present case
- Managed tests: TryGetProcessStartKey roundtrip, not-present case
- Add AddProcessStartKey to RecordBuilder and record_builder for test support
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add null check on DataPtr before dereference in schema.hpp and
EventRecordMetadata.hpp
- Change add_process_start_key to take const ULONG64& so caller
owns the lifetime of the pointed-to object
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The CI runner has .NET SDK 10.0.x pre-installed, which fails to resolve
the .NET 8.0 AppHost packs needed by the NetCore project. Pin the SDK
to the 8.0.x feature band using global.json with rollForward=latestFeature,
and add the setup-dotnet action to install the matching SDK on CI.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add support for reading EVENT_HEADER_EXT_TYPE_PROCESS_START_KEY from
ETW extended data items, enabled via EVENT_ENABLE_PROPERTY_PROCESS_START_KEY.
The ProcessStartKey uniquely identifies a process instance across a boot
session (unlike PID which can be recycled).
Changes:
- Native C++: schema::process_start_key() in schema.hpp
- Managed .NET: TryGetProcessStartKey() on IEventRecordMetadata/EventRecordMetadata
- Test support: extended_data_builder::add_process_start_key()
- New example: UserTrace008_ProcessStartKey.cs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add constructor for schema from EVENT_RECORD and PTRACE_EVENT_INFO
* Update target framework to net8.0 in build and assembly generation scripts
* Bump nuget versions
---------
Co-authored-by: Matt Swann <mswann@Microsoft.com>
* Update for .NET Core 8
Clean up the netcore vcxproj files
* Update test assembly path
* Don't define a runtime lib in release builds (this is how it was before)
* Remove assemblyDebug from release builds
* Remember to actually save file after changing it
MOF events all require a (slow) TDH lookup which can fail if schema is
not available. Since these are generally legacy events, many
applications may not require them and ignoring them can provide a
significant performance increase, particularly for large trace files.