Releases: jfriesne/muscle
Releases · jfriesne/muscle
8.20 release
8.20 - Released 4/26/2021
- Added ARRAYROWS and ARRAYCOLS functions to MuscleSupport.h
(These are similar to the existing ARRAYITEMS except they return
the first and second dimensional-extents of a 2D array) - Added AreKeysASupersetOf() and AreKeysASubsetOf() convenience
methods to the Hashtable class. - Added an optional (fromIndex) argument to String::Replace()
and String::GetNumInstancesOf(). - CMake now compiles the executables in the tests folder also.
- CMake now compiles the executables in the
html/muscle-by-example/examples/* sub-folders also. - CMake now includes zip/unzip functions from zlib/zlib/contrib/minizip
in the generated muscle.lib. - Added support for the -DMUSCLE_ENABLE_LOCKING_VIOLATIONS_CHECKER
compile-time flag and the associated functionality in the Mutex
class (see BUILDOPTIONS.txt for details) - Added a NeuterMutex() method to the ObjectPool class.
- Changed ARRAYITEMS to return uint32 instead of unsigned int.
- Changed ChildProcessDataIO::WaitForChildProcessToExit()
to return a status_t rather than a bool. - Removed obsolete Win95/Win98 support code from RS232DataIO.cpp.
- Removed all MSVC project files from the distribution
(use cmake to generate .vcproj files on-demand instead) - Removed Borland Makefiles as obsolete.
- Removed dev-C++ Makefiles as obsolete.
- Added explicit assignment-operators to several classes so
that g++ 9.3.0 wouldn't warn about deprecated implicit behavior.
- Fixed several const-correctness problems in the minizip code.
- Updated chatclient, testudp, and portableplaintextclient tests
to use a StdinDataIO rather than selecting on STDIN_FILENO,
so that they can work as expected under Windows. - Fixed the CMakeList.txt to link to pthreads and util libraries
when appropriate (before it would only do so if Qt was installed) - Fixed a potential string-terminator bug in
TarFileWriter::WriteFileHeader(). - Fixed various minor compiler-warnings.
8.10 Release
8.10 - Released 4/5/2021
- Added ByteBufferPacketDataIO class to the dataio folder.
- Win32 implementation of ChildProcessDataIO now
uses a variable-duration polling algorithm to improve
data-transfer rate from child's stdout to parent process. - Added a Prefill() method to the ObjectPool class.
- Added a new flag SETDATANODE_FLAG_ENABLESUPERCEDE
to the SetDataNodeFlags enum. PR_COMMAND_SETDATA
Message specifying this flag will try to remove
any previously-enqueued-but-still-pending updates
regarding the DataNodes they modify, so as not to
build up a FIFO backlog of update-Messages when
the server is under a heavy update-load. - PR_COMAMND_SETDATA parser now accepts PR_NAME_FLAGS
field as either a SetDataNodeFlags or a uint32,
for convenience when client isn't C++-based. - Added UpdateSubscriptionMessage(), PruneSubscriptionMessage(),
and UpdateSubscriptionIndexMessage() hook-methods to
the StorageReflectSession class. - Added GetStringReference() convenience-method to the
Message class. - Added MLOG_ON_ERROR, MPRINT_ON_ERROR, MLOG_AND_RETURN_ON_ERROR,
and MPRINT_AND_RETURN_ON_ERROR macros for convenient error-logging. - Added a MiniPacketTunnelIOGateway class, for maximally
efficient packing of multiple smaller-than-MTU Messages together
into UDP packets. - The ZLibCodec class now inherits from RefCountable.
- Added SetPacketRemoteLocationTaggingEnabled() and
GetPacketRemoteLocationTaggingEnabled() methods to the
AbstractMessageIOGateway class. - Added a ProxyIOGateway class that centralizes some common
code used by both the PacketTunnelIOGateway and the
MiniPacketTunnelIOGateway (and potentially other
"decorator" style gateways in the future) - Moved the declaration of the SetDataNodeFlags
BitChord type from StorageReflectSession.h to
StorageReflectConstants.h. - Modified the NotifySubscribersThatNodeChanged()
and NodeChanged() methods in StorageReflectSession.
to accept a NodeChangeFlags argument instead of a boolean. - Modified the SetData() method in DataNode to
accept a SetDataFlags argument instead of a boolean. - Simplified error-handling in various locations by
using MRETURN_ON_ERROR instead of explicit if/returns. - Moved the AbstractGatewayMessageReceiver and
QueueGatewayMessageReceiver classes out of
AbstractMessageIOGateway.h and into their own
file AbstractGatewayMessageReceiver.h - Updated the README.html to include descriptions
of recently-added classes. - Updated the muscle.dox file to match the latest
DOxygen codebase.
- Fixed #include in Win32FileHandleDataIO.h
- Fixed a bug in IPAddress::SetIPv4AddressFromUint32()
that was causing it to set the interface-index of an
IPv4 address to 0 instead of to MUSCLE_NO_LIMIT/invalid. - Fixed a potential buffer-overrun in
StorageReflectSession::NodeIndexChanged(). - PacketDataIO::Write() was mis-named WriteTo(). Fixed.
- Fixed a bug in qt_advanced_example.cpp that caused
the InternalThreadS
8.00 Release
8.00 - Released 3/8/2021
- Added TemplatedFlatten(), TemplatedUnflatten(),
TemplatedFlattenedSize(), and CreateMessageTemplate()
methods to the Message class, to allow encoding of
a Message's payload-data separately from its metadata. - Added a TemplatingMessageIOGateway class that takes
advantage of Message's new templated-flattening
functionality to reduce network bandwidth. - Added GetAndMoveToFront() and GetAndMoveToBack()
convenience-methods to the Hashtable class. - Added protected GetSendCodec() and GetReceiveCodec() methods
to the MessageIOGateway class, so subclasses can access them. - Added a DMUSCLE_USE_TEMPLATING_MESSAGE_IO_GATEWAY_BY_DEFAULT
compile-time flag, to make it easier to exercise the
TemplatedMessageIOGateway class. Defining this flag
causes the AbstractMessageIOGateway class to use a
TemplatedMessageIOGateway by default. - Added a (maxRecursions) argument to the SortFieldNames()
method of the Message class. - Added a .And() method to the status_t class for easier
ordered-chaining of multiple status_t-returning calls
(available under C++17 and later only) - Added a MUSCLE_USE_CPLUSPLUS17 define that is automatically
set when compiling with C++17 or later. - Added a MRETURN_ON_ERROR macro to facility returning
of status_t error-codes from function calls. - Added a MRETURN_OOM_ON_NULL(ptr) macro that will invoke
MRETURN_OUT_OF_MEMORY if the passed-in pointer is NULL.
- Added template-testing code to testmessage.cpp
- Replaced explicit comparisons to B_NO_ERROR with calls
to .IsOK() and .IsError() - Renamed WARN_OUT_OF_MEMORY macro to MWARN_OUT_OF_MEMORY
to reduce the chance of macro-namespace collisions. - Renamed RETURN_OUT_OF_MEMORY macro to MRETURN_OUT_OF_MEMORY
to reduce the chance of macro-namespace collisions. - Renamed DECLARE_ANONYMOUS_STACK_OBJECT macro to
MDECLARE_ANONYMOUS_STACK_OBJECT to reduce the chance
of macro-namespace collisions. - Renamed DECLARE_DEBUGTIMER to MDECLARE_DEBUGTIMER to
reduce the chance of macro-namespace collisions. - Fixed a bug where calling Message::AddData() with
a NULL data-pointer could cause a crash. - Fixed a potential crash-on-exit bug in the
StorageReflectSession class's Cleanup method. - Fixed a bug in the pthreads implementation of
Mutex::TryLock() (it was calling through to
pthread_mutex_lock() rather than pthread_mutex_trylock())
7.71 Release
- Added copy-constructor and assignment-operator to the
StringTokenizer class. - Updated the muscle.dox file to work with DOxygen v1.9.2.
- Fixed some ClangSA warnings
- Modified Hashtable::PutOrRemove() to return a status_t
instead of a pointer-to-value. - StringTokenizer constructor now takes separate arguments
for "hard" and "soft" separator-chars (with multiple
contiguous "hard" separator-chars returning empty strings
when tokenized, while contiguous "soft" separator-chars
will be handled as a single separator) - Removed svncopy.cpp from the tests subfolder.
- Added teststringtokenizer.cpp to the tests subfolder.
- SetSocketMulticastToSelf() was broken under MacOS/X; fixed.
- The calls to ReadFromNetworkArray() inside
NetworkUtilityFunctions.cpp no longer pass zero as an
interface index, to avoid an unnecessary @0 suffix in
IPv6 address strings. - Modified DetectNetworkConfigChangesSession.cpp to again
compile when _WIN32_WINNT is set to 0x0501 (aka WinXP) - Fixed a bug in the Win32 implementation of
Thread::SetThreadPriority() that would cause it to
always return B_UNIMPLEMENTED.
7.70 Release
7.70 - Released 1/8/2021
- The subscribed-sessions tables used by DataNode objects are
now immutable and shared across multiple DataNodes when
appropriate, reducing the server's RAM usage. - Added IsInterfaceIndexValid(), UnsetInterfaceIndex(),
SetInterfaceIndexFrom(), and WithoutInterfaceIndex() methods
to the IPAddress class. - Added AddTailIfNotAlreadyPresent() and AddHeadIfNotAlreadyPresent()
convenience methods to the Queue class. - Added a (defaultInterfaceIndex) value to IPAddress::GetInterfaceIndex()
to specify what to return if the current interface index value isn't
valid. Defaults to zero. - Added IPAddress::IsIPv6NodeLocalMulticast() and
IPAddress::IsIPv6LinkLocalMulticast() convenience methods. - Added == and != operators to the NetworkInterfaceInfo class.
- Modified the DataNode::GetSubscribers() method to return a
(const Hashtable<String, uint32> &) rather than a
(HashtableIterator<const String *, uint32>) - Split Queue::RemoveDuplicateItems(bool) into
Queue::RemoveDuplicateItems() and Queue:RemoveSortedDuplicateItems(). - Revised the way interface-index values are handled in the IPAddress
class. Now unset/invalid interface-indices are represented
internally via a guard value (MUSCLE_NO_LIMIT) rather than 0. - IPAddress::ToString()'s (printIPv4AddressesInIPv4Style) argument
now defaults to true instead of false. - Modified muscleArrayIndexIsValid() to reference (theArray) via
a dummy (theArray==theArray) test rather than a (theArray!=NULL)
test, as the latter test can generate a warning at compile time.
7.62 Release
7.62 - Released 11/20/2020
- Added a ToBinaryString() convenience-method to the BitChord class.
- Updated TarFileWriter so that it can now write using non-seekable
DataIO objects as well as SeekableDataIO objects (although with
non-seekable you have to explicitly specify the file sizes up-front) - Updated the captive zlib implementation to the latest (v1.2.11)
- Added CallFlattenHeaderAndMessage() and CallUnflattenHeaderAndMessage()
convenience-methods to the MessageIOGateway class. - Added a GZDataIO class to the zlib folder, as quick way to wrap
the gzread()/gzwrite() API inside a DataIO interface. - Modified CMakeList.txt to avoid policy warnings under Windows.
- Fixed pointer-casting in Windows call to SetWindowLongPtr()
- Fixed a bug where String::WithoutSuffix() and String::WithoutPrefix()
would spin the CPU if they were passed an empty String as an argument.
Now these methods immediately return (*this) in that case, instead.
7.61 Release
7.61 Released 8/5/2020
- Removed MUSCLE's requirement that indexed-child-nodes'
node-names must start with the capital letter I. Now
any name is acceptable for use as an indexed-child-node. - Added a new Arg(double, uint32, uint32) overload to the
String class, which can yield better floating-point-to-String
formatting than the standard printf() specifiers provide. - muscleMin(), muscleMax(), and various other inline functions
in MuscleSupport.h are now tagged as MUSCLE_CONSTEXPR
so that they can be evaluated at compile-time when possible. - muscleArrayIndexIsValid now returns false if the passed-in
array-pointer is NULL. - Fixed a warning in the CMakeLists.txt that would occur
on build systems that don't have Qt installed.
7.60 Release
7.60 Released 6/25/2020
- Added a "daemonsitter" program to the tests folder, to
demonstrate how to use MUSCLE to babysit a litter of child
processes. - Added a ChildCountQueryFilter class, for constructing
QueryFilters that take the number of child nodes of
a DataNode into account when deciding on a match. - Merged in Richard Spindler's addition of CMakeList.txt
files so that the Qt example programs are now built
via cmake when possible, and also so that MUSCLE's
Qt support code is built into a separate qtsupport
library. - Added an optional (prepend) argument to the
AssembleBatchMessage() utility function. - SimulatedMulticastDataIO now tries to send a test
UDP packet on its UDP socket before committing to
use it. - Updated server/Makefile to conditionally build for
Catalyst based on presence of ENABLECATALYST env-var. - Added a testserverthread.cpp program to the tests
folder to test/demonstrate launching a child thread
that runs its own ReflectServer event loop, and how
the main thread can send Messages to it - Added a GetEffectiveParameters() convenience method
to the StorageReflectSession class. - Modified StorageReflectSession::SetDataNode(),
RestoreNodeTreeFromMessage(), and CloneDataNodeSubree()
to take a bit-chord of SETDATANODE_FLAG_* bits rather
than an error-prone list of boolean arguments. - Added a dummy symbol to GlobalMemoryAllocator.cpp
to avoid a "GlobalMemoryAllocator.o has no symbols" warning - Modified CMakeLists.txt to use WITH_MUSCLED option instead
of BUILD_MUSCLED environment variable. - Changed MessageIOGateway's MessageFlattenedCallback's
return type from void to status_t, so that the callback
can affect whether the Message goes out or not.
7.55 Release
7.55 Released 5/7/2020
- Rewrote DetectNetworkConfigChangesSession's Windows
and Mac implementation to use a single thread for all
DetectNetworkConfigChangesSessions in the process,
rather than one thread per DetectNetworkConfigChangesSession. - Added a Python implementation of the BitChord class to
python/bit_chord.py - Added PutFlat() and GetFlat() convenience methods to the
Python Message class in message.py - Added SegmentedStringMatcher to the libmuscle.a build.
- Added some experimental support for building libmuscle.a as
a Catalyst-compatible library (see server/Makefile) - Added GetAndClearBit(), GetAndSetBit() and GetAndToggleBit()
convenience methods to the BitChord class. - Added a SetErrno(int) function to MuscleSupport.h, to
complement the existing GetErrno() function. - Added muscleproxy.cpp to the tests sub-folder, as simple
demonstration of how to implement a proxy using MUSCLE. - Added a MoveIndexEntries() convenience method to the
StorageReflectSession class. - Added CAddArchiveMessage() and CPrependArchiveMessage()
convenience methods to the Message class. - Added an optional (maxSegments) argument to the SetPattern()
method of the SegmentedStringMatcher class. - Added a "Clone Window" button to the qt_muscled_browser GUI.
- Made qt_muscled_browser's stdout output prettier.
- Modified SendDataUDP() so that when it returns, errno is
still set to the state that the sendto() call set it to. - Moved the NODE_DEPTH_* enum out of the StorageReflectSession
class and up into muscle-namespace scope, so that it
can be referenced by non-StorageReflectSession code. - Added a work-around to SimulatedMulticastDataIO for the
occasional MacOS/X bug that causes SendDataUDP() to always
return ENOBUFS on a Wi-Fi device's socket. This won't fix
the underlying problem in MacOS/X, but it will at least
keep SimulatedMulticastDataIO from spinning a core at 100%
when the fault occurs.
7.54 release
7.54 Released 3/20/2020
- Added a B_ERRNUM(e) macro that works similarly to B_ERRNO, except
it calls strerror() with the passed-in integer value rather than
calling strerror(errno). - Added a TryLock() method to the Mutex class.
- Added a WithReplacements() method to the String class that takes
a (const Hashtable<String,String> &) argument, for doing multiple
simultaneous search-and-replace operations at one time. - Fixed the handling of RTM_NEWADDR and RTM_DELADDR messages in the
Linux implementation of DetectNetworkConfigChangesSession. - Tweaked the Windows #ifdef's in ChildProcessDataIO.cpp per Mika
- Return values of pthreads functions weren't being used correctly
to set status_t results on error. Fixed.