- std::ctype<char> caches narrow()/widen() results per character in
plain char arrays of the global classic-locale facet, written without
synchronization from header-inlined code (locale_facets.h); two
threads exercising an uncached character concurrently (e.g. compiling
a std::regex in Channel::Validate) constitute a true data race that
ThreadSanitizer rightfully reports
- the stores are real and unsynchronized, so a tsan-instrumented
libstdc++ cannot help here; instead fill the caches before any thread
is spawned, which turns every later access into a pure read
- warm the lazily-installed num_put/num_get caches used by stream
insertion/extraction as well, via a small format/parse round-trip
- wire the warm-up into the gtest runner main() and, via a static
initializer, into the test device runner
A transer is attempted even if the transport has been interrupted
(with a timeout). When the timeout is reached, transfer methods will
return TransferResult::interrupted (-3).
- Split INITIALIZING state into Init+Bind+Connect
- Remove PAUSE state
- Convert state/transitions to enum classes (CamelCase)
- Transition to a state only once previous handler is complete
- Add CompleteInit transition to notify Initializing state
that config updates are complete
- Deprecate WaitForEndOfState(transition) in favor of
WaitForState(state)/WaitForNextState()
- Update tests/plugins to new APIs
- Deprecate CheckCurrentState() in favor of NewStatePending()
the patch seems big but most of it is just propagating the new notion of
constness of the factory - since it keeps track of created messages with
the internal allocator it no longer is const