9.60 - Released 1/19/2025
- Added a PreallocatedItemSlotsCount class to MuscleSupport.h
which can be used to explicitly specify how many item-slots
a container's constructor should preallocate space for. - Added constructors to the Queue, Hashtable, and String classes
that take a PreallocatedItemSlotsCount as an argument. - Added a GetUnmangledSymbolName() utility function to
util/MiscUtilityFunctions.h, for easier stack trace reading. - When debug or trace output is enabled, the deadlock finder
will now capture stack traces and print them out as part of
its detected-deadlock output. - Added a copy constructor to the ICallbackSubscriber class.
- Added an UnlockEarly() method to the SpinLockGuard, MutexGuard,
ReadOnlyMutexGuard, and ReadWriteMutexGuard classes. - Added DECLARE_NAMED_MUTEXGUARD, DECLARE_NAMED_READONLY_MUTEXGUARD,
DECLARE_NAMED_READWRITE_MUTEXGUARD and DECLARE_NAMED_SPINLOCKGUARD
macros. - Added CalculateChecksum() methods to the QueryFilter classes.
- Added CalculateChecksum() methods to the Queue, Hashtable, ConstRef,
StringMatcher, Tuple, and Void classes. - Added equality-test operators and an IsEqualTo() virtual method
to the QueryFilter classes. - Added an OutputPrinter convenience class (in util/OutputPrinter.h)
for code that wants to print to a FILE or a String or to the Log
without having to write three different implementations. - Added a CalculatePODChecksums() convenience function for summing
multiple checksums together. - Updated various PrintToStream() methods to take an optional
OutputPrinter object rather than a (FILE *).
- String::Arg(T* t) now expands to string returned by String::Arg(*t),
or to an empty String if t is NULL. - Renamed all PrintToStream() methods to Print(), as they no longer
necessarily are printing to a stream. - Tweaked Snooze64() to handle long snooze times a bit better.
- Simplified the EmscriptenWebSocket callback API.
- Replaced overloaded_preprocessor_macro.h with conditional
usage of the comma-swallowing operator (##VA_ARGS). - Simplified mutex-Locking code via MutexGuards where possible.
- Replaced CalculateChecksumForFloat() and CalculateChecksumForDouble()
with a general/templatized CalculatePODChecksum() method. - Removed LogHexBytes() since PrintHexBytes() can now do the same thing.
- Updated the muscle-by-example programs to use an OutputPrinter in
their PrintExampleDescription( functions. - The deadlock finder no longer warns about inconsistent
locking orders that consist entirely of shared/read-only locks. - The deadlock finder no longer considers TryLock() calls at
the end of a locking-sequence to be significant, as they
can't affect the deadlocking behavior of the app. - Fixed capitalization of Emscripten callback method names.
- Fixed some build warnings under MSVC.
- Updated the MutexLockRecordLog and MutexLockSequencesRecord
classes so they are properly initialized via a constructor
and placement-new, rather than an ad-hoc Initialize() method.