BeBits Information Developer Central Submit Application Your Account Web Links Contact Us
BeBits
MUSCLE
Version History
  Go back to the MUSCLE Page

Version 4.63
 License:   BSD/MIT
 Updated:   July 18, 2009
 Source:   Source Included
4.63 Released 7/17/2009
- When compiled with MUSCLE_USE_IPV6 enabled, MUSCLE now does automatic
transparent remapping of IPv4-compatible IPv6 addresses into IPv4-mapped
IPv6 addresses. This allows MUSCLE servers to be 100% compatible with
both IPv4 and IPv6 clients (on platforms that support dual stacks, of
course) without any additional effort on the programemr's part.
- Added SetAutomaticIPv4AddressMappingEnabled() and
GetAutomaticIPv4AddressMappingEnabled() calls to
NetworkUtilityFunctions.{cpp,h}.
- Added CAdd*() and CPrepend*() convenience methods to the Message
API, to the common "add value to Message unless it's the default value"
idiom quicker and easier to express.
- Added Contains() convenience methods to the String class.
- Added an optional (optRetTotal) argument to
SharedUsageLimitProxyMemoryAllocator::GetCurrentMemoryUsage().
- Added a ParseHumanReadableTimeIntervalString() convenience function
to MiscUtilityFunctions.cpp.
- Added an static Exists() method to the Directory class.
- Added a PutOrRemove() convenience method to the Hashtable class.
- Added an IsValidIP() function to NetworkUtilityFunctions.{cpp,h}.
- GetNextEventFromInternalThread() now has an optLocation parameter that
can be used to find out the IP address and port that a session connected
to (or what accepted from).
- The SessionConnected() signals of the QMessageTransceiverThread and
QMessageTransceiverHandler classes now include an IPAddressAndPort object
indicating what the session connected to.
- The SessionAccepted() signal of the QMessageTransceiverThread class now
includes an IPAddressAndPort object indicating where the session was accepted from.
- Added SetAsyncConnectDestination() and GetAsyncConnectDestination() methods
to the AbstractReflectSession class.
- Added ToString() methods to the SegmentedStringMatcher and
StringMatcher classes.
- SegmentedStringMatcher no longer bothers to allocate a StringMatcher
object for clauses that are represented by "*".
o Renamed DataNode::CountChildren() to DataNode::GetNumChildren().
o Renamed DataNode::SetMaxKnownChildID() to DataNode::SetMaxKnownChildIDHint().
o Renamed Message::CountNames() to Message::GetNumNames().
o Rewrote the static internal function AdjustValue() in
SharedUsageLimitAllocator.cpp to give more informative error output.
o Removed Message::GetConstPointer() since you can use GetPointer()
to do the same thing (by assigning a const pointer to the result).
o Documented some methods that were previously not documented.
* Fixed a bug where SharedUsageLimitAllocator::ResetDaemonCounter()
could push the cumulative memory counter into negative territory.
* Inet_NtoA was allowing the IPv6-specific "@3" interface-index
suffix into IPv4-style address strings. Fixed.
* SetupSystem.cpp's Muscle_GetCurrentThread() wasn't working properly
on 64-bit OS's. Fixed.


Intel Version - requires R5   (1.8 MB) 47 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 8 downloads
  Working Link Download LCS Canada

Version 4.62
 License:   BSD/MIT
 Updated:   June 17, 2009
 Source:   Source Included
4.62 Released 6/17/2009
- Added a ThreadLocalStorage class to the muscle/system
sub-folder. This class makes it easy for each thread
to access its own local copy of a global object, without
any need for Mutex locking/unlocking overhead.
- Added a Thread::GetCurrentThread() static method, so that
any Thread can access its Thread object conveniently.
- Added additional fields to the PR_RESULT_PARAMETERS Message:
PR_NAME_SERVER_CURRENTTIMEUTC (server's GetCurrentTime(UTC))
PR_NAME_SERVER_CURRENTTIMELOCAL (server's GetCurrentTime(LOCAL))
PR_NAME_SERVER_RUNTIME (server's GetRunTime64())
- Added a AddApplicationSpecificParametersToParametersResultMessage()
method to the StorageReflectSession class. It allows a subclass
to add fields to the PR_RESULT_PARAMETERS Message before it
goes back to the client.
- Added an IsIPv4Address() function to NetworkUtilityFunctions.{cpp,h}
- Added GetSendDestinations() methods to the UDPSocketDataIO object.
With these methods you can have the UDPSocketDataIO object send the
same UDP packet to multiple destinations whenever Write() is called.
- Added a GetDefaultItem() method to the Queue class.
- Added GetDefaultKey() and GetDefaultValue() methods to the
Hashtable class.
- If TARGET_PLATFORM_XENOMAI is defined, GetRunTime64() now
uses Xenomai's rt_timer_read() function to determine its result.
- GetNetworkInterfaceInfos() and GetNetworkInterfaceAddresses() now
accept a bit-chord of GNII_INCLUDE_* bits as their second argument,
rather than a simple boolean. This allows the caller to express
in a bit more detail which sorts of interfaces he is interested in.
- Added a convenience constructor to the AndOrQueryFilter class.
o Added testthread.cpp back in to the test/Makefile.
o Modified testthread.cpp to test the ThreadLocalStorage class also.
o Reorganized the ObjectPool.h class implementation.
o Simplified the Qt implementation of the Thread class.
* system/Mutex.h now #includes support/MuscleSupport.h,
so that the Win32 build environment is detected properly
even when system/Mutex.h is the first #include.



Intel Version - requires R5   (1.8 MB) 13 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 3 downloads
  Working Link Download LCS Canada

Version 4.61
 License:   BSD/MIT
 Updated:   May 23, 2009
 Source:   Source Included
4.61 Released 5/22/2009
- Added GetTotalNumSignalsReceived() and
GetNumSignalsReceivedOfType() methods to the
SignalMultiplexer class.
- Added an IsCurrentThreadMainThread() function to
SetupSystem.{cpp,h}.
- Added support for a "catchsignals" keyword to
HandleStandardDaemonArgs(). This keyword, if
specified, will cause the main thread's
ReflectSession() (if any) to add a signal handler
session to itself.
- Added support for a MUSCLE_AVOID_SIGNAL_HANDLING compiler
flag that can be defined by applications that don't
want to compile in signal handling support.
- Added a SignalChildProcess() method to the
ChildProcessDataIO class.
- ChildProcessDataIO::WaitForChildProcessToExit()
now takes an optional timeout value, and returns
true if the child exited or false if it timed out.
- In the ChildProcessDataIO class, I replaced
SetKillChildOnClose() and SetWaitForChildOnClose() with
a single SetChildProcessShutdownBehavior() method which
provides for more flexibility, making it possible to
do a "soft shutdown with a hard kill after a timeout".
o Removed the "catchsignals" support from muscledMain()'s
setup code, since that support is now part of
HandleStandardDaemonArgs() instead.



Intel Version   (1.8 MB) 11 downloads
  Working Link Download LCS Canada
PowerPC Version   (1.8 MB) 4 downloads
  Working Link Download LCS Canada

Version 4.60
 License:   BSD/MIT
 Updated:   May 15, 2009
 Source:   Source Included
4.60 Released 5/15/2009
- The Message class now derives from Cloneable.
- The Message::FindInt*() methods class now accept both
signed and unsigned value arguments, so that dangerous
C-style casting is no longer necessary when retrieving
unsigned integer values.
- Added a set of Message::Get*() methods that are similar to
Message::Find*() except that they return the found value
instead of a status code. (if the requested value is not found,
they return a user-provided default value instead)
- The Message::Find*() methods now take their value parameters
by reference instead of by pointer.
(e.g. msg.FindInt8("foo", x) instead of msg.FindInt8("foo", &x).
The old by-pointer style is still supported, but is deprecated.
- Added a Queue::LastIndexOf() method that does a reverse
search in a Queue, optionally within a specified index range.
- Added a Flattenable::UnflattenFromByteBuffer() method
that takes a ConstByteBufferRef argument, per Mika's request.
- Added SetLowBits(), SetHighBits() to the IPv6 ip_address class.
- When MUSCLE_USE_IPV6 is defined, the ip_address class now
includes an interface-address field. Inet_AtoN() and Inet_NtoA()
now append/expect this field at the end of the string if the
interface is non-zero (e.g. "fe80::1@3")
- Upgraded the multicast API to properly support IPv6 multicast.
In particular, when MUSCLE_USE_IPV6 is defined,
AddSocketToMulticastGroup() and RemoveSocketFromMulticastGroup()
no longer take an interface IP address (instead they use the
interface index included in the groupAddress argument).
Also SetSocketMulticastSendInterfaceAddress() and
GetSocketMulticastSendInterfaceAddress() are replaced by
SetSocketMulticastSendInterfaceIndex() and
GetSocketMulticastSendInterfaceIndex(). This is necessary
because IPv6 doesn't identify interfaces by IP address,
rather it identifies them with integers.
- Added a broadcastIP_IPv4 constant to NetworkUtilityFunctions.h
to allow IPv4 braodcasts even in IPv6 mode.
- Added a localhostIP_IPv4 constant to NetworkUtilityFunctions.h
to allow references to the IPv4 localhost device in IPv6 mode.
- Added a GetHashCodeForIPAddress() function to
NetworkUtilityFunctions.h, to avoid #ifdefs in application code.
- Added a IsMulticastIPAddress(const ip_address &) function
to NetworkUtilityFunctions.{cpp,h} that returns true iff the
specified address is a multicast addess.
- Added a IsStandardLoopbackDeviceAddress(const ip_address &)
function to NetworkUtilityFunctions.h, since under IPv6
localhostIP has several names and thus doing a literal
numeric comparison to (localhostIP) can be error-prone.
- Added a GetConnectString(const String &, uint16) convenience
function to MiscUtilityFunctions.{cpp,h}, to generate strings
like "localhost:9999" or "[ff05::1]:9999" correctly.
- Added an ExecuteSynchronousMessageRPCCall() function to
MessageIOGateway.{cpp,h}. This function connects to a
server via TCP, sends a Message, received a Message,
and returns the received Message, so that you can "call"
a server, RPC-style, as if it was a local function.
- Added a GetLocalHostName() function to
NetworkUtilifyFunctions.{cpp,h}.
- Added a HashCode64() method to the String class, and a
CStringHashFunc64() function that it calls.
- Added a ToString() method to the NetworkInterfaceInfo class.
- Improved the parsing of IPAddressAndPort and ParseConnectArg()
so that they now properly handle IPv6 hostname-and-port
strings that don't contain brackets, when possible.
- Added a version of ParseConnectArg() that takes a direct
String (instead of a Message and field name)
- Rewrite the Win32 implementation of GetNetworkInterfaceInfos()
to use GetAdaptersAddresses() instead of GetIpAddrTable(),
so that it can detect IPv6 addresses as well as IPv4.
- Added an optional (preferIPv4Style) argument to Inet_NtoA()
so that if you prefer, IPv4 addresses can be returned in the
classic style ("192.168.1.1") instead of new-style ("::192.168.1.1")
- Added support for the MUSCLE_INCLUDE_SOURCE_LOCATION_IN_LOGTIME
compiler flag, which if specified will cause every call to
LogTime() to include location info (source file name and line
number) in the log information. This can be useful for
tracking down exactly where a particular log message came from.
- When MUSCLE_INCLUDE_LOCATION_IN_LOGTIME is defined, the
standard log-line preamble now includes the string returned
by GetStandardLogLinePreamble().
- Added GenerateSourceCodeLocationKey(),
SourceCodeLocationKeyToString(), and
SourceCodeLocationKeyFromString() functions to Syslog.{cpp,h}
- Added a utility called "findsourcelocations" to the tests folder.
This utility will find possible locations for source code keys
in the specified directory hierarchy.
- Added a HashCode() method to the NetworkInterfaceInfo class.
- The Directory class is now a subclass of RefCountable.
- Added a GetPath() method to the Directory class.
- Added FileExists(), RenameFile(), CopyFile(), and DeleteFile()
utility functions to util/MiscUtilityFunctions.{cpp,h}.
- Added an MEXIT(ret,msg) macro to MuscleSupport.h. It's
the same as MCRASH, but it doesn't crash, it merely ends
the process (by calling ExitWithoutCleanup(ret)).
- Added a Reset() method to the StringMatcher class.
- Added a WasConnected() method to AbstractReflectSession,
so that subclasses can find out if the session ever was
connected to its remote peer.
- ExpandLocalhostAddress() now caches its first result from
GetNetworkInterfaceInfos() so that it no longer has to
call GetNetworkInterfaceInfos() every time it is called.
- Added a GetServerSessionID() method to the ReflectServer
class, and a PR_NAME_SERVER_SESSION_ID field to the
standard parameters set, so that clients can access a
64-bit value that is unique to the current server instance.
- Added a SignalMultiplexer class that deals with POSIX
signals or Windows Console signalling in a unified manner.
- Added a QSignalHandler class that can emit a Qt signal
when a POSIX/Windows signal is received.
- Added a SignalHandlerSession class that you can add
to your ReflectServer if you want signals to result
in a graceful shutdown (or other custom behavior)
- The Python MessageTransceiverThread class constructor
now takes a boolean argument which indicates whether or
not it should use IPv6 networking.
- Added a GetHumanReadableProgramNameFromArgv0(const char *)
convenience function to MiscUtilityFunctions.{cpp,h}.
- Added a Win32AllocateStdioConsole() function that allocates
a console window for stdio to use under Windows.
- Added CleanupDNSLabel() and CleanupDNSPath() functions to
MiscUtilityFunctions.{cpp,h}. These are handy for removing
errors from user-entered DNS hostnames (e.g. "www.foo.com").
- Rewrote String::LastIndexOf(char) and the String -=
operators to be more efficient.
o The arguments to the Log() method in the LogCallback API
are now consolidated into a single LogCallbackArgs object,
for efficiency and cleaner code.
o The GetStandardLogLinePreamble() function now takes a
single LogCallbackArgs argument instead of separate args also.
o Removed support for the MUSCLE_AVOID_NAMESPACES,
BEGIN_NAMESPACE, END_NAMESPACE, and USING_NAMESPACE
macros, since they aren't necessary and use of macros to
control namespaces can confuse Qt's moc utility.
o Rewrote portablereflectclient to use StdinDataIO instead
of accessing stdin directly. This allows it to work
correctly under Windows, and simplifies the code.
o Queue::IndexOf() was defined as returning the last
matching item, which was inconsistent. Replaced it with
a new IndexOf() implementation that does a forward search,
optionally within a specified index range.
o Suppressed a warning in zip.c
o Removed the explicit signal handling from the ReflectServer
class (SetSignalHandlingEnabled() and WasSignalCaught() are
gone now). This functionality is now handled by the
SignalHandlerSession class instead.
* The Win32 "console" keyword wasn't redirecting stdin. Fixed.
* Fixed a syntax error in the EnsureRefIsPrivate() method.
* Updated the VC++ project files so they build again.
* ParseConnectArg() now handles the "[ipv6::addr]:port"
syntax properly when MUSCLE_USE_IPV6 is defined.
* Fixed a bug in the PulseChild class that would sometimes
prevent the GetPulseTime() method of grandchild PulseChild
nodes from getting called after InvalidatePulseTime() was
called on them.
* AbstractReflectClient::Reconnect() now sets the _wasConnected
flag to false.
* Fixed a bug in MessageTransceiverThread::AddNewWorkerConnectSession()
that was causing disconnect notifications not to be sent for
connect-sessions whose connections failed synchronously.
* IntCompareFunc() was taking an int8 argument by mistake. Fixed.



Intel Version - requires R5   (1.8 MB) 16 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 5 downloads
  Working Link Download LCS Canada

Version 4.51
 License:   BSD/MIT
 Updated:   March 19, 2009
 Source:   Source Included
4.51 Released 3/19/2009
- Added GetByteBufferFromPool() functions that accept a Flattenable
object as an argument, for convenience.
- Added a Message::GetPointerToNormalizedFieldData() method, which
is useful if you need efficient direct (array-style) access to
the contents of a data field in a Message object.
- Added NumericAwareStringCompareFunc() functions to String.{cpp,h}.
These routines are based on Martin Pool's number-aware string
compare code, and compare strings in such a way that numbers in
the strings are sorted properly.
- Added a SegmentedStringMatcher class to the regex folder, for
easy multi-level regex matching in e.g. file paths.
- Added GetStringMatcherFromPool() convenience functions to
regex/StringMatcher.{cpp,h}.
- Added a ParseHexBytes() convenience function to
MiscUtilityFunctions.{cpp,h}
- Added a PrintToStream() method to the ByteBuffer class.
- Added Bryan Varner's UDPClient class to the Java archive.
This class facilitates sending small MUSCLE Messages over UDP
in Java programs. Thanks Bryan!
- Added Bryan Varner's DatagramPacketTransceiver class to the
Java archive. This class allow Java applications
to send large MUSCLE Messages over UDP in Java programs,
by breaking them up into multiple chunks that are sent in
successive UDP packets and then re-assembled by the receiver.
This class is compatible with MUSCLE's C++ PacketTunnelIOGateway
class. Thanks again, Bryan!
- Added LaunchChildProcess() and System() methods to the
ChildProcessDataIO class that takes a Queue<String> as an
argument, for convenience.
- Added implementations of ParseArg(), ParseArgs(), ParseFile(),
and UnparseArgs() that take a Queue<String> to hold the parsed
arguments rather than a Message. This is useful in cases where
argument ordering must be preserved 100%.
- Added a Directory::MakeDirectoryForFile() convenience method.
It creates a directory for the specified file to be created in.
o RemoveEscapeChars() and EscapeRegexTokens() now take a const
String and return a String. This makes them easier to use
in nested function calls.
o Repackaged the com.lcs.* Java hierarchy as com.meyer.*, to reflect
my company's name change.
o Removed the Visual Cafe project from the archive, as it is obsolete
and I am no longer using Visual Cafe and thus cannot easily update it.
* Fixed template problems with gcc4 in BThread.h and AThread.h
* The Windows implementation of StdinDataIO now freopens stdin
as "nul", so that no other code will try to access stdin. This
was done to keep third party libraries (read: Python 2.6) from
trying to muck with stdin while the StdinDataIO thread was using
and getting hung up.



Intel Version - requires R5   (1.8 MB) 21 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 7 downloads
  Working Link Download LCS Canada

Version 4.50
 License:   BSD/MIT
 Updated:   January 28, 2009
 Source:   Source Included
4.50 Released 1/28/2009
- NullDataIO's constructor now takes an optional ConstSocketRef
argument, to let you specify the value that its GetSelectSocket()
method should return.
- Added a GetMessageFromPool(const ByteBuffer &) inline
convenience function.
- Added another AddNewSession() convenience method to the
MessageTransceiverThread class.
- In the Message class, MoveName(), CopyName(), and ShareName()
all now take an optional target-field-name parameter, in case
you want to have a different field name in the target Message.
- Added an EnsureFieldIsPrivate(const String & fieldName) method
to the Message class. This method is useful to avoid side effects
when modifying possibly-shared Message fields' contents.
- Added an "cleanup callbacks queue" to the CompleteSetupSystem
class, so that you can specify actions that should be taken as
part of the CompleteSetupSystem destructor's cleanup steps.
- Added a static GetCurrentCompleteSetupSystem() method to the
CompleteSetupSystem class, to make it easier for code to find
the current CompleteSetupSystem object.
- Added MUSCLE_CATCH_SIGNALS_BY_DEFAULT #ifdefs... if this
is set, ReflectServer will enable Control-C detection (and
graceful shutdowns) by default.
- GetOSName() now accepts an optional string value to return in
the case where it can't determine the local OS name.
- Added a MUSCLE_UNIQUE_NAME macro to MuscleSupport.h which will
evaluate to a unique identifier based on the line number that the
macro is invoked on.
- Added a DECLARE_ANONYMOUS_STACK_OBJECT macro to MuscleSupport.h
to allow easy declaration of anonymous objects on the stack.
- Added util/BatchOperator.h, which contains the BatchOperator
and BatchOperatorGuard utility classes that help automate the
amortization of setup/shutdown routines across a nested call
tree, for more efficient batch processing.
- Added a DECLARE_BATCHGUARD() macro for each declaration of
batched areas of code.
- Added a DECLARE_MUTEXGUARD(m) macro to support declaring an
anonymous MutexGuard on the stack in a simple and foolproof way.
- hexterm now automatically enables the UDP broadcast flag on its
UDP socket when the specified UDP address is a broadcast address.
- Added a Cloneable interface in util/Cloneable.h, and updated
ConstRefCount::EnsureRefIsPrivate() to use it when appopriate.
- Added a Clone() method to the ConstRefCount class, for easy
copying of referenced items.
- Redesigned hexterm to be Win32 compatible.
- Added a hexterm.vcproj file to the tests folder, to compile
hexterm under Win32/VC++.
- Added a "child=" option to hexterm so it can spawn and communicate
with a child process if you want it to.
- Added a "ascii" keyword argument to hexterm so you can send
and receive data in ASCII format rather than hex, if you prefer.
- Added LogHexBytes() functions to MiscUtilityFunctions.h. These
are the same as PrintHexBytes() except that they call through
to Log() instead of directly to fprintf().
- Added an optional (portRequired) argument to ParseConnectArg().
- Added SetLogFileName()/GetLogFileName() to util/SysLog.{cpp,h}.
- Added a standard "logfile" keyword so you can specify the name
and/or location of a log file to write the log to.
- Added a WaitForChildProcessToExit() method to the
ChildProcessDataIO class.
- Added ChildProcessDataIO::System() static convenience methods.
- Added a Directory::DeleteDirectory() static convenience method.
o Rolled in Mika Lindqvist's Haiku-compatibility patches.
o Renamed the standard "log" and "display" keywords to "filelevel"
and "displaylevel", respectively.
o Removed the OutOfMemoryCallback and FunctionOutOfMemoryCallback
classes and replaced them with more general-purpose
GenericCallback and FunctionGenericCallback classes.
o Tweaked a call to FD_ISSET() in system/Thread.cpp in order to
avoid a compiler warning under g++ 4.3.1
o Tweaked the _PLOCKimp and _PUNLOCKimp debug functions to compile
properly in 64-bit environments.
o Updated the Message.h doxygen documentation with some more
descriptive parameter names.
o hexterm no longer disables multicast-to-self when sending
multicast UDP packets.
o Removed DebugTimer.cpp; that code has moved to SetupSystem.cpp.
o Updated all copyright notice headers to read 2000-2009 Meyer Sound.
* DebugTimer now uses GetRunTime64() if MUSCLE_USE_LIBRT is defined.
* Fixed some #ifdef problems involving the stat64() call in
FilePathInfo.h. FilePathInfo.h should now compile under both
32-bit and 64-bit environments.
* JeffK added a macosx.mak file to the muscle/zlib/zlib folder,
to support creation of universal binaries that include zlib.
* MuscleSupport.h now checks a much more exhaustive list of
Intel-compatible processor-type macros before deciding that
inline x86 assembly code is not an option. In particular,
compiling with an __i686__ target now does the right thing.
* Fixed a potential infinite recursion in
Thread::WaitForNextMessageAux().
* Tweaked the SharedMemory.h include directives to compile
more reliably under Win32.
* Updated the #ifdefs in MuscleSupport.h to define int64's
and uint64's properly under 64-bit Ubuntu Linux.
* Rewrote the Win32 implementation of StdinDataIO to be simpler
and more reliable.
* The Win32 implementation of the INT64_FORMAT_SPEC macros
was incorrect. Fixed it to do the right thing.
* Made ChildProcessDataIO::LaunchChildProcess() const-correct.
* ChildProcessDataIO::LaunchChildProcess() now specifies the
application name to launch, when possible, for better security.
(See Microsoft's CreateProcess() man page for details)



Intel Version - requires R5   (1.8 MB) 29 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 9 downloads
  Working Link Download LCS Canada

Version 4.41
 License:   BSD/MIT
 Updated:   November 17, 2008
 Source:   Source Included
4.41 Release 11/17/2008
- Added an implementation of PrintHexBytes() that takes a
Queue<uint8> as an argument.
- Added GetArchiveMessageFromPool() functions to Message.{cpp,h}.
These templated convenience functions let you convert any object
(with a SaveToArchive() method) into a MessageRef with a single command.
- Added FindArchiveMessage() and FindArchiveMessageWithDefault()
template methods to the Message class, for convenient one-step
restoring of archived objects.
- Added AddArchiveMessage(), PrependArchiveMessage(), and
ReplaceArchiveMessage() template methods to the Message class,
for further convenience in archiving objects.
- GetHumanReadableTimeValues() now writes into a
HumanReadableTimeValues object instead of into a series
of by-reference int parameters. The HumanReadableTimeValues
object now also includes day-of-week and microsecond fields.
- Added an ExpandTokens() method to the HumanReadableTimeValues
class that makes it easy to generate time/date stamps of your
preferred format using various printf()-style field specifiers.
* ProxySessionFactory::IsReadyToAcceptSessions() wasn't passing
the call onto the slave session like it was supposed to. Fixed.
* The calls to open() inside SpawnDaemonProcess() now supply a
mode argument to the open() call.
* AcceptSocketsThread.cpp wasn't compiling due to a const/non-const
issue. Fixed.
* Fixed several bugs in the admin utility. Thanks to Monni for
pointing them out and supplying a patch.



Intel Version - requires R5   (1.8 MB) 38 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 12 downloads
  Working Link Download LCS Canada

Version 4.40
 License:   BSD/MIT
 Updated:   October 16, 2008
 Source:   Source Included
4.40 Release 10/16/2008
- The Ref class now subclasses from a ConstRef class, which is the
same as Ref except that it only allows read-only access to the
held RefCountable object.
- Added a CastAwayConstFromRef() template function to RefCount.h,
so you can easily convert a ConstRef to a Ref if you really need to.
- Renamed the SocketRef class to ConstSocketRef, because it now derives
from ConstRef<Socket> instead of Ref<Socket>.
- Added a DECLARE_REFTYPES macro to RefCount.h, which you can
use to declare the standard BlahRef and ConstBlahRef typedefs
without having to specify the typedefs manually every time.
- Added implementations of the Connect() and ConnectAsync() functions
that take an IPAddressAndPort object as an argument.
- Added *_FORMAT_SPEC_NOPERCENT macros, for times when I need to
specify format specifications without the percent sign included.
- Added an AsyncDataIO class that can be used to transparently forward
I/O operations to a separate thread, to avoid blocking in your
main thread. This can be useful for DataIO classes that don't
support non-blocking I/O (e.g. FileDataIO)
- Added a GetStackTrace() function to SysLog.{cpp,h} that returns
the current stack trace as a String.
- Added GetLightweightCopyOfMessage() convenience functions to
Message.{cpp,h}.
- Added convenience methods FindFirstSessionOfType() and
FindSessionsOfType() to the ServerComponent class. These
methods are templated to let you quickly find and collect
one or more atatched session objects of the specified C++ class.
o Renamed GenericRef to RefCountableRef, for consistency.
o Renamed PolicyRef to AbstractSessionIOPolicyRef, for consistency.
o Renamed Ref::SetFromGeneric() and Ref::GetGeneric() to
Ref::SetFromRefCountableRef() and Ref::GetRefCountableRef(),
respectively, for consistency.
o testrefcount now runs a 10-second test of reference-counts in a
heavily multithreaded environment, to ensure that they are thread safe.
o Improved performance of Tuple::ShiftValuesLeft() and
Tuple::ShiftValuesRight().
* Removed re-definitions of 'true' and 'false' when compiling in C++ mode.
* Added some missing command codes to StorageReflectConstants.py.
* Message.py didn't handle B_INT32_TYPE fields properly when running on
a 64-bit host. Fixed.
* AddNewConnectSession() and Reconnect() now handle synchronous connect
failures the same way as asynchronous connect failures, so that the
calling code doesn't have to worry about two different failure modes.
* Fixed a valgrind hit in CreateAcceptingSocket() on 64-bit platforms.
* Fixed a buffer overflow bug in Message::AddToString().
* Updated the header comments to fix various doxygen warnings.



Intel Version - requires R5   (1.7 MB) 29 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.7 MB) 11 downloads
  Working Link Download LCS Canada

Version 4.30
 License:   BSD/MIT
 Updated:   September 19, 2008
 Source:   Source Included
4.30 Released 9/18/2008
*** WARNING - THIS RELEASE CHANGES THE PulseNode API IN a NON ***
*** BACKWARDS COMPATIBLE WAY. BE SURE TO READ THE ENTRY ABOUT ***
*** PulseNode BELOW AND UPDATE YOUR CODE TO MATCH THE NEW API. ***
- ChildProcessDataIO class now has SetChildProcessInheritFileDescriptors()
and GetChildProcessInheritFileDescriptors() methods to control whether
child processes spawned should inherit the parent\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s file descriptors or
not. Note that these methods have no effect under Windows.
- When receiving UDP packets, hexterm now prints out the source of the
UDP packets it received (in addition to the data).
- Added a IsNormalized() method to the Queue class.
- Added a IsMessageDeflated() method to ZLibUtilityFunctions.h.
- Added Message::BecomeLightWeightCopyOf(const Message &), for making
lightweight copies of Messages, with shared fields.
- Added Message::ShareName() (like CopyName() except the data isn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t
copied, rather only a reference is shared)
- Added Queue::AddHeadAndGet() and Queue::AddTailAndGet() methods,
for when you want to add an item to a Queue and then write to the
added object directly afterwards.
- Added an optional (retPort) argument to
MessageTransceiverThread::PutAcceptFactory() so that you can now
use dynamic port assignment with it.
o PulseNode::GetPulseTime() and PulseNode::Pulse() now take a single
(const PulseArgs &) argument instead of two uint64s. This makes
implementing the PulseNode interface less verbose, and calling
the Pulse callbacks more efficient. However, this breaks compatibility
with earlier code that expects (uint64, uint64) arguments for those
methods, so be sure to update your code when upgrading to this
version of MUSCLE.
o Fixed some compiler warnings under gcc (thanks to Monni for pointing
these out)
o Trying to use MUSCLE\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s logging system when there is not a SetupSystem
object on the stack (e.g. before or after main()) is no longer a fatal error.
Instead, muscle will degrade to output only to the built-in log services
(stdout and/or output-to-file) when called under these conditions.

Intel Version - requires R5   (1.7 MB) 45 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.7 MB) 13 downloads
  Working Link Download LCS Canada

Version 4.28
 License:   BSD/MIT
 Updated:   August 27, 2008
 Source:   Source Included
4.28 Released 8/26/2008
- Added a RefCount::IsDeeplyEqualTo() method for more in-depth
comparison-by-value of the referenced items. (The regular RefCount::==
operator only compares the pointers, not the items themselves)
- Added a Directory class (util/Directory.{cpp,h}) to support directory
scanning in a cross-platform-compatible fashion.
- Added a FilePathInfo class (util/FilePathInfo.h) to support
stat() functionality in a cross-platform-compatible manner.
- ReflectServer::SetSignalHandlingEnabled() now enables/disables
handling of console signal events (Ctrl-C, etc) under Win32.
- Added implementations of GetMessageFromPool() that take a
pointer and a byte-count and try to return a Message that has
been unflattened from the specified byte array.
- ChildProcessDataIO::LaunchChildProcess() now takes an optional
boolean (usePty) argument that allows you to specify at runtime
whether you want to use fork() or forkpty() to launch the child
process.
- Added a MUSCLE_AVOID_FORKPTY compiler flag that tells the
ChildProcessDataIO class to avoid compiling in calls forkpty().
o Made the AbstractReflectSession::EndSession() method virtual.
o The Win32 build of MUSCLE now #includes winsock2.h instead of winsock.h.
* The Win32 implementation of StdinDataIO wasn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t handling a closed
stdin connection correctly. Fixed.
* For the Win32 build, added Microsoft\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s recommended work-around for
the WSAECONNRESET problem with UDP sockets, as described at
http://support.microsoft.com/kb/263823/en-us
* Fixed the Hashtable and Queue classes to again compile under
Visual C++ 6.0 (thanks to Mika Lindqvist for the patch)



Intel Version - requires R5   (1.7 MB) 30 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.7 MB) 10 downloads
  Working Link Download LCS Canada

Version 4.27
 License:   BSD/MIT
 Updated:   July 25, 2008
 Source:   Source Included
4.27 Release 7/24/2008
- minichatclient.c now advertises the client\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s host OS on the server.
- PrintStackTrace() is now implemented under MacOS/X (Leopard or newer).
- PrintStackTrace() and all implementations of PrintToStream()
now take an optional (FILE *) argument, so that they can now
print to places other than stdout if you prefer.
- The testchildprocess test program now has you specify the number
of child process instances to run. That makes it easier to test
what happens when many child processes are launched in parallel.
o Merged in some more of Mika Lindqvist\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s Haiku compatibility tweaks.
o Hashtable::GetByDefault() with one parameter now returns its result
by reference instead of by value.
o The Hashtable and Queue classes now keep default instances of
their user types, to avoid having to construct temporary default
objects when resetting objects to their default state.
* PrintStackTrace() now prints appropriate error messages if
it fails, instead of just failing siliently.
* Fixed a syntax error in Hashtable::Remove(const Hashtable &)
* Hashtable::Clear() now handles re-entrancy (from the templatized
classes\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' assignment operators) correctly.



Intel Version - requires R5   (1.7 MB) 27 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.7 MB) 11 downloads
  Working Link Download LCS Canada

Version 4.26
 License:   BSD/MIT
 Updated:   June 6, 2008
 Source:   Source Included
4.26 Released 6/5/2008
- Added a CheckedGetItemPointer() method to the Ref class.
This method is the same as GetItemPointer(), but with
an additional check so that it will safely return NULL
if the \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"this\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" pointer is NULL.
- Added a \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"assumeDefaultValue\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" argument to the NumericQueryFilter,
StringQueryFilter, and RawDataQueryFilter classes. This
argument lets you specify that in the event that a Message
doesn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t contain the data item the QueryFilter wants to
compare against, a default value should be compared against
instead.
- Added a HashCode() method to the Ref class, for consistency.
- ChildProcessDataIO::GetChildProcessID() is now implemented
under Windows as well.
- Added two new conditional defines to MuscleSupport.h:
MUSCLE_USING_OLD_MICROSOFT_COMPILER, which is defined when
compiling under VC++6 or earlier, and
MUSCLE_USING_NEW_MICROSOFT_COMPILER, which is defined
when compiling under VC++.net(2003) or later. These make
managing Microsoft\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s bug circus a bit a easier.
* Fixed the Ref class to compile under MSVC2005 again.
* Fixed the setsockopt()/getsockopt() calls in NetworkUtilityFunctions.cpp
so that they again compile under Windows.
* Merged in Mika Lindqvist\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s patches so that muscle compiles
properly under Haiku.


Intel Version - requires R5   (1.8 MB) 30 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 14 downloads
  Working Link Download LCS Canada

Version 4.25
 License:   BSD/MIT
 Updated:   May 15, 2008
 Source:   Source Included
4.25 Released 5/14/2008
- Added a DECLARE_HASHTABLE_KEY_CLASS macro that expands
to the boilerplate template code necessary to use the
specified class as a key in a Hashtable.
- Added a DECLARE_HASHTABLE_KEY_CLASS_IN_NAMESPACE macro
which is the same as DECLARE_HASHTABLE_KEY_CLASS except
it works from within namespaces other than muscle.
- Added PutIfNotAlreadyPresent() convenience methods to the
Hashtable class.
- Added CopyFrom() method to the Queue and Hashtable classes.
These work the same as the assignment operator, except that
they return a status_t result code.
- Added a SetFilter() method to the PathMatcherEntry class.
o Cleaned up the setsockopt() and getsockopt() calls inside
NetworkUtilityFunctions.cpp to be more portable.
* ExplandLocalhostAddress() is now more careful not to expand
(localhostIP) back into (localhostIP), even if that is the
first IP address listed in the interfaces list.
* Fixed a bug in the QueryFilter subscriptions feature --
after replacing a subscription\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s existing QueryFilter,
the old QueryFilter would continue to be used instead
of the new one.


Intel Version - requires R5   (1.8 MB) 31 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 14 downloads
  Working Link Download LCS Canada

Version 4.24
 License:   BSD/MIT
 Updated:   April 28, 2008
 Source:   Source Included
4.24 Released 4/28/2008
- If MUSCLE_USE_LIBRT and _POSIX_MONOTONIC_CLOCK are defined,
GetRunTime64() and Snooze64() will now use librt\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s high-resolution
functions (clock_gettime() and clock_nanosleep()) instead of
the older vanilla POSIX functions. This can provides higher
resolution timing on platforms that support librt.
- Added a new ExecuteSynchronousMessaging() virtual method
to the AbstractMessageIOGateway class, and some associated
hook/callback methods. This method lets you easily do
synchronous/RPC-style \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"function calls\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" across the gateway\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s
socket, passing in one or more Message objects as the
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"arguments\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\", and receiving one or more Messages as \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"results\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\".
- MessageIOGateway now overrides ExecuteSynchronousMessaging(),
IsStillWaitingForSynchronizedReply(), and
SynchronousMessageReceivedFromGateway() so that when you
call ExecuteSynchronousMessaging() on it you will get
proper RPC function-call semantics.
- Added an IsReadyToAcceptSessions() virtual method to the
AbstractReflectSessionFactory class. Subclasses can override
this method to return false if they don\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t want to accept
any more connections for a while.
- Added an IsConnected() method to the AbstractReflectSession
class, to make it easier to check if a given session is
currently connected to anything or not.
- Added an XorDataIO class to the dataio folder.
XorDataIO XOR\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s all the data going through it, before
forwarding the method call to its held child DataIO object.
- Added a MutexGuard class that you can put on the stack
to automatically lock/unlock a Mutex via its ctor/dtor.
- Added versions of ReadZipFile() and WriteZipFile() that
take a DataIO reference instead of a file name. That way
you can read zip files over the network, through custom
filters, and so on, if you want to.
zlib/ZipFileUtilityFunctions.{cpp,h}.
- ReadZipFile() now has an optional second argument called
(loadData). Setting it false will cause ReadZipFile to
only read in the file names and uncompressed file lengths,
but not actually read or uncompress the file data. This
is useful if you just want to quickly check the zip file\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s
contents without actually unpacking everything.
- Updated testzip.cpp to accept an optional \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"namesonly\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
command line argument, which will set (loadData) to
false in its ReadZipFile() call, as described above.
- Added a GetNetworkInterfaceAddresses() function, as an
easier-to-use alternative to GetNetworkInterfaceInfos().
o Made AbstractReflectSession::IsConnectingAsync() public.
o Moved Snooze64() from NetworkUtilityFunctions.cpp to
SetupSystem.cpp, and moved its function declaration from
NetworkUtilityFunctions.h to TimeUtilityFunctions.h.
* Joel Lucsy reported a bug in FlattenToDataIO() that would cause
the last four bytes of the flattened buffer not to be written
to the DataIO object. Fixed.
* Updated zlib\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s included VC++ project files to reference zconf.h
in its new location (zlib/win32/zconf.h) so that they now work
again.


Intel Version - requires R5   (1.8 MB) 30 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 10 downloads
  Working Link Download LCS Canada

Version 4.23
 License:   BSD/MIT
 Updated:   March 26, 2008
 Source:   Source Included
4.23 Released 3/26/2008
- Added an UnparseArgs() function to MiscUtilityFunctions.{cpp,h}.
This function takes a parsed Message and turns it back into a String.
- Added an InsertItemsAt() method to the Queue class.
- Added an (includeLocalhost) boolean argument to GetNetworkInterfaceInfos().
- Made ServerComponent::SetOwner() and ServerComponent::GetOwner()
public, as it is necessary for classes other than ReflectServer
to access that value in order to properly support the facade
pattern within ReflectSessionFactory objects.
- Added a ProxySessionFactory class to support facade-style
ReflectSessionFactories better.
- Added an optional ITraversalPruner argument to both
StorageReflectSession::SaveNodeTreeToMessage() and
StorageReflectSession::RestoreNodeTreeFromMessage(). This
argument lets the caller specify a callback argument that
can direct the traversal based on custom logic, if necessary.
o Replaced StorageReflectSession::CloneDataNodeSubtree()\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s rather clunky
MessageReplaceFunc and void-pointer filtering mechanism with the nicer
and more powerful ITraversalPruner filtering mechanism.
* Fixed a bug in FilterSessionFactory and SharedFilterSessionFactory
where an assertion failure would occur if the \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"slave\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" factory attempted
to call GetSessions(), etc.
* SharedFilterSessionFactory\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s IP-address checking was broken. Fixed.
* AbstractReflectSession::GetPort() was broken and would always
return 0. Fixed.


Intel Version - requires R5   (1.8 MB) 29 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 6 downloads
  Working Link Download LCS Canada

Version 4.21
 License:   BSD/MIT
 Updated:   January 23, 2008
 Source:   Source Included
v4.21 Released 1/22/2008
- Optimized Hashtable::GetOrPut(), CopyToTable(), MoveToTable(),
Put(), and Remove() to be more efficient.
o Updated the muscle.dox DOxygen file to reflect changes to
newer versions of DOxygen
* Hashtable::Put() and Hashtable::Remove() now do the right
thing if they are passed (*this) as an argument.
* Fixed a nasty bug in the ObjectPool destructor that would
cause it to go into an infinite loop, calling delete on
the same array over and over again.
* Filled in and fixed up the DOxygen comments to the point where
DOxygen no longer gives any warnings when generating the autodocs.
o Updated all copyright notice headers to read 2000-2008 Meyer Sound.



Intel Version - requires R5   (1.8 MB) 43 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 15 downloads
  Working Link Download LCS Canada

Version 4.20
 License:   BSD/MIT
 Updated:   December 31, 2007
 Source:   Source Included
v4.20
- Added an optional set of multicast networking API calls
to util/NetworkUtilityFunctions.h. Define the constant
MUSCLE_ENABLE_MULTICAST_API to make them available.
- hexterm will now automatically use multicast UDP if you
specify a multicast UDP address as an argument. For example,
./hexterm udp=239.255.1.2:4001
- Added SetSourceExclusionID() and GetSourceExclusionID()
methods to the PacketTunnelIOGateway class, to enable more
efficient filtering of looped-back broadcast/multicast packets
that you sent out and don\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t want to see back again.
- Added a ParseHexBytes() function to MiscUtilityFunctions.{cpp,h}
- Under Linux, HandleStandardDaemonArgs() now takes a new argument
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"debugcrashes\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" which will cause a signal handler to be installed
that will catch SIGSEGV, SIGBUS, SIGILL, SIGABRT, and SIGFPE,
and print a stack trace to stdout before exiting.
- Added RemoveFirst() and RemoveLast() convenience methods
to the Hashtable class (handy when using the Hashtable as
a keyed FIFO or LRU)
o Moved the PrintHexBytes() function into system/SetupSystem.cpp
so that you don\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t have to link in MiscUtilityFunctions.cpp
just to use it.
* Tweaked FinalizeAsyncConnect() to work properly under BeOS.


Intel Version - requires R5   (1.8 MB) 36 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 16 downloads
  Working Link Download LCS Canada

Version 4.11
 License:   BSD/MIT
 Updated:   December 11, 2007
 Source:   Source Included
v4.11 Released 12/11/2007
- GetHumanReadableTimeString() and ParseHumanReadableTimeString()
now handle the uint64 value MUSCLE_TIME_NEVER as a special case,
by translating it into the string \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"(never)\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" (and back).
- Added a CalculateChecksumForUint64(), CalculateChecksumForFloat(),
and CalculateChecksumForDouble() convenience functions to
MuscleSupport.h
- Added a FindFirstMatchingNode() method to the DataNode class,
which can be used to efficiently look up a descendant node
based on a relative or absolute path, with or without wildcard
matching characters.
- Added a GetRootNode() convenience method to the DataNode class
which returns the root node of the DataNode tree.
- Added SetAllowMiscIncomingData() and GetAllowMiscIncomingData()
methods to the PacketTunnelIOGateway class, so that a UDP socket
controlled by a PacketTunnelIOGateway can optional receive
individual (non-packetized) arbitrary UDP packets as well as
the packetized kind. This mode is disabled by default.
- Added a Normalize() method to the Queue class that can be used
to ensure that the Queue\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s contents are layed out contiguously
in memory (like a C array).
- Added a AddNewDormantConnectSession() method to the ReflectServer
and ServerComponent classes. This method is the same as
AddNewConnectSession() except that the added session will not
start a TCP connection immediately; instead it will hang out
and wait for you to call Reconnect() on it.
- Added a PrintHexBytes() convenience/debugging function to
MiscUtilityFunctions.h
o Removed the (countFieldOrder) argument from the
Message::CalculateChecksum() method.
o Changed instances of ((uint32)-1) literals to the more proper
MUSCLE_NO_LIMIT constant in a number of places.
o Rewrote StorageReflectSession::GetDataNode() as a simple
inline call-through to FindFirstMatchingNode(), which means
that GetDataNode() now supports wildcard matching.
o GetHumanReadableTimeValues() now returns B_ERROR if you pass
it MUSCLE_TIME_NEVER as a time value (since there is no good
numeric way to represent infinity).
o DataNode::PrintToStream() and Message::PrintToStream()
no longer print this-pointer values in their debug output,
because doing so makes it harder to diff state dumps
from different processes.
o AbstractReflectSession::Reconnect() and SetAutoReconnectDelay()
can now be used in conjunction with sessions that were not
added with AddNewConnectSession() also. In this context, they
will \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"reconnect\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" the session by destroying its gateway and
DataIO objects and creating new ones by calling
CreateDefaultSocket() and CreateDataIO().
* system/AcceptSocketsThread.h was missing a necessary #include
line. Thanks to Mika Lindqvist for reporting this.
* Fixed a bug in DataNode::InsertOrderedChild() that could cause
the inserted child\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s node name not to be unique in some
circumstances.
* DataNode::PutChild() now takes a (const DataNodeRef &) instead
of a (DataNodeRef &).
* Removed the index-order multiplication from most implementations
of CalculateChecksum(), since including an index-multiplier
in the checksum makes it inefficient to update a running
checksum tally when inserting or removing items in the list.
* The Thread class now closes the internal thread\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s side of
the inter-thread socket connection when the internal thread
hook function exits. That way the main thread can be notified
that the child thread has gone away (the main thread\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s socket
will select() ready-for-read because of the socket close)



Intel Version - requires R5   (1.8 MB) 33 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 9 downloads
  Working Link Download LCS Canada

Version 4.10
 License:   BSD/MIT
 Updated:   October 30, 2007
 Source:   Source Included
- Added Bryan Varner\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s MicroMUSCLE port to the archive, in
the new java_j2me folder. MicroMUSCLE is a fork of the
MUSCLE Java code that is compatible with the J2ME edition
of Java being used on modern cell phones, etc. Unlike
the standard MUSCLE Java API, this version doesn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t require
Java 1.4.x APIs to be supported.
- Added a GetNumberOfProcessors() function to the SystemInfo.h
API. You can call this to find out how many CPU cores the
computer you are running on has.
- Made LockLog() and UnlockLog() part of the public MUSCLE
syslog API, in case you want to use the log mutex in your
own critical section.
- Added a CalculateChecksum() utility function to MuscleSupport.h
- Added CalculateChecksum() functions to the String, ByteBuffer,
Point, Rect, Message, and DataNode classes. These methods
compute a quick checksum on the object\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s contents which can
then be used for sanity-checking later on.
- Added a PrintToStream() method to the DataNode class for
quick recursive dumping of database subtrees to stdout.
- Message::PrintToStream() and Message::ToString() now include
the checksum value of the Message.
- Added IsInBatch() and IsOutermost() methods to the NestCount
class, for convenience and code clarity. (Before they were
only present in the NestCountGuard class)
- Added a KillChildProcess() method to the ChildProcessDataIO
class, for times when you need the child process dead right
away but you want to keep the socket to it open (so that it
will error out as if the child process died of its own accord).
- Added IsDescendantOf() and IsAncestorOf() convenience methods
to the DataNode class.
- Added a StringCompareFunc() override to String.h that takes
(const String *)\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s as arguments. Useful when you want to
save space in a Hashtable of string-keyed, ref-counted
objects, by changing the key-type to a pointer to a string
that is held in the referenced value-objects.
- Added a Message::FindString() method override that sets a
pointer-to-a-String, so that you can access the underlying
String object without having to copy it.
- Added a ServerComponent::GetSession() override that takes
a uint32 for the session ID argument.
- Added convenience versions of StringMatcher::Match()
and HasRegexTokens() that take a String argument instead
of a (const char *).
- Added a GetEmptyMessageRef() convenience function to
Message.h. It\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s like GetEmptyMessage() except it returns
a (const MessageRef &) instead of a (const Message &).
- The StdinDataIO class now works as expected under Windows.
In particular, it implements some backstage trickery so that
you can use its GetSelectSocket() return value in select()
even though Windows doesn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t support doing that.
o Removed GetBlankMessage() from the StorageReflectSession
API. Use GetEmptyMessageRef() instead.
o DataNode::GetData() now returns a (const MessageRef &)
instead of a MessageRef.
o The GetSessions() method now returns a Hashtable instead
of a HashtableIterator.
o The GetNumSessions() method has been removed; use
GetSessions().GetNumItems() instead.
o The GetFactories() method now returns a Hashtable instead
of a HashtableIterator.
o The GetNumFactories() method has been removed; use
GetFactories().GetNumItems() instead.
o Tweaked some of the code to avoid new warnings in gcc 4.1.x
o The SetDataNode(), FindMatchingSessions(), CloneDataNodeSubtree(),
NotifySubscribersThatIndexNodeChanged(), NodeIndexChanged(),
GetNewDataNode(), and JettisonOutgoingSubtrees() methods
in the StorageReflectSession class not take String arguments
instead of (const char *)
o The InsertOrderedChild(), ReorderChild(), HasChild(),
GetChild(), and RemoveChild() in the DataNode class now all
take String arguments instead of (const char *).
o DataNode::GetPathClause() now returns a (const String *)
instead of a (const char *).
o FilterSessionFactory Put*Pattern() and Remove*Pattern()
methods now take (const String &) arguments instead of
(const char *).
o The StdinDataIO class no longer derives from the
FileDescriptorDataIO class. This way it is possible to
use StdinDataIO under Windows (which doesn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t support
file descriptors).
o Moved the StdinDataIO code into its own separate StdinDataIO.cpp
file, to better hide the ugly Windows implementation.
* Fixed a VC++ compatibility issue in ObjectPool.h. Thanks to
Mika Lindqvist for reporting this problem.
* Fixed a bug in AcceptSocketsThread.cpp. Thanks to Mika
Lindqvist for reporting this problem also.
* Fixed a HANDLE leak in the Windows implementation of the
RS232DataIO and ChildProcessDataIO classes.


Intel Version - requires R5   (1.7 MB) 43 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.7 MB) 19 downloads
  Working Link Download LCS Canada

Version 4.00
 License:   BSD/MIT
 Updated:   October 4, 2007
 Source:   Source Included
v4.00 Release 10/03/2007
*** WARNING - THIS RELEASE RATIONALIZES SEVERAL APIS AND THUS ***
*** BREAKS SOURCE COMPATIBILITY WITH MOST OLD CODE. DONT ***
*** UPGRADE TO THIS RELEASE UNLESS YOU ARE WILLING TO UPDATE ***
*** YOUR CODEBASE TO MATCH. ***
- Added a SanitySetupSystem class to the CompleteSetupSystem
object. SanitySetupSystem just does some very quick tests
on the typedef sizes (int16, int32, etc) and endian-ness
of the compiled code to make sure that the code\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s build
settings are compatible with the run-time environment.
If any of the tests fail, it prints out a stern error
message and aborts the program.
- Added convenience methods for AddFlat(), PrependFlat(),
FindFlat(), and ReplaceFlat() to the Message class that
take a ByteBufferRef as an argument. That way you can
deal with Messages and ByteBufferRefs without always
having to look up how to cast a ByteBufferRef to a
FlatCountableRef and back.
- Added HasChars() and IsEmpty() convenience methods
to the String class, for consistency with the other
container classes.
- Rewrote the ObjectPool class to do its object allocations
in 8 kilobyte \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"slabs\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" rather than one at a time.
This cuts down on the number of calls to new/delete
by an order of magnitude.
- Added a -DMUSCLE_POOL_SLAB_SIZE build option in case
you want the ObjectPools to use a different slab size.
This value is specified in bytes.
- Added an ExitWithoutCleanup() function to
MiscUtilityFunctions.{cpp,h}, which is equivalent to
_exit(). This wrapper function exists because I
suspect _exit() may not be entirely portable.
- Added a \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"testpool\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" program to the tests folder to
measure the relative efficiency of various
object-allocation techniques.
- AbstractReflectSession::GetSessionIDString() now returns
a (const String &) instead of a (const char *).
- Added a GetSessionID() accessor to AbstractReflectSession.
- Added a CreateDefaultSocket() method to the
AbstractReflectSession class. This method is called
when AddNewSession() is passed a null SocketRef, and
if implemented to return a non-NULL SocketRef, can be
used to provide a default socket for the session.
o Renamed the SocketHolderRef class to Socket.
o Added the a SocketRef class (which subclasses Ref<Socket>)
o All MUSCLE functions that previously dealt with sockets
as integer file descriptors now use the new SocketRef
type instead. This way there is no chance of leaking or
double-freeing allocated sockets.
o Removed the CloseSocket() function from the API, since
it is no longer necessary.
* Changed the static casts in StorageReflectSession.cpp
to dynamic_cast<>, so that ReflectServers holding some
sessions derived from StorageReflectSession and some
derived directly from AbstractReflectSession will now
work without crashing.
o Removed GetDataIORef() and GetGatewayRef(), and changed
GetDataIO() and GetGateway() to return references to Ref
objects instead of pointers to objects.
o AbstractReflectSession::CreateDataIO() now takes a
(const SocketRef &) argument instead of an int, and now
returns a DataIORef instead of a (DataIO *)
o AbstractReflectSession::CreateGateway() now returns an
AbstractMessageIOGatewayRef instead of a
(AbstractMessageIOGateway *)
o ReflectSessionFactory::CreateSession() now returns an
AbstractReflectSessionRef instead of a (AbstractReflectSession *)
o StorageReflectSession::GetNewDataNode() now returns a
DataNodeRef instead of a (DataNode *). This way any
chance of a memory leak is avoided.
o StorageReflectSession::ReleaseDataNode() has been
removed since it is no longer necessary.
o RefCountable\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s copy constructor no longer copies the
_manager pointer, since items allocated in one ObjectPool
can no longer be freed by a different ObjectPool.
o MessageTransceiverThread::CreateSupervisorSession() now
returns a ThreadSupervisorSessionRef instead of a
(ThreadSupervisorSession *)
o MessageTransceiverThread::CreateDefaultWorkerSession()
now returns a ThreadWorkerSessionRef instead of a
(AbstractReflectSession *)
o MessageTransceiverThread::CreateDefaultSessionFactory()
now returns a ThreadWorkerSessionFactoryRef() instead of
a (ReflectSessionFactory *).
o ThreadWorkerSessionFactory::CreateThreadWorkerSession()
now returns a ThreadWorkerSessionRef instead of a
(AbstractReflectSessionRef *).
o The MessageTransceiverThread::AddNew*Session() family
of methods now take a (const ThreadWorkerSessionRef &)
argument instead of (const AbstractReflectSessionRef &).
o The MessageTransceiverThread::PutAcceptFactory() family
of methods now take a ThreadWorkerSessionFactoryRef
argument instead of a ReflectSessionFactory.
o MessageTransceiverThread::CreateReflectServer() now
returns a ReflectServerRef instead of a (ReflectServer *).
o The ReflectServer class now derives from RefCountable
and has an associated ReflectServerRef typedef.
o Removed the SetOkayToClose*() methods from the
MessageTransceiverThread class, as they are no longer
necessary.
* BecomeDaemonProcess() now calls ExitWithoutCleanup()
instead of exit(), to avoid crashing the parent process
in the globals-cleanup phase (since the CompleteSetupSystem
object destructor never gets a chance to run).
* Replaced all calls to exit() with calls to
ExitWithoutCleanup().
* Tweaked FileDescriptorDataIO to compile correctly on
64-bit systems.
* Fixed typedefs of int32/uint32 for the PPC64 platform.
* Fixed typedef of muscle_socklen_t on PPC64
* ZipFileUtilityFunctions.cpp was calling newnothrow to
allocate an array. Changed it to call newnothrow_array
instead.
* RefCount::SetFromGeneric() would return B_NO_ERROR if
you tried to call SetFromGeneric(NullRef()), but it
wouldn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t actually change the state of the Ref that
you called it on. It now sets the state to NULL in
that case.
* AtomicCounter.h now uses the public QAtomicInt API
when compiled with Qt 4.4.0 or higher. (When compiling
with Qt 4.0.0 through 4.3.x, it will still use the old
private atomic API)
* Applied some tweaks to MuscleSupport.h for better
MacOS/X Leopard compatibility.
* Tweaked SharedMemory.h to compile on MacOS/X Leopard.



Intel Version - requires R5   (1.6 MB) 41 downloads
  Working Link Download LCS Canada
  Working Link Download Alternate Location
PowerPC Version - requires R5   (1.6 MB) 18 downloads
  Working Link Download LCS Canada
  Working Link Download Alternate Location

Version 3.40
 License:   BSD/MIT
 Updated:   September 7, 2007
 Source:   Source Included
v3.40 Released 9/6/2007
- Added experimental IPv6 support. To use MUSCLE with
IPv6, compile your code with the -DMUSCLE_USE_IPV6
flag. The new typedef ip_address will then be compiled
as a 128-bit datatype (the new ip_address class) instead
of being typedef\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'d to uint32.
- Added a new PacketTunnelIOGateway class that is useful
for \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"tunneling\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" arbitrarily large Messages over a
packet-based protocol with a smaller maximum packet
size (e.g. UDP). The PacketTunnelIOGateway class
will packetize large Messages and reconstruct them
from the fragments at the other end.
- Added SetAutoReconnectDelay() and GetAutoReconnectDelay()
methods to the AbstractReflectSession class. You can use
these to easily configure your AbstractReflectSession to
automatically reconnect itself after its connection to
the server has been broken.
- Added a new, optional (autoReconnectDelay) to all the
AddNewConnectSession() methods in MessageTransceiverThread,
QMessageTransceiverTherad, ServerComponent, and
ReflectServer. If specified, this argument will cause
SetAutoReconnectDelay() to be called on the new session.
- Added a new PacketizedDataIO class that can be used
to \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"wrap\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" a streaming DataIO class (e.g.
TCPSocketDataIO) and make it act more like a
packet-style DataIO class (e.g. UDPSocketDataIO).
- Accept() now has an optional second argument, which
will return the IP address of the interface that
a connection was accepted on.
- Added a new IPAddressAndPort class which is handy
for encapsulating an IP address and port number
together in the same object.
- PutAcceptFactory() and RemoveAcceptFactory() now
accept optional local interface IP address arguments
so that you can specify that connections to the
server should only be accepted on a certain
interface, if that\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s what you want.
- PutAcceptFactory() now accepts an optional (retPort)
argument which you can use to find out which port
the factory was installed on.
- PutAcceptFactory() now puts its connection-accepting
socket into non-blocking mode so that the server
can\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t ever block inside Accept().
- Added a GetLocalInterface() method to the
ReflectSessionFactory class so you can see which
interface(s) that factory is associated with.
- Added some more convenience methods to the Hashtable
class: versions of GetNextKey(), PeekNextKey(),
GetNextValue(), and PeekNextValue() that take
a pointer-reference as their sole argument.
- ReflectSessionFactory objects are now auto-assigned
a globally unique ID number when they are created.
This number can be accessed by calling
ReflectSessionFactory::GetFactoryID().
- Added a simple portscan utility (called \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"portscan\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\")
to the tests folder.
- Added a GetChildProcessID() method to the
ChildProcessDataIO class, which returns the child
process\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s process ID (pid).
- Added a ByteBufferDataIO class that lets you read/write
ByteBuffer objects using the DataIO interface (as if
they were files).
- Added GetFirstFieldNameString() and GetLastFieldNameString()
convenience methods to the Message class, so that
you don\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t need to set up a MessageFieldNameIterator
just to get a single field out of the Message.
- Added a GetSourceOfLastReadPacket() method to the
UDPSocketDataIO class, so that you can find out after a
Read() call where the data you just read came from.
- Added a SetSendDestination() method to the
UDPSocketDataIO class, so that you can have Write()
call sendto() instead of send() if you prefer.
- Added a GetSendDestination() method to the
UDPSocketDataIO class.
- Added a testpacketio test to the tests folder, to
unit-test the PacketizedDataIO class.
- Added a testpackettunnel test to the tests folder,
to unit-test the PacketTunnelIOGateway class.
- Added a NestCount convenience class to the util
folder. This simple class handles some of the
drudge work associated with tracking recursion
levels of recursive function calls.
- Added a Reposition() method to the Hashtable class
that can be used to manually update the position
of an auto-sorted-by-value entry that has been
modified in-place.
- Added MoveToTable() and CopyToTable() convenience
methods to the Hashtable class.
- Made some minor optimizations to the auto-sort-by-value
code in the Hashtable class.
o Removed the MemoryBufferDataIO class, since it
was not very useful or well designed.
o Changed the MessageTransceiverThread class\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s
GetNextEventFromInternalThread() method so that
it passes back the ReflectSessionFactory\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s ID
(as a uint32) instead of its port number (as a
uint16). This was done because port numbers
are no longer unique identifiers for session
factories.
o Changed the ReflectSessionFactory::CreateSession()
method to take different arguments (note that this
will break old code that defined its own
ReflectSessionFactory subclasses! That code will
need to be updated to use the new arguments)
o The NetworkInterfaceInfo class\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s GetName() and
GetDescription() methods now return references to
String objects, instead of character pointers.
o Moved the declaration of Inet_NtoA() from
MiscUtilityFunctions.h to NetworkUtilityFunctions.h.
o Removed the GetLocalIPAddress() function from
NetworkUtilityFunctions.{cpp,h}, as it is redundant
with (and less useful than) the new
GetNetworkInterfaceInfos() function.
o Removed the GetPort() method from the
ReflectSessionFactory class, since factories are
no longer necessarily associated with exactly
one port number.
* The final argument to the CreateAcceptingSocket()
function in NetworkUtilityFunctions.h was documented
incorrectly. It lets you specify the IP address of
a local interface, not a client\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s IP address.
* The final argument to the SetPort() function in
AcceptSocketsThread.h was documented incorrectly.
It lets you specify the IP address of a local interface,
not a client\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s IP address.
* Fixed a bug in ReflectServer\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s ReflectSessionFactory
design that caused muscled not to work correctly if
you told it to listen to more than one port at once.
* Added an #ifdef to NetworkUtilityFunctions.cpp so
that it will compile cleanly on BeOS/R5.0.3
* HashtableIterator::GetValue() was returning a const
reference. Changed it to return a non-const reference,
since there\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s no reason why you shouldn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t be able to
modify the returned object.
* Fixed a bug where calling PutAcceptFactory() with
the port argument set to zero would cause all already
attached accept-factories to be removed.
* Fixed a minor bug in the ReflectServer event loop,
where the fd_sets would be inspected after select()
returned -1/EINTR. This could cause spurious
(albeit generally harmless) read-ready or
write-ready events to be detected.
* The assignment operator, equality operator,
ContainsValue(), and the batch Put() and Remove()
methods in the Hashtable class now specify the
HTIT_FLAG_NOREGISTER flag in their HashtableIterator
objects, for better thread safety.

Intel Version - requires R5   (1.6 MB) 34 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.6 MB) 22 downloads
  Working Link Download LCS Canada

Version 3.33
 License:   BSD/MIT
 Updated:   June 6, 2007
 Source:   Source Included
v3.33 Released 6/6/2007
- Added a MultiDataIO class, for convenient writing of
mirrored files, etc.
- Added a qtsupport/QMuscleSupport.h header file to
contain Qt-specific utility/helper code. Currently
this file contains only a QString specialization of
the HashFunctor template, to allow QStrings to be
used as keys in a Hashtable.
* SetupSystem.cpp builds again under BeOS (worked around
BeOS\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s non-standard gmtime_r() call)
* Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s patch to the Java client code
to fix a bug where partially received Messages might
get dropped, causing a TCP disconnect.
* Added a loop around the Unix implementation of
SharedMemory::AdjustSemaphore()\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s call to semop(),
so that if semop returns EINTR, the call is retried.


Intel Version - requires R5   (1.6 MB) 47 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.6 MB) 20 downloads
  Working Link Download LCS Canada

Version 3.32
 License:   BSD/MIT
 Updated:   May 2, 2007
 Source:   Source Included
v3.32 Release 5/2/2007
- Added a new class, SharedFilterSessionFactory, which looks
at the contents of a shared memory region to decide which
client IP address(es) to allow to connect to the server.
- Added a IsIPAddress(const char *) convenience method
to NetworkUtilityFunctions.{cpp,h}. This method returns true
iff its argument is a string representing an IP address
in human-readable ASCII format.
- Added a new function GetNetworkInterfaceInfos() to
NetworkUtilityFunctions.{cpp,h}. This function returns
a list of NetworkInterfaceInfo objects describing the
various network interfaces currently available on the
host machine.
- tests/testnetutil.cpp Now tests GetNetworkInterfaceInfos()
by calling it and printing out the results.
- Added a new argument (emitEndMessageBatchIfNecessary)
to the QMessageTransceiverHandler::Reset() and
QMessageTransceiverThread::UnregisterHandler() methods, so
that if these methods are called while in the middle of a
receiving-Messages batch, the un-registering of the handler
will no longer cause an imbalance between the number of
BeginMessageBatch() and EndMessageBatch() signals that
get emitted by the handler. (You can override this behavior
by passing in false for the new argument)
- The muscle/java/build.xml file now builds JavaDocs too.
o AbstractReflectSession::GetHostName() now returns a
(const String &) instead of a (const char *).
* Fixed a bug in SharedMemory::DeleteArea() that was
preventing the shared memory area\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s semaphore from
being deleted.
* Rewrote the linked-list handling code in the
QMessageTransceiverThread class to use a doubly-linked-list.
This fixes a bug where the previous singly-linked-list
would occasionally not get updated properly, resulting
in the failure to emit EndMessageBatch signals in some
circumstances.
* The GlobalMemoryAllocator class now calls AboutToFree()
if AboutToAllocate() succeeded but malloc() or realloc()
failed. That way AboutToFree() can undo AboutToAllocate()\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s
side effects in the usual fashion.
* The SharedUsageLimitProxyMemoryAllocator class would
deduct a buffer\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s memory size from the tally twice in
the event of a memory failure. Fixed.
* The SharedUsageLimitProxyMemoryAllocator class now detects
when a program tries to reduce its memory usage counter to
less than zero, and clamps the counter to zero instead of
letting it wrap around to the 4 gigabyte range.
* The GlobalMemoryAllocator class now calls SetAllocationHasFailed()
on the MemoryAllocator object only if the second try to
allocate memory has also failed. That way, if the first try
fails, but the MemoryAllocator\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s AllocationFailed() method
is able to free up some space to make the second try succeed,
program operation can proceed without any further disruption.
* ProxyMemoryAllocator::AllocationFailed() no longer calls
SetAllocationHasFailed(true) on its slave allocator.
That call is to be made solely by
ProxyMemoryAllocator::SetAllocationHasFailed(), instead.
* AutoCleanupProxyMemoryAllocator::AllocationFailed() now
calls up to its parent class as well as doing its regular
OutOfMemory() callbacks.
* Cleaned up the JavaDoc comments so that they now build
without any warnings from the javadoc utility.
* The POSIX implementation of GetCurrentTime64() wasn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t
handling Daylight Savings Time properly, which meant its
result would be off by an hour for part of the year. Fixed.
* Changed some calls to gmtime() and localtime() to gmtime_r()
and localtime_r() respectively, to make them thread-safe.

Intel Version - requires R5   (1.6 MB) 58 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.6 MB) 20 downloads
  Working Link Download LCS Canada

Version 3.31
 License:   BSD/MIT
 Updated:   March 15, 2007
 Source:   Source Included
v3.31 Released 3/14/2007
- The AtomicCounter API is now aware of Qt 4s atomic
counter API, and will use that as its implementation in
Qt-enabled programs compiled on systems where MUSCLEs
own inline-assembly support isnt available.
- hexterm will now send ASCII bytes if you prefix them
with a slash (e.g. /0 /1 /2 sends 0x30, 0x31, 0x32)
- Added a Hashtable::IndexOfValue() function that lets you
find the index of the first (or last) value of a given
type in a Hashtable. (with O(N) search time)
- Added implementations of the GetByteBufferFromPool() and
GetMessageFromPool() functions that take a user-specified
ObjectPool instead of using a default object pool.
- Added support for a new compiler flag, MUSCLE_64_BIT_PLATFORM,
which can be defined in your Makefile if you are on a 64-bit
platform that isnt autodetected inside of MuscleSupport.
- Added INT32_FORMAT_SPEC and UINT32_FORMAT_SPEC macros so
that printf() statements can be made less architecture-specific.
- Added a section to the tests/testtypdefs.cpp test that checks
to make sure the *_FORMAT_SPEC macros are working correctly on
the current platform.
- DataNode::GetChildIterator() now takes an optional flags parameter
that is passed on to the HashtableIterator constructor.
- Added a DataNode::HasChildren() convenience method.
o Made the String classs destructor inline.
* SetupSystem.cpp wouldnt compile on 64-bit systems when
using Mutexes to implement atomic operations. Fixed.
* Merged in Lior Okmans patch to the Java client code that
sets the sockets send and receive buffers to 128KB.
* Merged in Lior Okmans patch to the Java client code to
fix an occasional busy-loop that could occur when
receiving very large (>400KB) Message objects.
* Merged in Nathan Whitehorns patch to the FreeBSD
#ifdefs in NetworkUtilityFunctions.cpp.
* Fixed a bug in MemMem() that where an incorrect return
value would be returned when both buffers were the same size.
* Fixed a bug in RawQueryFilter::SetFromArchive() that could
cause a crash.
* Some of muscles text output would be wrong on 64-bit
platforms. Fixed by changing all printf()s to use the new
INT32_FORMAT_SPEC and UINT32_FORMAT_SPEC macros when appropriate.
* Fixed a bug in the Makefiles so that g++ now compiles all code
with all warnings enabled (except the multi-char constants warning).
* Went through the test files and fixed the minor problems that
were causing them to generate compiler warnings with -Wall enabled.
* hexterm now prints out an error message when it aborts due to
an invalid return code from Read() or Write().


Intel Version - requires R5   (1.52 MB) 50 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.53 MB) 23 downloads
  Working Link Download LCS Canada

Version 3.30
 License:   BSD/MIT
 Updated:   January 16, 2007
 Source:   Source Included
v3.30 Released 1/16/2007
***NOTE*** In this release, the byte-swapping functions for
floating point and double-precision floating point operations
have been renamed. If your code handles floating-point byte
swapping itself, you will need to update your code before it
will compile. See the FLOAT_TROUBLE and DOUBLE_TROUBLE comments
in support/MuscleSupport.h for details about this issue.
- Added a QMessageTransceiverHandler helper class to
QMessageTransceiverThread.{cpp,h}. This class handles the
multiplexing and demultiplexing of multiple session objects inside
a single QMessageTransceiverThread object, so that Qt-based programs
that use a N:1 session-to-thread model will be easier to write
and maintain.
- Added a QMessageTransceiverThreadPool helper class to
QMessageTransceiverThread.{cpp,h}. This class manages the automatic
creation of QMessageTransceiverThreads when QMessageTransceiverHandlers
are set up, so that an N:1 session-to-thread model can be implemented
automatically in Qt-based programs.
- Rewrote hexterm\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s output routine to be more useful; it now outputs
both ASCII and hex data, in a format similar to that used by od.
- Added chatclient.cpp to the tests folder. chatclient.cpp is a
simple command-line BeShare compatible chat client (previously
distributed separately as \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"Clyde\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\")
- Added a minichatclient.c to the tests folder. minichatclient.c
is a C-only implementation of chatclient.cpp, just to show how
it can be done using only the MiniMessage and MiniMessageGateway APIs.
- Added a MemMem() function to MiscUtilityFunctions.{cpp,h}. MemMem()
is similar to strstr(), except that instead of operating on
NUL-terminated strings, it operates on binary data.
- Rewrote the PulseNode class to be more efficient when many children
are present -- PulseNode now stores its children in ordered linked
lists rather than in a Hashtable, and it no longer needs to iterate
over all children in order to recalculate the next event time.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s enhancement to the Java API:
StringBuffer is now used in toString() methods, instead of
concatenating strings directly.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s enhancement to the Java API:
Faster ByteBuffer operations are now used to fill in arrays,
instead of looping over the arrays and manually setting the values.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s enhancement to the Java API:
Use List instead of Vector and HashMap instead of HashTable. This is
to lose the extra unneeded synchronization point that exists in these
old and deprecated (as of Java 1.2) classes. Since ByteBuffer requires
at least JDK 1.4 anyway, there is no need to use the older API.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s enhancement to the Java API:
Use Iterator instead of Enumeration - same reason as above.
Note that this change will break compatibility with old Java
code that calls Message.fieldNames() -- it will need to be
updated to use an Iterator instead of an Enumeration.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s enhancement to the Java API:
Changed the implementation of Queue.removeAllElements() to a
more efficient implementation.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s enhancement to the Java API:
Modified the ThreadPool to use a ThreadGroup and provide thread names.
This makes the class more profiler-friendly.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s enhancement to the Java API:
Message.flatten() is faster now, because it doesn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t call
flattenedSize() as much anymore.
- Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s patch that adds a setOutgoingEncoding()
method to the Java IOGateway classes, so that you can change
message encodings on the fly.
- Made the IOGateway _outgoingEncoding variable private:
use setOutgoingEncoding() and getOutgoingEncoding() to access it.
- Merged in Nathan Whitehorn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s patch to make FinalizeAsyncConnect()
work properly under FreeBSD 7.
- Merged in Nathan Whitehorn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s patch to fix a bug in SSLSocketDataIO
(previously, it could sometimes error out if the message length
exceeded the network\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s MTU)
- Rewrote the B_SWAP_* macros as C-compatible inline functions
(previously they called the muscleSwapBytes() template function,
which made them unusable in C programs)
- Added the new replacement floating-point byte-swap API to
support/MuscleSupport.h, including the following new functions:
B_HOST_TO_BENDIAN_IFLOAT B_BENDIAN_TO_HOST_IFLOAT
B_HOST_TO_LENDIAN_IFLOAT B_LENDIAN_TO_HOST_IFLOAT
B_HOST_TO_BENDIAN_IDOUBLE B_BENDIAN_TO_HOST_IDOUBLE
B_HOST_TO_LENDIAN_IDOUBLE B_LENDIAN_TO_HOST_IDOUBLE
- Added a -DMUSCLE_AVOID_INLINE_ASSEMBLY flag that you can set if
you want to avoid the use of inline assembly for some reason.
- Changed the ConvertFromNetworkByteOrder() and ConvertToNetworkByteOrder()
private virtual methods in the Message::PrimitiveDataTypeArray private
class by changing them to operate on N items at once, instead of having
to be called repeatedly for each item in an array.
- PointerDataArray::ConvertFromNetworkByteOrder() and
ConvertToNetworkByteOrder() now cause an assertion failure if called
(because they should never be called: pointers aren\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t serializable)
- Added a set of common comparison functions (Int8CompareFunc,
Int16CompareFunc, Int32CompareFunc, Uint8CompareFunc, etc)
to MuscleSupport.h because I was tired of reimplementing them
separately every time I needed to sort a Queue or a Hashtable.
- support/MuscleSupport.h now defines a new preprocessor constant,
SELECT_ON_FILE_DESCRIPTORS_NOT_AVAILABLE, when compiled on an OS
that doesn\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t know how to select on file descriptor (e.g. stdin).
Currently that includes Win32 and BeOS.
o Removed the GetChildren() and GetPulseChildrenIterator() methods
from the PulseNode class, since they are no longer applicable.
o Separated the single-argument Hashtable and Queue constructors into
two separate constructors: a zero-argument default constructor, and
a single-item constructor tagged \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"explicit\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\". That way nonsensical
conversions (e.g. myHashtable.Put(5)) get caught at compile-time
rather than becoming hard-to-discover run-time errors.
o Rewrote muscleSwapBytes() to use a union instead of pointer-magic.
o The Java IOGateway classes are once again declared public instead
of being package-private -- that way you don\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t have to use the
MessageIOGatewayFactory class if you don\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t want to.
o MakePrettyTypeCodeString() is now implemented as an inline function
instead of a preprocessor macro.
* Merged in Lior Okman\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s fix for the flattenMessage() methods
in the MessageIOGateway classes, to make them work reliably
with non-blocking sockets.
* Fixed a bug in MessageTransceiverThread.cpp that would cause
many of the commands sent to the internal thread to be received
by all of the internal thread\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s sessions instead of just the
intended target.
* Fixed some bugs in testendian.cpp, and made its output prettier
and more informative.
* Removed the following functions from MuscleSupport.h:
B_SWAP_FLOAT B_SWAP_DOUBLE
B_HOST_TO_LENDIAN_FLOAT B_HOST_TO_BENDIAN_FLOAT
B_HOST_TO_LENDIAN_DOUBLE B_HOST_TO_BENDIAN_DOUBLE
B_LENDIAN_TO_HOST_FLOAT B_BENDIAN_TO_HOST_FLOAT
B_LENDIAN_TO_HOST_DOUBLE B_BENDIAN_TO_HOST_DOUBLE
Because they cannot be made to work reliably on x86-architecture
chips. (See the FLOAT_TROUBLE and DOUBLE_TROUBLE comments in
support/MuscleSupport.h for details)
* Message.py\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'s unit test now correctly reads and writes its file
in binary mode. Thanks to David Rene for reporting this bug.


Intel Version - requires R5   (1.53 MB) 77 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.53 MB) 31 downloads
  Working Link Download LCS Canada

Version 3.24
 License:   BSD/MIT
 Updated:   November 29, 2006
 Source:   Source Included
v3.24 Released 11/28/2006
- The MacOS/X implementation of GetRunTime64() is now implemented
using the CoreServices UpTime() function instead of POSIX times(),
which makes it more efficient, allows it to return more accurate
values, and avoids some potential problems with wrapping.
- Added GetKey() and GetValue() convenience methods to the
HashtableIterator class.
- Added -- and ++ operators to the HashtableIterator class.
- Added SetBackwards() and IsBackwards() methods to the
HashtableIterator class.
- Added a GetFlags() method to HashtableIterator class.
- Added a new MessageFieldNameIterator constructor that takes
a Message object. This is more efficient than calling
msg.GetFieldNameIterator() and requires less typing.
- Added ++ and -- operators to the MessageFieldNameIterator class.
- Added a GetFieldName() method to the MessageFieldNameIterator class.
- Each DataNode object now keeps a running maximum of the IDs in
the child nodes that are attached to it. You can access this
running maximum via the new GetMaxKnownChildIDHint() method.
This value can be useful when generating a unique name for
a new child node.
- Also added a SetMaxKnownChildIDHint() method to the DataNode
class. This lets you manually reset the hint if you need to.
- Updated tests/testhashtable.cpp so that it now tests for the
HashtableIterator bug described below.
- The MessageReplaceFunc callback used by CloneDataNodeSubtree()
now takes a node-path as its first argument, in addition to the
other arguments it took before.
- The Python error strings generated by the ConvertMessageToPyObject()
in PythonUtilityFunctions.cpp are now a bit more informative (they
contain the problematic field name and/or type code)
o Reduced the default output-stall timeout from 20 minutes
to 3 minutes.
o Removed the () operator from the MessageFieldNameIterator class
because it was inconsistent with the operators of other iterator
classes, and rarely (never?) used anyway.
o Updated the copyright notices to 2007 Meyer Sound Laboratories Inc
(a.k.a. the new owners of what was Level Control Systems)
* The output-stall-detector mechanism would not disconnect
moribund clients in a timely manner if the server was
completely idle. Now it does.
* Fixed a subtle bug in the HashtableIterator class that could
cause the iterator to skip past the 2nd item in a traversal
if the 1st item in the traversal was deleted at the wrong time.
* Updated the portablereflectclient.cpp and portableplaintextclient.cpp
example programs to include a hack-around for Win32's inability
to select() on stdin.


Intel Version - requires R5   (1.5 MB) 76 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 23 downloads
  Working Link Download LCS Canada

Version 3.23
 License:   BSD/MIT
 Updated:   September 16, 2006
 Source:   Source Included
v3.23 Released 9/15/2006
- Added Nathan Whitehorn's SSLSocketDataIO class to the dataio
subfolder. This class can be used to layer MUSCLE traffic over
an SSL connection. Thanks Nathan! Note that this code requires
the OpenSSL developer's toolkit to be installed before it will
compile.
- Enhanced the ParseArgs() routine to handle spaces intelligently
(e.g. "x = 5" is now equivalent to declaring a key "x" with value
"5", not declaring three separate variables named "x", "=", and "5")
- Added Put() and Remove() methods to the Hashtable class that
can put or remove the contents of an entire Hashtable at once.
- Added NybbleizeString() and DenybblizeString() convenience functions
to the MiscUtilityFunctions API.
- Added a MUSCLE_USE_QUERYPERFORMANCEHARDWARE compile-time flag that
tells MUSCLE to use QueryPerformanceCounter() under Windows instead
of timeGetTime(). Specifying this flag improves GetRunTime64()'s
accuracy, but QueryPerformanceCounter() is known to have problems on
certain PC systems.
* Fixed the Win32 and POSIX implementations of GetRunTime64() so that
when the underlying OS clock "wraps" around to zero, it is detected
and transparently handled so that the values returned by GetRunTime64()
continue to increase monotonically.
* Fixed the vc++/muscle.dsp project file so that things link properly
again (thanks to Maurizio for help with this)
* Added several tweaks to compile properly under MS Visual Studio 2005.
* Made sure the files in the vc++ subfolder have Windows line endings.
* Fixed a couple of bugs in the String class -- empty strings that
had extra space preallocated in them could end up with unitialized
garbage in them.
* MuscleSupport.h now #defines WIN32 if _MSC_VER is defined.
* Updated the QMessageTransceiverThread and QAcceptSocketThread
classes further, so that they compile under Qt4 even when Qt3
compatibility support is disabled.
* Fixed a problem under Win32, where GetSystemPath() would return an
incorrectly formed path when unicode characters were present in the
path name.


Intel Version - requires R5   (1.5 MB) 53 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 28 downloads
  Working Link Download LCS Canada

Version 3.22
 License:   BSD/MIT
 Updated:   July 6, 2006
 Source:   Source Included
v3.22 Released 7/5/2006
- Updated the Mutex, Thread, and QMessageTransceiverThread classes so
that they are compatible with both Qt3 and Qt4.
- Added a Python implementation of the zlib/ZLibUtilityFunctions.{cpp,h}
API. It is in python/ZLibUtilityFunctions.py
* Fixed a valgrind hit in the Linux implementation of GetSystemPath()
* Commented out the buggy-QueryPerformanceCounter() warning under Win32,
since it usually causes more confusion than enlightenment when it
is printed.
* Changed the custom-event codes in QMessageTransceiverThread.cpp
and QAcceptSocketsThread.cpp to be in the allowed range for user-codes.
* Added Lior Okman and Rony Gutherz' patches to re-enable compilation
on 64-bit systems, Solaris, MSVC, and Windows 2000.
* Added Mika Lindqvist's patch to allow use of the newnothrow macro
under VC++6.
* Updated the Makefile in the borland subdirectory to compile correctly.


Intel Version - requires R5   (1.5 MB) 57 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 19 downloads
  Working Link Download LCS Canada

Version 3.21
 License:   BSD/MIT
 Updated:   May 28, 2006
 Source:   Source Included
v3.21 Released 5/27/2006
- Added SYSTEM_PATH_USERHOME, SYSTEM_PATH_DESKTOP, and
SYSTEM_PATH_DOCUMENTS, and SYSTEM_PATH_ROOT to the list
of directories returnable by GetSystemPath().
- GetHostByName() now requires a second argument, (expandLocalhost),
which determines whether 127.0.0.1 should be returned verbatim, or
expanded out to the primary local IP address.
- Added an (expandLocalhost) argument to the various AddNewConnectSession()
methods that take a string for a hostname argument.
- Added an (expandLocalhost) argument to the GetPeerIPAddress() function.
- Added a RemoveEscapeChars() utility function to StringMatcher.{cpp,h}
- Rewrote GetLocalIPAddress() to use the if_nameindex() API if it
is available. If not, it will fall back to the old method of using
gethostname().
- StorageReflectSession::SaveNodeTreeToMessage() and
StorageReflectSession::RestoreNodeTreeFromMessage() now both take
an optional (maxDepth) argument which can be used to specify the
maximum depth of the node-subtree to be saved or restored.
- The PR_COMMAND_GETDATATREES Message now has an optional PR_NAME_MAXDEPTH
int32 field: If specified, the returned data trees will be clipped to
the specified maximum depth
- Added a PutAndGet() convenience method to the Hashtable class.
This method puts a new object into the Hashtable, and returns a pointer
to the object in the table.


Intel Version - requires R5   (1.5 MB) 46 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 20 downloads
  Working Link Download LCS Canada

Version 3.20
 License:   BSD/MIT
 Updated:   March 27, 2006
 Source:   Source Included
v3.20 Released 3/20/2006
- Added SetGlobalQueryFilterFactory() and GetGlobalQueryFilterFactory()
calls, so that it is possible for MUSCLE-based servers to install
their own custom QueryFilterFactory objects if desired.
o Moved the DataNode class out into its own file, DataNode.{cpp,h}.
It is no longer an inner class of the StorageReflectSession class.
o All QueryFilter::Matches() methods now take a DataNode pointer
as their second argument. None of the built-in QueryFilter subclasses
use this value, but it is available so that custom QueryFilters can
use DataNode information in their matching decisions if necessary.
o Renamed InstantiateQueryFilter() to CreateQueryFilter(), and
made it a virtual method in the new QueryFilterFactory class,
instead of a global function.
* Added serialization to muscleAlloc()/muscleRealloc()/muscleFree(),
to avoid potential race conditions in multithreaded programs that
have memory-usage-tracking enabled.
* Fixed a bug in the Java receive code that could cause a
parse error and subsequent disconnect if the Message stream
was uncompressed (DEFAULT_MESSAGE_ENCODING) and a large
Message was followed by a small one.
* Fixed a typo in the java/build.xml file.
* Rewrote MusclePowerPCSwapDouble() and MuscleX86SwapDouble()
to use unions instead of C-style casting. Doing it this way
makes them more readable and avoids errors due to uncontrolled
interactions with g++'s optimizer.
* Made the testendian test program a little more robust.

Intel Version - requires R5   (1.49 MB) 80 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.49 MB) 18 downloads
  Working Link Download LCS Canada

Version 3.11
 License:   BSD/MIT
 Updated:   March 2, 2006
 Source:   Source Included
v3.11 Released 3/1/2006
- Added a testsysteminfo.cpp test to the test folder, to test
the functions in the SystemInfo.{cpp,h} files.
- Merged in Lior Okman's updates to the muscle Java classes so that
they now support the new, more efficient java.nio.* interfaces.
Note that this means that the Java API now requires Java 1.4.2
or higher; let me know if that is a problem for you.
- Added zlib/ZipFileUtilityFunctions.{cpp,h}, which contain functions
that create a .zip file from a MUSCLE Message, and vice versa.
Also added a testzip.cpp program to the test folder to test them.
- Added a more convenient Inet_NtoA(uint32) function (that returns
a String) to MiscUtilityFunctions.{cpp,h}
o Optimized TCPSocketDataIO::FlushOutput() slightly under Linux.
* Merged in Lior Okman's AMD-64 compatibility patch.
* Patched NetworkUtilityFunctions.cpp to handle net_length_t
properly under *BSD.

Intel Version - requires R5   (1.48 MB) 52 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.48 MB) 12 downloads
  Working Link Download LCS Canada

Version 3.10
 License:   BSD/MIT
 Updated:   January 16, 2006
 Source:   Source Included
v3.10 Released 1/16/2006
- Added the JCraft JZLib code to the included Java code tree, so that
the MUSCLE Java code can again be compiled as provided.
- Added a hashCode() method to the Java com.lcs.muscle.support.Point class.
- Added NybbleizeData() and DenybbleizeData() convenience functions
to MiscUtilityFunctions.{cpp,h}.
- Added GetFirstKey(), GetFirstValue(), GetLastKey(), and GetLastValue()
utility methods to the Hashtable class.
- Added a HTIT_FLAG_NOREGISTER flag to the HashtableIterator class
that (when specified) will prevent the HashtableIterator from registering
itself with the Hashtable. This option allows you to do a 100%
thread-safe Hashtable iteration, at the expense of requiring you to
guarantee that the Hashtable won't be modified during the traversal.
- Added a HasItems() convenience method to the Queue and Hashtable classes.
This method returns true iff there is at least one item present in
the object (i.e. it is the logical negation of the IsEmpty() method)
- Added a HasNames() convenience method to the Message class. This method
returns true if the Message contains any fields.
o Removed the Flattenable::CopyToImplementation() methods since they were
redundant. Instead, CopyTo() just calls CopyFromImplementation() with
the arguments reversed.
o Replaced the boolean (backwards) argument for HashtableIterators with a
uint32 (flags) argument. Currently supported flags are
HTIT_FLAG_BACKWARDS (same as backwards=true in older versions) and
the new HTIT_FLAG_NOREGISTER (see above for details)
o Inlined some trivial one-liner methods in the Message class, for efficiency.
* Merged in Eli "Scanty" Dayan's portability fixes so that the
code again compiles properly under Solaris. Thanks Scanty!
* const methods in the Message class are now properly thread-safe
(provided the Message object isn't altered by any other threads
during their execution), thanks to the use of the
HTIT_FLAG_NOREGISTER flag.
* The math used in the MUSCLE_POWERPC_TIMEBASE_HZ implementation of
GetRunTime64() would overflow after a week or two of uptime,
causing GetRunTime64() to return incorrect results. Fixed.
* PythonUtilityFunctions.cpp now compiles correctly under MacOS/X Tiger.
* Tweaked MuscleSupport.h so that MacOS/X will properly use the
x86 assembly language functions when running on an Intel-based system.


Intel Version - requires R5   (1.48 MB) 79 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.48 MB) 21 downloads
  Working Link Download LCS Canada

Version 3.03
 License:   BSD/MIT
 Updated:   October 11, 2005
 Source:   Source Included
v3.03 Released 10/10/2005
- Added a GetLocalIPAddress() function to NetworkUtilityFunctions.{cpp,h}.
This function returns the IP address(es) of the machine it is running on.
- Refactored the ThreadWorkerSessionFactory::CreateSession() method out
into two methods: CreateSession() and CreateThreadWorkerSession(). That
way subclasses can override CreateThreadWorkerSession() but still take
advantage of the session-accepted-notification functionality present
in CreateSession().
- MessageTransceiverThread now identifies sessions via their root node
path instead of just their session ID. (e.g. "/192.168.0.5/17", not "17")
- Added David Grossman's -DMUSCLE_PREFER_QT_OVER_WIN32 patch, so that you
can choose at compile time whether Muscle should prefer to use Win32 or
Qt APIs for its threading/synchronization mechanisms.
- Added the 'cvscopy' utility program to the tests folder.
* GetPeerIPAddress() and GetHostByName() now call GetLocalIPAddress() if
necessary to determine the local IP address, rather than returning
127.0.0.1.
* GetSystemPath(SYSTEM_PATH_EXECUTABLE) would break under MacOS/X if
the executable path contained any non-ASCII characters. Fixed.
* GetSystemPath() was broken under Win32 if Unicode support was
enabled. Fixed.
* hexterm now compiles properly under MacOS/X.


Intel Version - requires R5   (1.42 MB) 108 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.42 MB) 22 downloads
  Working Link Download LCS Canada

Version 3.02
 License:   BSD/MIT
 Updated:   September 11, 2005
 Source:   Source Included
v3.02 Released 9/10/2005
- The second argument to Hashtable::GetOrPut() is now optional.
- Merged in Lior Okman's changes to the Java client API: these
included several bug fixes and the added ability to send
compressed Messages. (If you have JZLib in your class path,
you can receive compressed Messages also)
- Added Lior's build.xml file for ant-based compilation and
JAR-packaging of the muscle java API (into the java folder)
- Added FailoverDataIO.{cpp,h} to the support folder. FailoverDataIO
is a class that supports automatic failover across multiple redundant
DataIO streams.
- Connect() now takes an optional timeout argument, for people
who are too impatient to wait for the operating system's standard
TCP connect timeout period to elapse.
- The ParseFile() function in MiscUtilityFunctions.{cpp,h} now supports
hierarchical sub-sections (delimited in the text file with "begin foo"
and "end" tag lines).
- Added testparsefile.cpp to the tests folder.
o Moved the implementations of Inet_AtoN(), Inet_NtoA(),
SetLocalHostIPOverride() and GetLocalHostIPOverride() from
NetworkUtilityFunctions.cpp to SetupSystem.cpp, so that projects
can include MiscUtilityFunctions.cpp without having to also
include NetworkUtilityFunctions.cpp
o Removed the MUSCLE_USE_CLONE support from the Thread class, since it
didn't work properly anyway.
* The Win32 implementation of the Thread class would leak a thread handle
each time the internal Thread terminated. Thanks to Eivind Midtgård
and Raymond Dahlberg for providing the fix!


Intel Version - requires R5   (1.42 MB) 66 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.42 MB) 21 downloads
  Working Link Download LCS Canada

Version 3.01
 License:   BSD/MIT
 Updated:   August 14, 2005
 Source:   Source Included
v3.01 Released 8/13/2005
- Added a "shared" parameter to the BindUDPSocket() function,
to support the simultaneous reception of broadcast UDP packets
by multiple processes on a single computer.
- Updated the included zlib distribution to v1.2.3
- Updated the hexterm app to handle UDP packet I/O (in addition
to the TCP stream and serial device data I/O it could do before)
- Added equality (==) and inequality (!=) operators to the Hashtable class.
* GetSystemPath(SYSTEM_PATH_EXECUTABLE) now returns the proper
path under Linux (it uses the /proc filesystem to figure it out)
* ChildProcessDataIO now uses the constants found in sys/ttydefaults.h
to fill in the termios struct, instead of using hard coded magic numbers.

Intel Version - requires R5   (1.4 MB) 65 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.4 MB) 19 downloads
  Working Link Download LCS Canada

Version 3.00
 License:   BSD/MIT
 Updated:   July 12, 2005
 Source:   Source Included
v3.00 Released 7/12/2005
NOTE: THIS RELEASE BREAKS SOURCE CODE COMPATIBILITY WITH PREVIOUS
RELEASES OF THE MUSCLE API. IF YOU HAVE CODE THAT WAS WRITTEN FOR
PREVIOUS VERSIONS OF MUSCLE, YOU WILL NEED TO MODIFY IT SOMEWHAT
IN ORDER FOR IT TO COMPILE AND RUN PROPERLY. SEE THE TWO ITEMS
MARKED WITH (o) BELOW FOR DETAILS.
- Added Matt Emson's client API for Delphi, in the "delphi"
subdirectory. Thanks, Matt!
- Updated the included zlib distribution to v1.2.2.
- Added StoreTraceValue(), TCHECKPOINT(), SetTraceValuesLocation(),
and associated functions to MuscleSupport.h. These functions can
be useful in tracking down where code is executing at when a
debugger isn't available.
- Added a maxDepth argument to the LogStackTrace() call.
- Added a PrintStackTrace() function to syslog/SysLog.{cpp,h}.
This is similar to LogStackTrace(), but the stack trace
goes directly to stdout instead of going to the log facility.
- Added a "win32client" test/example app to the tests folder.
This app tests/demos the Win32MessageTransceiverThread class.
A VC++ project file (win32client.vcproj) is also included.
- Added a SetSignalHandlingEnabled() method to the ReflectServer
class, to allow servers to exit cleanly when an interrupt
signal is received.
- muscled now accepts an optional "catchsignals" argument that
enables handling of interrupt signals (Control-C) to initiate
a controlled shutdown.
- muscleMax() and muscleMin() can now take up to five arguments,
for convenience.
- If you define the compiler constant MUSCLE_ENABLE_MEMORY_PARANOIA
to an integer value (and also define MUSCLE_ENABLE_MEMORY_TRACKING),
then the muscle memory allocator/deallocator code will add that many
guard values to the front and end of all dynamically allocated
buffers in order to detect bad memory writes. The guard values will
be checked whenever the buffers are freed or resized, to make sure
they haven't been overwritten, and it will also fill all allocated
and freed buffers with special garbage bytes (0x55 and 0x66),
so that it will be more obvious when freed or uninitialized
memory is read. This slows down execution a bit and uses up
extra memory, so it should only be enabled while debugging.
- Added a MemoryParanoiaCheckBuffer() function to
GlobalMemoryAllocator.{cpp,h}. Call this function to manually
validate that an allocated memory buffer hasn't been corrupted.
- All AbstractObjectRecycler objects (i.e. all ObjectPools)
now register themselves in a global linked list, so that
they can be iterated over.
- Added the function GlobalFlushAllCachedObjects() to the
AbstractObjectRecycler class.
- Added a FlushCachedObjects() virtual method to the
AbstractObjectRecycler class. This method is implemented
in the ObjectPool subclasses to call Drain().
- The CompleteSetupSystem destructor now calls
AbstractObjectRecycler::GlobalFlushAllCachedObjects(), so
that all the ObjectPools get flushed before any static objects
start getting destroyed. This helps avoid dangling pointer
problems caused by the undefined ordering of static object
destructor calls.
- Added GetCount() and SetCount() methods to the AtomicCounter
class, since it's occasionally necessary (albeit discouraged)
to get or set the counter's value explicitly.
- Added IsRefPrivate() and EnsureRefIsPrivate() methods to
the Ref class to help facilitate Copy-on-Write semantics.
- Added a FlushInput() method to the PlainTextMessageIOGateway class.
- Added a BUILDOPTIONS.txt file to the muscle folder, to document
the various compile-time flags that muscle uses.
- Added WriteFully() and ReadFully() convenience methods to
the DataIO class. These methods call Write() or Read()
in a loop as necessary to guarantee that the whole buffer
get written.
- Added new convenience methods FlattenToByteBuffer(),
UnflattenFromByteBuffer(), FlattenToDataIO() and
UnflattenFromDataIO() to the Flattenable class, so that you
can now Flatten()/Unflatten() to/from ByteBuffers and
DataIOs with a single call when using blocking I/O.
- Added a GetLength() convenience function to the Flattenable
class, for easy determination of a DataIO's length in bytes.
- Rewrote InflateMessage() and DeflateMessage() so that they
spend less time holding the global muscle lock.
o Changed all Ref arguments to be passed by const reference
instead of by value. Note that this change will break most
current Muscle-using source code -- your source code will
need to be changed to match, in order for the virtual methods
to be overridden properly. To update your code, you should
change all function arguments of type BlahRef to (const BlahRef &).
o Moved the AbstractObjectRecycler pointer out of the Ref class
and into the RefCountable class, and changed it into an
AbstractObjectManager pointer. Removed the recycler
argument from all Ref class methods. This makes the
Ref class a bit simpler and more efficient, but it also
breaks existing source code. To update your code, you
should change all instances of BlahRef(blah, NULL) to
BlahRef(blah), and all instances of BlahRef(blah, NULL, false)
to BlahRef(blah, false).
o Replaced StorageReflectSession::DrainPools() with
AbstractObjectRecycler::GlobalFlushAllCachedObjects(),
which does the same thing but more thoroughly, since
it flushes all ObjectPools and not just a few of them.
o Moved a few overly large inline convenience functions into
SetupSystem.cpp, for faster compilation and smaller binaries.
o InflateMessage() now guarantees that the inflated Message
will have the same 'what' code as the passed-in Message
(the what code of the 'interior' Message is ignored).
* Added a newnothrow_array #define to MuscleSupport.h and
changed all the muscle code to use it instead of
newnothrow when allocating arrays. This macro works
the same as new (nothrow) for arrays, except it works
around a bug in gcc 3.x that could causes crashes on
memory failure.
* ChildProcessDataIO now forces the removal if the SIGHUP
signal handler in the child process, so that any
grandchild processes will be cleaned up when the child
process is killed.
* Improved ChildProcessDataIO handling of restricted
permissions on the /dev/tty* nodes.
* Under Win32, if there were no sockets to select() on, select()
would error out and the server loop would return. Fixed.
* Added paranoia debug code to the MUSCLE_POWERPC_TIMEBASE_HZ
implementation of GetRunTime64(), so that if the time base
registers malfunction the app will crash instead of going
into an infinite loop (which is harder to debug).
* Log() and LogTime() could forget to unlock the global
muscle lock if called re-entrantly. Fixed.
* Fixed a nasty bug in the MUSCLE_POWERPC_TIMEBASE_HZ inline
assembly implementation of GetRunTime64() that would cause
GetRunTime64() to very occasionally go into an infinite loop.


Intel Version   (1.3 MB) 79 downloads
  Working Link Download LCS Canada
PowerPC Version   (1.3 MB) 17 downloads
  Working Link Download LCS Canada

Version 2.65
 License:   BSD/MIT
 Updated:   May 21, 2005
 Source:   Source Included
v2.65 Released 5/20/2005
- Optimized the String class by providing overloaded
implementations of various common methods that take a
(const char *) directly, rather than a (const String &).
This eliminates much of the need for the compiler to
construct and destroy temporary String objects when
using string literals.
- Added StartsWith() and EndsWith() convenience methods
to the Queue class.
o Made about a dozen one-liner String methods into into
inline methods, to reduce CPU overhead in calling them.
* Fixed a bug in the Windows implementation of
ChildProcessDataIO that would cause the child process
to be killed the first time it generated any text to stdout.
* Fixed a problem in GetHumanReadableTimeValues() when
compiling under Windows with pre-WinXP headers. Thanks
to Mika Lindqvist for helping with this fix.
* Added an #ifdef for _SOCKLEN_T to NetworkUtilityFunctions.cpp,
so that net_length_t will be typedef'd properly on systems
that need it.


Intel Version - requires R5   (919 KB) 76 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (919 KB) 31 downloads
  Working Link Download LCS Canada

Version 2.64
 License:   BSD/MIT
 Updated:   April 20, 2005
 Source:   Source Included
v2.64 Released 4/20/2005
- ConvertMessageItemToPyObject() now handles restoring list
objects and dictionary objects.
- testendian.cpp now does a bit more thorough job of testing
the correctness of the byte swapping routines
- Merged in Mika Lindqvist's patch to add inline-assembly
implementations of the byte-swapping and atomic counter
functions for the Win32/Visual C++ build environment.
- Added Equals(char), EqualsIgnoreCase(char), EndsWith(char),
EndsWithIgnoreCase(char), StartsWith(char), and
StartsWithIgnoreCase(char) methods to the String class.
- Added an optional (maxResults) parameter to
ServerComponent::FindMatchingSessions(), and added a
ServerComponent::FindMatchingSession() convenience method.
- MuscleSupport.h now looks for a MUSCLE_FD_SETSIZE compiler
constant; if found, it will use that to force the host's
FD_SETSIZE to a new value (particularly useful under
Windows where FD_SETSIZE is a pitiful 64... just add
-DMUSCLE_FD_SETSIZE=512 to make it more reasonable)
- Added a SetFromGenericUnchecked() method to the Ref class,
for fast/unsafe reference-type conversion.
- Added testtime.cpp to the tests folder, to test MUSCLE's
time/date handling functions.
- GetCurrentTime64(), GetHumanReadableTimeValues(),
ParseHumanReadableTimeString(), and GetHumanReadableTimeString()
now all take a timezone argument that indicates whether the uint64
time value arguments are meant to represent local time or UTC.
These parameters have default values that are set to preserve
the previous behavior, for backward compatibility.
o Moved QMessageTransceiverThread's event handling code
out into a virtual separate method, called
HandleQueuedIncomingEvents().
o Removed "volatile" keyword from the assembly byte-swapping
inline function implementations, since it is not necessary
and impedes optimization.
* Merged in David Grossman's Visual C++ compatibility changes.
* Fixed several bugs in the String class where memcpy() was
being called in situations where memmove() was necessary.


Intel Version - requires R5   (925 KB) 80 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (925 KB) 21 downloads
  Working Link Download LCS Canada

Version 2.63
 License:   BSD/MIT
 Updated:   February 7, 2005
 Source:   Source Included
v2.63 Released 2/6/2005
- muscled now accepts "port=0" as a command line argument.
This argument will cause muscled to choose an available
TCP port to listen for incoming messages on.
- Added a GetHumanReadableTimeValues() function to
MiscUtilityFunctions.{cpp,h}. It's similar to
GetHumanReadableTimeString(), except the results
are returned as separate integers rather than as a String.
- Added an optional "muscleSingleThreadOnly" bool argument to the
ThreadSetupSystem and CompleteSetupSystem constructors. This
flag lets you globally disable all Mutexes and other
MUSCLE thread-safety mechanisms at run time. Useful if you
need to compile your app without the MUSCLE_SINGLE_THREAD_ONLY
compiler flag, but know (sometimes) at runtime that you will
be running the process single-threaded...
- Added a ChildProcessReadyToRun() hook method to the
ChildProcessDataIO class. This method is called from inside
the child process (except under Windows, which can't support it).
- Added a GetSessionSelectSocket() convenience method to the
AbstractReflectSession class.
o ChildProcessDataIO now has a separate LaunchChildProcess()
method, instead of launching the child process from inside
the ChildProcessDataIO constructor.
* Merged in Wilson Yeung's update to the C# client code --
this update fixes an infinite-loop bug and makes flattening
and unflattening of Message objects more efficient.
* NetworkUtilityFunctions.cpp once again compiles under BeOS.
* Incorporated Stephane Petithomme's patch to allow muscle
to compile correctly under SunOS.
* Merged in Monni's patches to GetSystemPath() so that it
handles Windows Unicode paths correctly.
* Replaced the Win32 implementation of GetCurrentTime64()
with a more standard (read: accurate) implementation.
* The Windows implementation of GetHumanReadableTimeValues()
was not quite accurate. Fixed.


Intel Version - requires R5   (915 KB) 106 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (915 KB) 25 downloads
  Working Link Download LCS Canada

Version 2.62
 License:   BSD/MIT
 Updated:   January 1, 2005
 Source:   Source Included
v2.62 Released 1/1/2005
- Added a SetUDPSocketBroadcastEnabled() function to the
NetworkUtilityFunctions API.
- Added a broadcastIP constant declaration to NetworkUtilityFunctions.h
- Updated the "listener" test program to send hex bytes that are
entered on stdin, to make outgoing TCP connections as well as
accepting incoming ones, and to be able to connect to an
RS232 serial port, if desired. Renamed "listener" to "hexterm"
to reflect its expanded functionality.
- Added an AdoptBuffer() method to the ByteBuffer class, so that
you can populate a ByteBuffer with a pre-existing array of bytes,
if you are careful about memory-ownership issues..
- Added a ChildProcessDataIO class, which is useful for spawning
child processes and communicating with them interactively via
their stdin/stdout streams. Works under POSIX, Windows, OS/X, and BeOS.
- Added a RemoveANSISequences() function to MiscUtilityFunctions.{cpp,h}.
This function strips all ANSI escape sequences from a given String.
- Added a testchildprocess.cpp test to the tests folder. This
program is used to make sure ChildProcessDataIO works correctly.
- Added a system/SystemInfo.{cpp,h} support API. These files contain
a GetSystemPath() function (for locating various important directories
on the host system), and a GetOSName() function that returns
the name of the host operating system.
o Adopted Jonas Sundström' simplified Makefile for muscled.
* Updated the dev-c++/muscled.dev file to properly build muscled.exe again.
* The included Python scripts are updated to raise exceptions using
proper Exception objects, rather than old-style bare-string exceptions.
* pythonchat.py now handles exceptions properly.
* SharedMemory regions are now created with full permissions (0777)
instead of just permissions for user and group (0770).
* Worked around a gcc inline-assembly bug in the PowerPC assembly
implementation of GetRunTime64(). (this bug would cause GetRunTime64()
to sometimes return the wrong value if the MUSCLE_POWERPC_TIMEBASE_HZ
compiler constant was defined)
* Added some BeOS-compatibility tweaks to the RS232DataIO class.
(I haven't really tested them to see if they work properly though)

Intel Version - requires R5   (910 KB) 98 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (910 KB) 31 downloads
  Working Link Download LCS Canada

Version 2.61
 License:   BSD/MIT
 Updated:   November 5, 2004
 Source:   Source Included
v2.61 Released 11/04/2004
- Added a CPULoadMeter class to the util subfolder. The CPULoadMeter
class knows how to monitor the amount of CPU being used on your
system. Handy for doing xload style status displays. Implemented
for OS/X, Windows, and Linux only.
- Added Jeff Koftinoff's Win32FileHandleDataIO class to the winsupport
directory.
- Added a "testtypedefs" test to the tests folder. You can run this
program to check that the MUSCLE typedefs (int8, int16, int32, etc)
are correctly defined for your build environment.
- Added SetMaxPoolSize() and GetMaxPoolSize() methods to the
ObjectPool class.
- Added a handy utility named "listener" to the tests folder.
This simple program just listens on a specified port and prints
out (in hexadecimal) the bytes it receives from any connecting
TCP client.
- Added PLOCK() and PUNLOCK() macros to Mutex.h, and a new utility
called deadlockfinder.cpp to the tests subfolder. Together, these
are useful for tracking down potential synchronization deadlocks in
multithreaded programs. See tests/deadlockfinder.cpp for details.
* Added Peter Vorwerk's Tru64-compatibility patches.
* Added Julien Torres' AMD64-compatibility patches.
* Added an #ifdef to Thread.{cpp,h} so that the Thread class will
compile properly with older (pre 3.2) versions of Qt.
* Tweaked the code to again compile properly under BeOS/R5/PPC.
* muscleFree now checks its argument for NULL-ness when memory
tracking is disabled.


Intel Version - requires R5   (916 KB) 116 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (916 KB) 24 downloads
  Working Link Download LCS Canada

Version 2.52
 License:   BSD/MIT
 Updated:   August 14, 2004
 Source:   Source Included
2.52 Released 8/13/04
- Added a GetInternalQThreadPriority() hook to the Qt implementation
of the Thread class. This lets you specify the Thread priority
of MUSCLE Threads launched from Qt programs, if you wish to.
- Added a GetEmptyString() convenience function to the String class.
This function returns a read-only reference to an empty string.
* The Read() and Write() methods of the FileDescriptorDataIO class
now return the correct values when used in blocking I/O mode.
* Fixed a syntax error in Tuple::Replace() (thanks to Mika Lindqvist
for bringing this to my attention).
* Merged in Mika's patch to Message.cpp that fixes the template code
so that it will compile without errors under gcc 3.4.1.
* Rewrote the MuscleX86SwapInt64(), MuscleX86SwapDouble(),
MusclePowerPCSwapInt64() and MusclePowerPCSwapDouble() inline
assembly functions to work around problems with gcc's optimizer.
* ParseArgs() now properly parses arguments with commas in them.
* Integrated Wilson Yeung's fix for a race condition in the C# code.


Intel Version - requires R5   (856 KB) 109 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (856 KB) 25 downloads
  Working Link Download LCS Canada

Version 2.51
 License:   BSD/MIT
 Updated:   June 27, 2004
 Source:   Source Included
2.51 Released 6/27/04
- Wilson Yeung contributed an alpha version of a C# port of the Java
client code (included in the "csharp" subdirectory). Thanks Wilson!
- GetRunTime64() can now use the PowerPC time-base register,
if running on a PowerPC CPU and you have #defined the compiler
constant MUSCLE_POWERPC_TIMEBASE_HZ as the proper update rate.
- Added SetMemoryAllocationStrategy() and GetMemoryAllocationStrategy()
methods to the ByteBuffer class. You can call these to specify an
IMemoryAllocationStrategy object that the ByteBuffer will use to
allocate and free its buffers, instead of calling muscleAlloc() and
muscleFree().
- The PlainTextMessageIOGateway class now has SetFlushPartialIncomingLines()
and GetFlushPartialIncomingLines() methods, to govern whether "orphan"
incoming text without a carriage return should be passed to the owner
immediately, or whether it should be buffered until the carriage return
is read.
- Added in Monni's QNX compatibility patches.
* Calling SetGateway() or SetDataIO() from within a ClientDisconnected()
callback now does the right thing, instead of just immediately
disconnecting the newly installed gateway (or DataIO) object afterwards.

Intel Version - requires R5   (878 KB) 102 downloads
  Working Link Download LCS Canada
  Working Link Download Zelect.com Mirror
PowerPC Version - requires R5   (878 KB) 25 downloads
  Working Link Download LCS Canada
  Working Link Download Zelect.com Mirror

Version 2.50
 License:   BSD/MIT
 Updated:   June 1, 2004
 Source:   Source Included
2.50 Release 6/01/04
- If using gcc on a PowerPC or x86 target, inline assembly will be used
in the B_SWAP_* byte swapping macros, which is more efficient than the
traditional muscleSwapBytes() template function.
* IsRegexToken() now also returns true when passed in any of the
following characters: =^+${}:-
* Removed the kludgy workaround from Mutex.h that simulated a recursive
pthreads Mutex using an int counter, and replaced it with a proper
PTHREAD_MUTEX_RECURSIVE Mutex. Note that the new code requires
a UNIX98 compatible pthreads implementation -- under Linux, you
may need to add -D_GNU_SOURCE to your Makefile in order to use this
code.

Intel Version - requires R5   (824 KB) 94 downloads
  Working Link Download LCS Canada
  Working Link Download Zelect.com Mirror
PowerPC Version - requires R5   (824 KB) 25 downloads
  Working Link Download LCS Canada
  Working Link Download Zelect.com Mirror

Version 2.49
 License:   BSD/MIT
 Updated:   May 8, 2004
 Source:   Source Included
2.49 Released 5/07/04
- The "daemon" keyword now takes an optional argument specifying
where the daemon process's stdout and stderr should be redirected
to. If no argument is specified, /dev/null will be used by default.
- Added support in the Thread class for a MUSCLE_USE_CLONE compile flag.
If specified, this flag tells the Thread class to use Linux's clone()
system call to create new threads, instead of the pthreads API. If
this flag is defined, the method Thread::SetCloneParameters() is
available to specify the child thread's launch flags and stack size.
- Added SwapContents() methods to the Message, ByteBuffer, and Ref classes.
o StorageReflectSession methods SetDataNode(), RemoveDataNodes(), and
InsertOrderedData() are now virtual.
o The (createIfNecessary) argument to SpawnDaemonProcess() and
BecomeDaemonProcess() now defaults to true.
o ServerComponent::IsAttachedToServer() is now public.
* ParseArgs() now handles comment # marks inside quotes properly.
* Fixed a couple of Win32 incompatibilities. Thanks to Monni
for reporting these.
* SysLog.cpp wouldn't compile under BeOS/PPC. Fixed.
* QMessageTransceiverThread::event() is now public and not a slot.
* ByteBuffer::SetNumBytes() wasn't updating number-of-valid-bytes
value correctly when called with retainData=true. Fixed.


Intel Version - requires R5   (841 KB) 94 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (841 KB) 22 downloads
  Working Link Download LCS Canada

Version 2.48
 License:   BSD/MIT
 Updated:   March 18, 2004
 Source:   Source Included
2.48 - Released 3/17/04
- Added a GetGroupSize() accessor method to the
SharedUsageLimitProxyMemoryAllocator class.
- Added ParsePort() and ParseConnectArg() convenience methods to the
MiscUtilityFunctions.{cpp,h} files. These functions let you
easily parse values out of "port" and "hostname:port" arguments.
- Added an IsCallerInternalThread() method to the Thread class.
This method returns true iff it's being called from the internal
Thread itself, or false otherwise.
- Added GetOwnerSocketSet() and GetInternalSocketSet() methods to
the Thread class. These let you customize the blocking behaviour
of GetNextReplyFromInternalThread() and WaitForNextMessageFromOwner(),
respectively.
- Added a ParseArgs() method to MiscUtilityFunctions.{cpp,h}.
This method knows how to parse multiple arguments from a line of text.
o The Thread class now prefers to use the Windows threading API
over Qt threading when, both are available.
* Connect() now logs an appropriate error message if a hostname
lookup fails and logging is enabled.
* Rewrote LogLineCallback::Log() to be more robust (it now calls
vsnprintf() instead of vsprintf() and does proper bounds checking)
* Fixed a problem with Message.py's parsing of 64-bit Message fields.
Thanks to pyCube for reporting this bug!
* Cleaned up miscellaneous errors in the autodoc header comments.


Intel Version - requires R5   (820 KB) 149 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (820 KB) 38 downloads
  Working Link Download LCS Canada

Version 2.47
 License:   BSD/MIT
 Updated:   February 26, 2004
 Source:   Source Included
 (no information provided)

Intel Version - requires R5   (836 KB) 99 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (836 KB) 28 downloads
  Working Link Download LCS Canada

Version 2.46
 License:   BSD/MIT
 Updated:   January 28, 2004
 Source:   Source Included
2.46 - Released 1/27/04
- Added some UDP support: There is now a UDPSocketDataIO class, and the
following new NetworkUtilityFunctions: CreateUDPSocket(), BindUDPSocket(),
SetUDPSocketTarget(), SendDataUDP(), and ReceiveDataUDP().
- Added some advisory timeslicing support to the PulseNode class. Now
any PulseNode subclass can find out when its time-slice started, by
calling GetCycleStartTime(), set a suggested time-slice-limit by calling
SetSuggestedMaximumTimeSlice(), and check to see if that time limit is up
by calling IsSuggestedTimeSliceExpired(). These methods can be used
to help ensure consistent low latency to all clients.
- Added a MathSetupSystem class (included in the CompleteSetupSystem class).
This class disables BorlandC's floating point exceptions, to avoid
crashing when a floating point exception occurs.
- Added callback function arguments to CloneDataNodeSubtree(), to allow
you to easily customize the Message payload of any nodes that it creates.
- Added String::SwapContents() and Queue::SwapContents() methods for
efficient (O(1)) state swapping between objects of these classes.
- Added a HandleStandardDaemonArgs() function to MiscUtilityFunctions.
This function parses command line arguments that are of general use.
- Added a muscleSgn() convenience template function to MuscleSupport.h.
o DisconnectSession() now returns a bool indicating whether or not
the session decided to terminate itself.
o Moved BecomeDaemonProcess() and SpawnDaemonProcess() from
NetworkUtilityFunctions.{cpp,h} to MiscUtilityFunctions.{cpp,h}.
o Rewrote muscledMain() to parse arguments using ParseArgs() and
HandleStandardDaemonArgs(), rather than by looking at argv directly.
o Rewrote Thread::InternalThreadEntry() to be cleaner.
o Rewrote String::Replace() to be much more efficient. Also, it now returns
the number of substring replacements done, rather than an error code.
* Failed asynchronous-connect-attempts instigated by a call to
AddNewConnectSession() were not being detected under Windows. Fixed.
* Calling AbstractReflectSession::Reconnect() from inside the
AbstractReflectSession::ClientConnectionClosed() method now works properly.
* Calling AddNewSession(ref, int) with an AbstractReflectSession that
already had a DataIO object installed would cause the pre-installed
DataIO object to be deleted and replaced. Now the pre-installed
DataIO object is retained, instead.
* SharedMemory::SetArea() with a zero createSize parameter now works
correctly under Windows.

Intel Version - requires R5   (815 KB) 112 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (815 KB) 33 downloads
  Working Link Download LCS Canada

Version 2.45
 License:   BSD/MIT
 Updated:   November 10, 2003
 Source:   Source Included
2.45 - Released 11/10/03
- Added GetNextKeyAndValue() convenience methods to the Hashtable class.
- Added an Atoll() function to MiscUtilityFunctions, to complement
the already included Atoull() function.
- Added a Pad() convenience method to the String class, for easy
padding of a string to a given minimum length.
- Added SetSocketSendBufferSize() and SetSocketReceiveBufferSize()
functions to the NetworkUtilityFunctions function collection.
- Added a ConvertReturnValueToMuscleSemantics() function to MuscleSupport.h,
and modified the various DataIO classes to call this function instead of
each one reimplementing the conversion-logic separately.
- Added QString-style Arg() methods to the String class, so that numeric values
can be inserted into strings in a convenient and relatively safe manner.
o Moved the PreviousOperationWouldBlock() and PreviousOperationWasInterrupted()
functions from NetworkUtilityFunctions.h to MuscleSupport.h, since they
weren't really networking-specific.
o Moved the %llu's and %lli's into MuscleSupport.h constants
INT64_FORMAT_SPEC and UINT64_FORMAT_SPEC, so that they are
defined correctly for different compilers (some expect %Lu instead).
* GetRunTime64() now contains a work-around for a bug in Windows'
QueryPerformanceCounter() function that would cause time to "skip ahead"
under certain motherboard chipsets. See system/SetupSystem.cpp for details.
* Under Windows, GetCurrentTime64() was returning microseconds-since-1601.
Fixed it to return microseconds-since-1970, as documented.
* GetCurrentThreadId() was misspelled in Win32Support.h. Fixed.
* Renamed the SWAP_* macros to B_SWAP_*, for consistency with the
naming convention used in the other macros.
* The FileDescriptorDataIO class now handles EINTR and EWOULDBLOCK
return values appropriately, instead of erroring out.

Intel Version - requires R5   (840 KB) 172 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (840 KB) 37 downloads
  Working Link Download LCS Canada

Version 2.44
 License:   BSD/MIT
 Updated:   September 15, 2003
 Source:   Source Included
2.44 - Released 09/15/03
- The QAcceptSocketsThread and QMessageTransceiverThread constructors
now take optional parent and name arguments, which are passed on to the
QObject constructor.
- The QAcceptSocketsThread and QMessageTransceiverThread destructors
now call ShutdownInternalThread(), so you no lnoger have to call it
yourself if you don't want to.
- Added a setNotifyOutputQueueDrainedTag() method to MessageTransceiver.java,
so that the user thread can be notified when the output queue drains.
Thanks to Bryan Varner for this code.
- Added a Replace() method to the Tuple class.
* Some of the SetFromArchive() calls in MultiQueryFilter and its
subclasses didn't mark their argument as const. Fixed.
* Queue::AddTail(const ItemType *, uint32) was broken. Fixed.
* Removed reference to QEvent::MaxUser from the QMessageTransceiverThread
class, so that it can be compiled against Qt 2.3.
* Replaced calls to QThread::postEvent() with QApplication::postEvent().

Intel Version - requires R5   (801 KB) 172 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (801 KB) 67 downloads
  Working Link Download LCS Canada

Version 2.43
 License:   BSD/MIT
 Updated:   August 19, 2003
 Source:   Source Included
2.43 - Released 08/19/03
- Added an optional (count) argument to String::Append() and
String::Prepend().
- Added a DisconnectSession() method to the AbstractReflectSession class.
Calling this method force-disconnects the session's TCP connection.
- PR_COMMAND_SETDATA now processes multiple sets to the same node in
a single Message.
- Added a (numPreallocSlots) argument to the Queue::EnsureSize() method,
so you can specify how many extra slots to preallocate in the event
of an array reallocation.
- Added SetSignalHandle(), SetSignalValue(), and SetReplyThreadID()
methods to the Win32MessageTransceiverThread class.
* Fixed a bug in Hashtable::Clear() that could cause crashes under
certain circumstances (iterators weren't being unregistered reliably).
* Fixed a bug in the Queue class that was disabling queue-slot-preallocation,
making calls to AddHead() and AddTail() inefficient -- O(N) instead
of amortized O(1). Oops!
* The Win32 implementation of GetHumanReadableTimeString() was returning
date strings 369 years too early. Fixed.


Any Processor - requires R5   (800 KB) 120 downloads
  Working Link Download LCS Canada

Version 2.42
 License:   BSD/MIT
 Updated:   July 16, 2003
 Source:   Source Included
2.42 - Released 7/15/03
o DebugTimer's default minimum-print time is now 1000 (1 millisecond)
o DeflateMessage()'s force parameter now defaults to true.
* Fixed a bug in PathMatcher::MatchesPath() that would cause absolute
paths to not be matched correctly. Thanks to VitViper and Monni for
reporting this bug!
* ReflectServer::GetServerUptime() was broken. Thanks to Monni
for finding this bug!
* The first call to Queue::EnsureSize() no longer does an implicit doubling
of the initial array size, since it's likely that the caller to EnsureSize()
has the best idea of how many slots are needed, and thus shouldn't be
second-guessed.

Intel Version - requires R5   (797 KB) 139 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (797 KB) 43 downloads
  Working Link Download LCS Canada

Version 2.41
 License:   BSD/MIT
 Updated:   June 27, 2003
 Source:   Source Available
2.41 - Released 6/27/03
- Added an sdlsupport folder with Shard's SDLMessageTransceiverThread class
in it. This class interfaces MUSCLE to the SDL game library. Thanks Shard!
- Added a PRINT_CALLS_PER_SECOND macro to TimeUtilityFunctions.h
- Added a PreviousOperationWasInterrupted() function to NetworkUtilityFunctions.h
- ZLibCodec::GetInflatedSize() now takes an optional second argument which
can be used to find out if the given compressed buffer is independent or not.
- Added ZLibUtilities.{cpp,h} to the zlib folder. This file contains
InflateMessage() and DeflateMessage() functions that are handy for
compressing Messages down into a flattened state for efficient storage.
- Added a muscleRealloc() function to GlobalMemoryAllocator.h, to go with
the already existing muscleAlloc() and muscleFree() functions.
- The String and ByteBuffer classes now use muscleRealloc() when
appropriate, to avoid unnecessary data copying while resizing buffers.
- Added a minimum-log-time argument to the DebugTimer class so that
printing of very small time intervals can be suppressed.
- Added a GetNumPreallocatedSlots() accessor method to Hashtable.
- Added GetHumanReadableTimeString() and ParseHumanReadableTimeString()
functions to util/MiscUtilityFunctions.h. These functions convert uint64
time values to ASCII "YYYY/MM/DD HH:MM:SS" strings, and vice versa.
o SetupSystem's constructor is now protected, to make sure nobody declares
a SetupSystem object by itself (they should use CompleteSetupSystem instead)
o Removed the (copyBuffer) argument from the ByteBuffer constructor and
several associated methods, because it was error prone and not
very useful.
* Fixed a crashing bug in Queue.AddHead(const Queue &)
* SharedUsageLimitProxyMemoryAllocator::AllocationFailed() was broken. Fixed.
* String::SetCstr() would store bytes past the NUL terminator of the passed-in
string if (maxLen) was too large. Fixed.
* Made String::Substring() is more efficient, and it now handles
out-of-range values gracefully, instead of throwing an assertion failure.
* The String constructor and SetCstr() took an int32 for (maxLen).
Now they take a uint32 instead.
* Replaced calls to CreateThread() with calls to _beginthreadex() in the
Win32 implementation of the RS232DataIO and Thread APIs.
* The (independent) flag to ZLibCodec::Deflate() wasn't working properly.
Fixed. (The ZLibCodec header format has also changed slightly)


Intel Version - requires R5   (833 KB) 105 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (833 KB) 45 downloads
  Working Link Download LCS Canada

Version 2.40
 License:   BSD/MIT
 Updated:   June 3, 2003
 Source:   Source Included
v2.40 - Released 6/2/03
- MUSCLE is now licensed under the standard BSD Open Source License.
(Previously it used an equivalent but non-standard license)
- Added the optional zlib compression library to the MUSCLE archive.
(Add -DMUSCLE_ZLIB_ENCODING_ENABLED to your Makefile to enable it)
- Added 9 levels of ZLib encodings to the MessageIOGateway class
(MUSCLE_MESSAGE_ENCODING_ZLIB_1, ..., MUSCLE_MESSAGE_ENCODING_ZLIB_9)
- Added QueryFilter objects (regex/QueryFilter.{cpp,h}) to allow queries
to be restricted to include only nodes whose data Messages match
user-specified criteria.
- Rewrote the PathMatcher class and API to support QueryFilter objects.
- Added a PR_NAME_FILTERS keyword that can be added to commands (along
with PR_NAME_KEYS) to restrict results based on a QueryFilter.
- Added a QueryFilterRef parameter to the SendMessageToMatchingSessions(),
FindMatchingSessions(), and RemoveDataNodes() methods of the
StorageReflectSession class.
- Rewrote the MessageIOGateway implementation and protected API to
use ByteBuffers, in order to better support ZLib encoding.
- Added a PR_NAME_REPLY_ENCODING parameter to StorageReflectConstants.
This parameter can be used to tell muscled to compress Messages that
it sends back to your client.
- Added a SetOutgoingMessageEncoding() method to the
MessageTransceiverThread class.
- Added a GetRunTime64() function to TimeUtilityFunctions.h. This
function is similar to GetCurrentTime64(), except it is not synced
to the real-time clock, and thus is guaranteed not to jump around
(e.g. when the user sets the system clock, or during leap-seconds)
GetRunTime64() is now used instead of GetCurrentTime64() where appropriate.
- Added a Reset() method to all the AbstractMessageIOGateway classes,
so that they can be re-used after a disconnect or parse error.
- Merged in Bryan Varner's enhancements to the Java muscle code.
These include a new Preferences wrapper class, and non-exception
throwing get*() methods in Message class. Thanks, Bryan!
- Calls to the installed LogCallbacks are now checked so that
re-entrant calls (read: infinite recursion) cannot occur.
- StorageReflectSession::SendMessageToSessions() and
StorageReflectSession::FindMatchingSessions() now take
a (matchSelf) boolean argument.
- Optimized the Hashtable class to be a bit more efficient.
- Added an AddPathFromString() convenience method to the PathMatcher class.
- Added a muscleVoidPointer convenience typedef to MuscleSupport.h
- Added IsReadyForInput() and HasBytesToOutput() methods to the
AbstractReflectSession class; ReflectServer now calls these,
and the default implementations pass the calls through to the gateway.
- Added a GetOrPut() convenience method to the Hashtable class.
(handy for demand-allocated Hashtable entries)
- ByteBuffers no longer re-allocate their memory buffer when
they are resized smaller.
- Added DebugTimer.{cpp,h} to the utils subfolder. This class
is useful for quick-and-dirty profiling of code execution times.
- Added a GetTimeSliceElapsedTime() method to the ServerComponent
class, so that sessions and factories can see how much time
they have taken so far in their current cycle iteration.
- Added an EnsureSize() method to the Hashtable class, to support
pre-allocating tables (for efficiency).
- Added item-array implementations of AddHead() and AddTail()
to the Queue class.
- Added optional startIndex and numItems arguments to the Queue-arg
implementations of AddHead() and AddTail() in the Queue class.
- Updated the Beginner's Guide HTML to document QueryFilters,
ZLib encoding parameters, and a few other details that had
been left out of it.
o Moved the ByteBufferPool functions from Message.{cpp,h} to
ByteBuffer.{cpp,h}.
o Demoted certain log messages from MUSCLE_LOG_INFO priority
to MUSCLE_LOG_DEBUG priority.
o Adjusted the DECLARE_MUSCLE_TRAVERSAL_CALLBACK macro to make
it more reusable in StorageReflectSession subclasses.
o The ByteBuffer class now refers to its data as an array of uint8's,
rather than using void pointers.
* RateLimitIOSessionPolicy would divide by zero if you
specified a rate limit of zero bytes per second. Fixed.
* RS232DataIO::GetAvailableSerialPortNames() now works correctly
under MacOS/X.
* Fixed a couple of VC++-specific code problems.
* Fixed a bug that was causing Messages sent to a
MessageTransceiverThread to be sent back to the user thread.
* StorageReflectSession::FindMatchingSessions() was broken. Fixed.


Intel Version - requires R5   (800 KB) 128 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (800 KB) 46 downloads
  Working Link Download LCS Canada

Version 2.31
 License:   Other Open Source License
 Updated:   April 14, 2003
 Source:   Source Included
v2.31 - Released 4/14/03
- Rewrote the Hashtable class so that it no longer needs to
allocate HashtableEntries dynamically during hash clashes.
- Added in a remapping layer to the HashtableEntries so that
Hashtable operations can be efficient even when the Hashtable
is full or nearly full. Removed the (loadFactor) argument to
the Hashtable constructor.
- Lowered the Hashtable's default (initialCapacity) to 7.
- Added some new optional parameters to StorageReflectSession's
SetDataNode() and CloneDataNodeSubtree() methods to allow for
more control over how nodes get placed into their parent's index.
- Added muscleAlloc() and muscleFree() calls to the
GlobalMemoryAllocator.h API, for those who like C-style
memory management.
- Added GetArrayPointer() methods to the Queue class. This
enables efficient bulk-manipulation of items in the Queue.
- Added an optional node-name argument to DataNode::InsertOrderedChild().
- Added an optional "releaseDataBuffers" argument to the Clear()
methods of Queue, Hashtable, and Message classes, to force
the immediate release of internally held memory buffers.
- Added GetNumAllocatedItemSlots() method to the Queue class.
- Added a muscleRintf() function to MuscleSupport.h
- Added a Win32MessageTransceiverThread class to the winsupport
folder. This subclass interfaces the MessageTransceiverThread
class to the Win32 event API.
- Added support for MUSCLE_DISABLE_DEBUGGING compile-time
flag to turn all Log(), LogTime(), etc calls into no-ops.
- Added a GetGlobalMuscleLock() function that returns a process-wide
Mutex for simple serialization of Log operations, etc.
- Added an argument for enabling Nagle's algorithm to
CreateConnectedSocketPair(). Defaults to false/disabled.
- Added a GetPosition() method to the DataIO interface and
all subclasses thereof.
* Fixed a bug in RestoreNodeTreeFromMessage() that would
sometimes cause indexed nodes not to be restored.
* Fixed a bug in Queue::EnsureSize(x, true) where sometimes it
_itemCount wouldn't be properly set after a successful call.
* Some of the byte-order-swap macros weren't handling complex
arguments correctly. Added extra parentheses to fix them.
* Added support for a -DMUSCLE_AVOID_NEWNOTHROW flag that will
tell all MUSCLE code to use new instead of new (nothrow).
* Trim() will no longer strip UTF8 chars from the end of a String.
* Fixed a bug in the RateLimitSessionIOPolicy that would cause
rate-limited transfers to occasionally stall. Thanks to
Garjala for all his help in tracking this problem down!
* Sessions that are about to be destroyed now have DoOutput()
called on them, in case they have any last-second data to send.
* Muscle now includes <new> instead of <new.h> to avoid gcc warnings.
* MessageIOGateway::DoInputImplementation() would sometimes hold
on to a large memory buffer instead of freeing it immediately. Fixed.
* muscleAbs() was returning int instead of the templated type. Fixed.

Intel Version - requires R5   (520 KB) 164 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (520 KB) 51 downloads
  Working Link Download LCS Canada

Version 2.30
 License:   Other Open Source License
 Updated:   March 3, 2003
 Source:   Source Included
v2.30 - Released 3/03/03
- Added a SharedMemory class to the system folder. This class
acts as a platform-neutral wrapper API for the host OS's
cross-process-shared-memory-area facilitities.
- Rewrote the MemoryAllocator API to be more flexible.
- ReflectServer's constructor now takes a MemoryAllocator
pointer instead of a UsageLimitProxyMemoryAllocator pointer.
- Added a SharedUsageLimitProxyMemoryAllocator class that
uses a small shared memory area to allow multiple daemon
processes to share a single aggregate memory-usage cap.
- Added a Reconnect() method to the AbstractReflectSession
class. This lets a session that was added with
AddNewConnectSession() restore his connection if it breaks.
- Added a GetSessionDescriptionString() method to the
AbstractReflectSession class, for convenience.
- Added GetAsyncConnectIP() and GetAsyncConnectPort()
methods to AbstractReflectSession, for convenience.
- Added a FindMatchingSessions() method to the
StorageReflectSession class, for convenience.
- GetPathDepth() now handles paths without a leading slash correctly.
- Added SetSocketNaglesAlgorithmEnabled(), ShutdownSocket(),
SendData(), ReceiveData(), and PreviousOperationWouldBlock()
to the NetworkUtilities function collection.
- Added IsBlockingIOEnabled() and IsNaglesAlgorithmEnabled()
accessor methods to the TCPSocketDataIO class.
- Added the AbstractGatewayMessageReceiver interface, and the
QueueGatewayMessageReceiver convenience class.
- Rewrote ReflectServer::ServerProcessLoop() to be slightly
more efficient and fair.
- Added a (void *) misc-utility argument to the
MessageReceivedFromGateway() method, and made it part of
the AbstractGatewayMessageReceiver interface.
- Added testnagle.cpp and testresponse.cpp to the tests folder.
o Inet_NtoA() no longer returns a String object, since that
requires the String class to be linked in to programs that
could otherwise live without it.
o Rewrote the AbstractMessageIOGateway API to be more efficient.
Gateways no longer maintain a Queue of incoming Messages; rather,
whenever they parse a Message they immediately pass it to a
specified AbstractGatewayMessageReceiver object.
o AbstractMessageIOGateway subclasses no longer override DoInput()
and DoOutput() directly. Instead, they should implement/override
DoInputImplementation() and DoOutputImplementation().
o Moved the StringMatcher and StringMatcherQueue singleton
ObjectPools out of the StorageReflectSession class and into
the StringMatcher.cpp and PathMatcher.cpp files, respectively.
They can now be accessed anywhere, via the functions
GetStringMatcherPool() and GetStringMatcherQueuePool().
o PathMatcher no longer accepts pointers to ObjectPools in its
AddPathString() methods -- instead it just always uses
the appropriate singleton ObjectPools.
o Removed the type_code data type; now uint32 is used instead.
o Removed the PulseNode::Tick() method hook, since it turned
out to be unnecessary and encourages bad programming habits.
* ReflectServer's status output is now more informative.
* The ThreadSetupSystem and NetworkSetupSystem classes now
handle multiple nested instantiations gracefully.
* TCPSocketDataIO's Read() and Write() calls would return an
error code for zero-length reads or writes. Fixed.
* PathMatcher::MatchesPath() wasn't giving correct results
for paths with leading slashes. Fixed.
* TCPSocketDataIO::FlushOutput() wasn't working in OS/X. Fixed.

Intel Version - requires R5   (540 KB) 181 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (540 KB) 55 downloads
  Working Link Download LCS Canada

Version 2.25
 License:   Other Open Source License
 Updated:   February 4, 2003
 Source:   Source Included
v2.25 - Released 2/04/03
- Renamed Hashtable::Get() to GetValue() (Get() is preserved
as a synonym for compatibility with existing code)
- Added two Hashtable::GetKey() methods to allow quick lookup
of held key objects.
- Added a PrintStackTrace() function to the SysLog module.
MCRASH() and MASSERT() now call PrintStackTrace() so you
get more debug info when you crash. (Only works under gcc)
- Added a (setNumItems) argument to Queue::EnsureSize(), which
can be handy if you want to add or remove a large number of
default data items at once.
- Updated MessageTransceiver.java with Bryan Varner's changes.
- Hashtable::Sort() now uses Simon Tatham's very efficient
merge-sort algorithm instead of insertion sort.
- Added ToString() and AddToString() methods to the Message class.
- Added a SetCstr() method to the String class.
* binary String operators now return String instead of const String.
* StorageReflectSession::CloneDataNodeSubtree() was not
cloning node indices. Fixed.
* DataNode::InsertIndexEntryAt() now uses GetKey() so as not
to have to iterate over the node's child list.


Intel Version - requires R5   (509 KB) 163 downloads
  Working Link Download LCS Canada
  Working Link Download Frankfurt (DE - Europe)
PowerPC Version - requires R5   (509 KB) 56 downloads
  Working Link Download LCS Canada
  Working Link Download Frankfurt (DE - Europe)

Version 2.24
 License:   Other Open Source License
 Updated:   November 16, 2002
 Source:   Source Included
v2.24 - Released 11/15/02
- Added an "oldData" argument to StorageReflectSession's
NotifySubscribersThatNodeChanged() and NodeChanged() methods,
and removed the NodeCreated() and NotifySubscribersOfNewNode()
methods (since they are now redundant).
- Added a "backwards" flag argument to Message::GetFieldNameIterator(),
and added a Message::GetFieldNameIteratorAt() method.
- Added a GetBlankMessage() convenience method to the
StorageReflectSession class. This method returns a reference to
an empty Message.
- Optimized the tree search traversal algorithm so that non-wildcard
patterns do a single hash lookup instead of matching against every
child node.
- Added GetPattern() and IsPatternUnique() methods to the
StringMatcher class.
- StringMatcher::SetPattern and the StringMatcher constructor
now take a (const String &) instead of a (const char *).
- Merged in Bryan's enhancements the the Java classes. The
Jave MUSCLE API now includes better support in the
MessageTransceiver class for listening for incoming TCP
connections, and a way to interrupt() the current Thread
running in a MessageQueue.
- String::Replace() now returns a status_t to indicate whether
any replacements were actually made or not.
* QMessageTransceiverThread was using an illegal event code to
signal the master thread of new network events. Fixed.

Intel Version - requires R5   (509 KB) 251 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (509 KB) 65 downloads
  Working Link Download LCS Canada

Version 2.23
 License:   Other Open Source License
 Updated:   November 2, 2002
 Source:   Source Included
v2.23 - Release 11/01/02
- Added RS232DataIO.{cpp,h} to allow for simple serial port I/O.
Currently it only works under Windows and Linux; support for
other OS's may be added in the future, if there is need for it.
- Exposed the AddPyObjectToMessage() function in the Python
argument-conversion-utilities package.
* Cleaned up the various comparison operators to return bool
instead of int, and the equality-adjustment operators to
return (Class &) instead of (const Class &)
* Tweaked the code to compile cleanly under gcc 3.x.


Intel Version   (500 KB) 140 downloads
  Working Link Download LCS Canada
PowerPC Version   (500 KB) 49 downloads
  Working Link Download LCS Canada

Version 2.22
 License:   Other Open Source License
 Updated:   October 16, 2002
 Source:   Source Included
v2.22 - Release 10/16/02
- Added PR_COMMAND_SETDATATREE, PR_COMMAND_GETDATATREE,
and PR_JETTISON_SUBTREES commands, and a PR_RESULT_DATATREE
reply. These can be used to conveniently get and set
database subtrees.
- MessageGateways now free their scratch buffers if they
are bigger than 10 kilobytes, so as not to waste memory after
having sent or received a very large Message.
* Integrated Monni the Cat's VC++6 compatibility tweaks.
* Fixed a horrendously embarrassing memory leak in muscled.
In fact, ALL of muscled's heap memory allocations were being
leaked, as of v2.18. Sorry guys, that was a really dumb
mistake. :^(

Intel Version - requires R5   (496 KB) 147 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (496 KB) 48 downloads
  Working Link Download LCS Canada

Version 2.21
 License:   Other Open Source License
 Updated:   October 8, 2002
 Source:   Source Included
v2.21 - Released 10/08/02
- Added a muscleAbs() utility template to MuscleSupport.h
- Queue::RemoveItemAt() and Queue::InsertItemAt() have been
optimized a bit -- they should be about twice as fast now.
- Added a GetLogLevelKeyword() function to SysLog.h
- StringMatcher::SetPattern() now looks for an optional tilde
character ('~') at the beginning of simple patterns; if it
finds it, it sets a negate flag so that Match() will return
the logical opposite of what it usually would return.
- Added manual SetNegate() and IsNegate() methods to the
StringMatcher class.
- IsRegexToken() now takes a second argument specifying whether
the character in question is the first in the string (since
there are several characters that are only 'special' when they
are the leading character)
- Database node paths are no longer cached, to save memory.
Instead, GetNodePath() now generates the node-path on the fly,
as needed. Because of this, the function signatures of
GetNodePath() and GetNodeName() have changed.
- Added a handy DataNode::GetPathClause() method that allows
quick access to the node name at a specified depth in
a node's path.
* Queue::GetItemPointer() is now named GetItemAt(). (The old
name is still available, but deprecated).
* The PowerPC assembly implementation of atomic increment and
decrement wasn't being used under OS/X. Fixed.

Intel Version - requires R5   (495 KB) 126 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (495 KB) 49 downloads
  Working Link Download LCS Canada

Version 2.20
 License:   Other Open Source License
 Updated:   September 6, 2002
 Source:   Source Included
v2.20 - Released 9/05/02
- Added a () convenience operator to the MessageFieldNameIterator
class. It operates as a synonym for GetNextFieldNameString().
- Added PythonUtilityFunctions.{cpp,h}, which currently includes
two functions, ConvertMessageItemToPyObject(). and
ParsePythonArgs(). These are useful when embedding Python
and MUSCLE C++ code into the same application.
- Added ParseArg() and ParseFile() methods to MiscUtilityFunctions
.cpp and .h files. These parse an argument (ParseArgs()) style
out of a single string, or a FILE pointer, respectively.
- Added a GetScheduledPulseTime() to the PulseNode class. This
method returns the time at which Pulse() will next be called.
- Added a muscleCompare template that returns -1 if the first arg
is greater than the second, or 0 if they are equal, or else 1.
- Added an Atoull() function to turn an ASCII string into a uint64.
(useful since atoll() and atoull() aren't standard functions)
- Added a SendMessageToMatchingSessions() convenience method to
the StorageReflectSession class.
- Added a dev-c++ subfolder that contains project files suitable
for compiling muscled under Windows' Dev/C++ IDE. (Thanks
to Marcin "Shard" Konicki for supplying these!)
- Added inline x86 assembly atomic-increment and atomic-decrement
code to AtomicCounter.h.
- Added a "remap" argument to muscled, and corresponding accessor
methods to ReflectServer, to support explicit remapping of IP
addresses (e.g. so you can tell muscled to advertise local LAN
machines by their world-accessible IP address)
* AtomicCounter.h no longer relies on the (non-portable)
asm/atomic.h API when compiled under Linux.
* ParseArgs() now parses argv[0] as well as the others.
* BeOS/net_server bone-check in FinalizeAsyncConnection() now uses
be_roster->IsRunning() if possible for more accurate results on
systems where BONE has been installed and then disabled.
* Fixed a bug that would cause an assertion failure if you called
ReverseItemOrdering() on an empty Queue.
* StringMatcher's wildcard-to-regex code was overly complicated
and broken, especially when using the included regex parser (i.e.
under Windows). Rewritten to be simpler and work right.
* When set to a numeric-range pattern like "<0-50>", StringMatcher
now only considers matches on strings that start with a digit.

Intel Version - requires R5   (493 KB) 164 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (493 KB) 55 downloads
  Working Link Download LCS Canada

Version 2.19
 License:   Other Open Source License
 Updated:   July 23, 2002
 Source:   Source Included
v2.19 - Release 7/22/02
- Added a GetPathClauseString() method to PathMatcher.{cpp.h}.
This version returns a String object containing just the one
clause you specified.
* GetPathClause() was not returning NULL on failure. Fixed.
* When presented with an unknown hostname, MessageTransceiverThread
would sometimes try to connect to IP address 0.0.0.0 instead of
failing cleanly. Fixed.
* The NodeCreated() callback would see the newly created node with
an empty Message payload. Now it sees the node complete with the
Message it was created to have.
* The Win32 implementation of Thread::StartInternalThreadAux() wasn't
handling the return value of CreateThread(), which in turn caused
Thread::ShutdownInternalThread() to not work properly. Fixed.
(Thanks to VitViper for detecting this bug!)
* The BeOS/net_server implementation of FinalizeAsyncConnection()
would cause net_server to half-close the connection after 60
seconds if no send or receive activity had occurred by then. Fixed.

Intel Version - requires R5   (496 KB) 196 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (496 KB) 64 downloads
  Working Link Download LCS Canada

Version 2.18
 License:   Other Open Source License
 Updated:   July 4, 2002
 Source:   Source Included
v2.18 - Released 7/4/02
- Removed checks for DISABLE_MUSCLE_MEMORY_TRACKING, and put in
checks for MUSCLE_ENABLE_MEMORY_TRACKING instead. In other words,
memory tracking is now disabled unless the Makefile says otherwise.
The muscled Makefile contains -DMUSCLE_ENABLE_MEMORY_TRACKING, so
memory tracking is enabled by default for muscled.
- Added two GetNumInstancesOf() methods to the String class; these
are handy for counting how many instances of a substring are
present in a String.
- DefaultConsoleLogger now calls fflush() after every call to printf().
- Added a Reverse() method to the String class.
- Added a muscleInRange() function template to MuscleSupport.h
This function tests whether a given value is within a given range.
* The 'maxmem' argument is no longer parsed if muscled was compiled
without -DMUSCLE_ENABLE_MEMORY_TRACKING.
* The '==' operator of the Message class had a bug in which
Messages would sometimes be wrongly reported as equivalent
when they weren't. Fixed.
* Message class now holds its fields using a table of GenericRefs
instead of AbstractDataArrayRefs (to avoid errors under compilers
that don't like creating templates for declared-but-undefined classes)
* The MemoryAllocator class hierarchy has been rewritten so that it
no longer allocates or frees memory directly; rather it is used only
to monitor and/or veto memory requests called in by the new and delete
operators. This makes it work better with the constructors and
destructors of static objects, and fixes a crash-on-exit bug in
muscled.
* Folded in Charlie Buckheit's SGI compatibility changes into the
muscled Makefile, made the Makefile simpler, and added comments.

Intel Version - requires R5   (484 KB) 165 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (484 KB) 62 downloads
  Working Link Download LCS Canada

Version 2.17
 License:   Other Open Source License
 Updated:   June 14, 2002
 Source:   Source Included
v2.17 - Released 6/14/02
- Message class now uses ObjectPools to cache extra AbstractDataArray
objects, to avoid having to dynamically allocate them most of the
time. You can define MUSCLE_DISABLE_MESSAGE_FIELD_POOLS to suppress
this behaviour, if you need to.
- AtomicCounter now uses inline assembly to implement atomic operations
on the PowerPC processor with gcc, and the asm/atomic.h functions when
under Linux/Intel.
- Added '==' and '!=' operators to the Message class.
- Modified Head() and Tail() in the Queue class to return read-only
or read-write references to the head or tail items, instead of
doing return-by-value.
- Added PeekNextFieldNameString() and GetNextFieldNameString() methods
to the MessageFieldNameIterator class. These return a (const String *)
instead of a (const char *), which is sometimes more efficient.
* MessageFieldNameIterator::PeekNextFieldNameString() was broken. Fixed.
* AtomicCounter::AtomicIncrement() and RefCountable::IncrementRefCount()
now return void instead of bool (Linux doesn't support returning bool)

Intel Version - requires R5   (482 KB) 163 downloads
  Working Link Download LCS Canada
  Working Link Download Frankfurt (DE - Europe)
PowerPC Version - requires R5   (482 KB) 66 downloads
  Working Link Download LCS Canada
  Working Link Download Frankfurt (DE - Europe)

Version 2.16
 License:   Other Open Source License
 Updated:   June 6, 2002
 Source:   Source Included
v2.16 - Released 6/5/02
- Added SetNewInputPolicy(), SetNewOutputPolicy(), and
RemoveSessions() methods to the MessageTransceiverThread class.
These methods allow for some on-the-fly control of existing
ThreadWorkerSessions.
- Added comparison operators (less than, greater than, etc)
to the Tuple class template. These do a lexical comparison
using the comparison operators of each sub-element, in sequence.
- syslog/SysLog.h now looks for a MUSCLE_MINIMALIST_LOGGING
preprocessor constant. If found, Log(), LogTime(), and LogFlush()
will be defined as simple in-line pass-throughs to printf().
This allows small programs to use MUSCLE classes without having
to link in all the stuff that the regular logging facility
requires.
- Added GetKeyAt() and IndexOfKey() methods to the Hashtable class.
- Added two Substring() convenience methods to the String class,
that take a String as an argument.
- Added a GetNumInstancesOf() method to the Tuple class.
* To ensure logical correctness, all methods in the Hashtable class
that used to return (Key *) now return (const Key *).
* Folded in VitViper's Visual C++ compatibility fixes.

Intel Version - requires R4.5   (478 KB) 133 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (478 KB) 58 downloads
  Working Link Download LCS Canada

Version 2.15
 License:   Other Open Source License
 Updated:   May 17, 2002
 Source:   Source Included
v2.15 - Released 5/17/02
- The Hashtable class now uses a HashFunctor template argument
to calculate hash codes, instead of a function callback. This
allows for more efficient code, but will break some source
code (sorry!). To fix the souce, you typically just need to
remove the function pointer argument to the Hashtable ctor.
- Broke out the log-line-label-generation code in SysLog.cpp
into its own separate function, GetStandardLogLinePreamble(),
so that it can be accessed independently by other code.
- Changed the Hashtable class's performance parameters to
capacity=11, loadFactor=75%. This should save some memory.
- Added an AfterMessageReceivedFromGateway() callback method
to the AbstractReflectSession class. PushSubscriptionMessages()
is now called by this method, rather than having to be
called manually by the subclasses.
- Added a CallMessageReceivedFromGateway() method to the
AbstractReflectSession class. This method calls both
MessageReceivedFromGateway() and AfterMessageReceivedFromGateway(),
and should be used to 'fake' message reception (instead of
calling the aforementioned methods directly).
- Optimized the PushSubscriptions() method with a dirty-flag.
- Added the muscleCopyIn() and muscleCopyOut() templates to
MuscleSupport.h. These support alignment-safe value copying.
- Added a GetEmptyMessage() utility function to Message.{cpp,h}
- ObjectPool now derives from AbstractObjectManager, which in
turn derives from AbstractObjectGenerator and AbstractObjectRecycler.
This helps me use pools polymorphically.
* The ServerComponent detach/delete sequence is now better defined,
avoiding possible errors that could occur in custom servers.
* A little more OS/X compatibility tweaking.
* Some of the Flatten/Unflatten code would crash on processors
(e.g. MIPS) that required values to be read on written on
word-aligned boundaries. Fixed. (Thanks to Charlie Buckheit
for reporting this bug)
* Fixed a race condition in the Thread class that would cause
the thread's owner to not be signalled correctly in some cases.

Intel Version   (477 KB) 139 downloads
  Working Link Download LCS Canada
PowerPC Version   (477 KB) 61 downloads
  Working Link Download LCS Canada

Version 2.14
 License:   Other Open Source License
 Updated:   May 2, 2002
 Source:   Source Included
v2.14 - Released 5/2/02
* The Python Message implementation now flattens/unflattens
B_INT64_TYPE fields properly even under old (pre 2.2) versions
of Python.
* Bryan Varner found and fixed a bug in the Java Message class;
it wasn't handling the sending and receiving of UTF8 strings
correctly. Thanks Bryan!
* Removed the B_POINTER_TYPE from the Java Message implementation,
since Java doesn't have pointers, and flattening a pointer into
a Message that goes across the network is a silly thing to do
anyway.
* Changed all instances of #include <winsock2.h> to
#include <winsock.h>, since Muscle does not require any
WinSock2-specific features.
* The included fall-back regex library is now Henry Spencer's
public domain implementation, instead of the GPL'd GNU version.
* The Windows version of Thread::StartInternalThread() was broken.
Thanks to VitViper for finding and fixing this bug!

Intel Version   (474 KB) 183 downloads
  Working Link Download LCS Canada
PowerPC Version   (474 KB) 57 downloads
  Working Link Download LCS Canada

Version 2.13
 License:   Other Open Source License
 Updated:   April 26, 2002
 Source:   Source Included
v2.13 - Released 4/26/02
- Added Python support, with Message and MessageTransceiverThread
classes, and pythonchat, a BeShare-compatible command-line
demo chat app. Check out the README.TXT file in the python
subfolder for details.
- Added a readmessage.cpp utility to the tests folder.
- Added |= and &= operators to the Rect class.
- StorageReflectSession methods NodeChanged(), NodeIndexChanged(),
and NodeCreated() are now declared as virtual.
* String::Trim() would crash with an assertion failure on some
systems, due to incorrect handling of unsigned values. Thanks
to Austin M. Brower (a.k.a. bobman) for catching this bug!
* Tweaked the Makefiles and the SetupSystem.cpp file so that they
compile properly under OS/X. (thanks again to Austin for this)
* Fixed some problems that kept muscled from compiling under VC++.
* Added a couple of checks to Message::Unflatten() to keep it from
crashing if given a mangled flattened-Message to parse.

Intel Version - requires R4.5   (467 KB) 146 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (467 KB) 58 downloads
  Working Link Download LCS Canada

Version 2.12
 License:   Other Open Source License
 Updated:   April 4, 2002
 Source:   Source Included
v2.12 - Released 4/4/02
- Added a SetAboutToFlattenCallback() method to the MessageIOGateway
class. This allows you to install a hook that gets called when
a Message is about to be flattened, in which you can modify or
inspect the Message.
- gcc now compiles muscled with the -fno-exceptions flag, resulting
in somewhat more efficient code since muscle doesn't use exceptions
anyway.
- Added a muscleClamp() utility function to MuscleSupport.h.
- Added << and >> operators to the Tuple declaration macros.
- Removed the default/blank member items from the Tuple, Queue,
and Hashtable classes, as I finally found a way to declare them
properly on the stack instead. This should save some memory.
* Snooze64() and GetCurrentTime64() were broken under Windows. Fixed.
* Added a MUSCLE_MAX_OUTPUT_CHUNK #ifdef into ReflectServer.cpp, so
that people with finicky routers can limit their send-chunk sizes
by putting a -D flag into their Makefile if necessary.
o Removed TCPSocketDataIO::PollSocketReadiness(), since it is never
used, encourages polling, and causes warnings under C++Builder5.5.

Intel Version   (444 KB) 179 downloads
  Working Link Download LCS Canada
PowerPC Version   (444 KB) 66 downloads
  Working Link Download Primary Location

Version 2.11
 License:   Other Open Source License
 Updated:   February 27, 2002
 Source:   Source Included
v2.11 - Release 2/28/02
- Added RemoveDataNodes() and DoRemoveData() convenience methods
to the StorageReflectSession API.
- Changed the Thread class to have separate
SetOkayToCloseInternalThreadWakeupSocket() and
SetOkayToCloseOwnerWakeupSocket() methods, instead of passing
in a "release" flag with the Get*WakeupSocket() calls. Also changed
the Thread class to keep the socket values even when they are
considered "released", so that signalling will still work if needed.
* ThreadSupervisorSession::MessageReceivedFromOwner()'s argument list
was missing a parameter, and thus it wasn't getting called. Fixed.

Intel Version   (443 KB) 242 downloads
  Working Link Download LCS Canada
PowerPC Version   (443 KB) 75 downloads
  Working Link Download LCS Canada

Version 2.10
 License:   Other Open Source License
 Updated:   February 7, 2002
 Source:   Source Included
v2.10 - Released 2/7/02
- MUSCLE now supports compilation under Win32 using Borland's
C++Builder 5.5 compiler. (use the Makefile in the 'borland' folder)
- StringMatcher can now (as a special case) do simple integer range
queries of the form "<15-252>", which would match strings.
"15", "16", ..., "252". See StringMatcher::SetPattern() for details.
- Added RemoveFirstInstanceOf() and RemoveLastInstanceOf() methods
to the Queue class.
- Added ByteBuffer and FlatCountable classes to the util folder.
- Added AddFlat(FlatCountableRef), FindFlat(FlatCountableRef), and
friends to the Message class. These allow you to add and retrieve
FlatCountable objects to/from a Message by reference,
so that they aren't actually flattened until the Message itself is.
- Rewrote the Message class to use ByteBufferRefs instead of raw
byte arrays for its flattened objects and raw data buffers.
Note that this changes the semantics of these fields slightly--
copying a Message object will no longer copy the contents of these
fields, but rather the two Messages will now both reference the
same data.
- Pointer fields in Messages are no longer flattened, as the mechanics
of doing so are non-portable (and silly).
- All methods in the Message class now take String references instead
of (const char *)'s for field names.
- Removed all but one of the Message::GetInfo() methods, since they
were redundant and/or inconsistent with the rest of the Message API.
- Moved the "okayToAdd" parameter of the Replace*() methods in the
Message class to the front of the argument list. (It was causing
some nasty problems involving type promotion at its previous position)
- class ObjectPool now derives from an interface class named
AbstractObjectRecycler. Also, the Ref class now holds a pointer to
an AbstractObjectRecycler, rather than to an ObjectPool. This allows
more flexibility when keeping heterogeneous sets of objects referenced.
- Added optional CopyTo() and CopyFrom() methods to the Flattenable class.
These methods support copying one Flattenable object to another in the
most efficient way possible. Per-class optimizations can be implemented
by overriding the CopyToImplementation() and CopyFromImplementation()
virtual methods as desired..
* Default implementation of Flattenable::AllowsTypeCode() now accepts
B_RAW_TYPE as well as TypeCode(), to allow unflattening from untyped data.
* Removed the (char) constructor from the String class, as it was
interfering with proper type checking of arguments.
* Changed all index parameters in the Message class to use uint32
instead of int32 (since negative indices don't make sense).
* MessageTransceiverThread wasn't adding new sessions asynchronously
(i.e. after StartInternalThread() had been called). Fixed.
* MessageTransceiverThread would not deliver a
MTT_EVENT_SESSION_DISCONNECTED message to the user code if an
asynchronous connection to localhost failed. Fixed.
* FinalizeAsyncConnect() was using the wrong test and thus sometimes
thought an asynchronous connection had succeeded when it had in
fact failed. Fixed.
* ConnectAsync() was broken under Windows. Fixed.

Intel Version   (442 KB) 186 downloads
  Working Link Download LCS Canada
PowerPC Version   (442 KB) 68 downloads
  Working Link Download LCS Canada

Version 2.00
 License:   Other Open Source License
 Updated:   January 18, 2002
 Source:   Source Included
v2.00 - Released 1/19/02
- All MUSCLE code is now declared as being in the 'muscle' namespace.
This, plus all the changes listed below, pretty much guarantee that
any source code that compilable with previous versions of MUSCLE won't
compile now, and vice versa; sorry about that. Hopefully everything
that needed changing has been changed by now though, so it shouldn't
happen again (well, not soon anyway ;^)). If you need help updating
your old MUSCLE-using code, let me know.
- muscled now parses a 'maxmessagesize' argument, allowing you to limit the
maximum size of incoming Message objects (so e.g. you don't have to worry
about some joker sending you 100 megabyte Messages, tying up all your RAM)
- muscled now parses 'maxsessions' and 'maxsessionsperhost' keywords to allow
limiting of the number of simultaneous connections, or simultaneous
connections from any given client IP address.
- muscled now accepts a 'localhost' keyword which lets you specify what
the advertised IP address of clients connecting from localhost should be,
instead of (the rather useless) 127.0.0.1.
- muscle now accepts the keywords "maxsendrate", "maxreceiverate", and
"maxcombinedrate" -- these allow you to specify maximum allowed
bandwidth usage (in KB/sec) for sending, receiving, or both.
- muscled now accepts a 'require' keyword on the command line as well
as 'ban', allowing for 'whitelisting' as well as 'blacklisting'.
- admin now parses 'require' and 'unrequire' keywords on the command line.
- Removed the word 'Portable' from all class names that had it; since
muscle is now in its own namespace, a unique prefix is no longer necessary.
- Completely rewrote the MessageTransceiverThread class. Now the
MessageTransceiverThread class is portable code, with optional thin
OS-specific wrapper subclasses available if you wish to use them.
Moreover, MessageTransceiverThread now holds its own ReflectServer
object, which means that it uses the same event loop as the servers
do, and that a single MessageTransceiverThread object can manage multiple
incoming and outgoing connections simultaneously.
BMessageTransceiverThread, QMessageTransceiverThread, and
AMessageTransceiverThread are the wrappers for BeOS, Qt, and AtheOS,
respectively. (MessageTransceiverThread can also be used by itself
if you prefer to stick with threads-and-TCP only)
- Split the accept-tcp-sockets-thread functionality into its own
class, AcceptSocketsThread. There is also a Qt-specific subclass of
of this available, named QAcceptSocketsThread.
- Added a Tuple templated class to the support folder. This class
represents an array of numeric values, and is used to do simple
vector math operations conveniently.
- Point and Rect (nee PortablePoint and PortableRect) are now derived from
Tuple, to avoid code duplication. The formerly public member variables
x, y, left, top, right, and bottom values are now exposed as
inline methods instead (e.g. use x() instead of x).
- Added aggregate bandwidth metering/management capabilities to MUSCLE.
This includes the introduction of a new interface, AbstractSessionIOPolicy,
and a bandwidth-limiter subclass, RateLimitSessionIOPolicy.
- Added a SetMaxIncomingMessageSize() method to the MessageIOGateway class.
- Added a FilterSessionFactory decorator class, that can be used
in conjunction with any other ReflectSessionFactory object to enforce
ban-lists, require-lists, and/or connection limits.
- ReflectSessionFactory and AbstractReflectSession now have a common base
class, named ServerComponent, that provides them with limited access to
their ReflectServer object.
- Added SetLocalHostIPOverride() and GetLocalHostIPOverride() functions
to NetworkUtilityFunctions.h, to set a custom IP address to use instead
of 127.0.0.1 when necessary.
- Added -= and - operators to the String class. (you saw it here first!)
- Added a String constructor and assignment operator for char arg.
- Renamed ObjectPool::GetObject() to ObtainObject() to avoid a naming
conflict with a #define in the MS-Windoze headers. (evil!)
- ObjectPool class is now thread-safe by default (unless you specify
-DMUSCLE_SINGLE_THREAD_ONLY in your build line)
- Added a new subfolder named "system", which contains code for exporting
OS-specified functionality in a platform-independent manner. This folder
currently holds a Mutex class and a Thread class, both of which
wrap the relevant portions of several supported native APIs:
BeOS, AtheOS, pthreads, Qt, and Win32. It also holds the
new MessageTransceiverThread and AcceptSocketsThread classes, since
these are special types of Thread, and the GlobalMemoryAllocator.
- Moved the memory-usage-tracking code out of ReflectServer.cpp and into
its own file, system/GlobalMemoryAllocator.{cpp,h}. Now you can choose
whether or not to link this in to your server.
- Added util/MemoryAllocator.{cpp,h}. These files contain a set of
memory-allocation-handler classes, which can be composed together to
create a custom memory allocation strategy. Included subclasses include
BasicMemoryAllocator, ProxyMemoryAllocator, UsageLimitMemoryAllocator,
and AutoCleanupMemoryAllocator.
- Merged PortableTypeConstants.h, PortableTypeDefs.h, PortableByteOrder.h,
PortableMacros.h, and PortableStatusConstants.h into a single file
called MuscleSupport.h
- Renamed the BeOS and AtheOS conversion routines to ConvertToBMessage(),
ConvertFromBMessage(), ConvertToAMessage(), and ConvertFromAMessage().
- Added a RawDataMessageIOGateway class to the iogateway folder. This
class is handy for reading or writing chunks of unformatted bytes
to/from a socket.
- AbstractMessageIOGateway::DoInput() and DoOutput() now return the number
of bytes that they read/wrote (respectively), or -1 if there was an error.
(Before they returned a status_t). They now take a uint32 argument
instead of a (uint32 &). The argument now indicates the maximum number
of bytes they are allowed to read or write before returning.
- Added an InsertOrderedData() method into StorageReflectSession so
that subclasses can get more info about what gets inserted where.
- Added new methods to the Message class: AddTag(), PrependTag(),
FindTag(), and ReplaceTag(). These let you assign non-persistent,
non-flattenable tag objects to a message that will be automatically
dereferenced when the Message goes away.
- ReflectSessionFactory classes are now in charge of deciding who
gets to connect and who doesn't, rather than the StorageReflectSession
class. This is useful because it means you can specify different
access policies for different ports.
- Removed AbstractReflectSession::GetClientPort() and replaced
it with the (slightly more useful) GetPort() method, which returns
the session's port number on the server side, instead.
- Added AbstractReflectSession::SendMessageToFactory(), and
ReflectSessionFactory::MessageReceivedFromSession(), so that
sessions can send instructions to the factories that created them.
- ReflectSessionFactory::CreateSession() now takes the IP string
of the remote peer, to allow for filtering on IP addresses.
- CreateAcceptingSocket() now takes optional arguments to return the
selected port, and to specify an IP address to only accept from.
- Added ConnectAsync(), FinalizeAsyncConnect(), GetHostByName(),
CloseSocket(), Accept(), and Inet_AtoN() functions into the
NetworkUtilityFunctions toolkit. Also added a version of Connect() that
takes a numeric IP address rather than an ASCII string.
- INet_NtoA() now returns a String instead of writing into a char buffer.
- Added support for sessions that asynchronously connect outwards from
the server: ReflectServer::AddNewConnectSession(),
AbstractReflectSession::AddNewConnectSession(), and
the callback AbstractReflectSession::AsyncConnectCompleted().
- Added SaveNodeTreeToMessage() and RestoreNodeTreeFromMessage()
methods to StorageReflectSession. These allow easy recursive
archiving and restoration of database node subtrees and their indices.
- Made a bunch of formerly protected members of StorageReflectSession
private, and added protected accessors for some of them, where necessary.
- Added sort-by-value capability to the Hashtable class, and rewrote the
auto-sort interface so that there are separate SetKeyCompareFunction(),
SetValueCompareFunction(), and SetCompareCookie() methods, as well as
associated accessor methods.
- Added Message::GetNumValuesInName().
- GetMessageFromPool() now returns a MessageRef instead of a Message *,
to avoid any possibility of a memory leak.
- Added templated convenience functions muscleSwap(), muscleMin(), and
muscleMax() to MuscleSupport.h.
- Added a Shutdown() method to the AbstractMessageIOGateway interface,
and made AbstractMessageIOGateway::GetDataIO() protected.
- Added a GetSelectSocket() method to the DataIO interface. This method
returns the socket fd to select() on for that DataIO (if any).
- Removed AbstractMessageIOGateway::SetEnabled() and IsEnabled(), and
replaced them with the single virtual method IsReadyForInput(), which
function similarly to HasBytesForOutput().
- Consolidated the server-side Pulse logic into a single base class,
PulseNode. ReflectServers, AbstractMessageIOGateways,
ReflectSessionFactories, and AbstractReflectSessions now all inherit from
PulseNode, and thus are all capable of scheduling and receiving Pulse()
calls for themselves.
Also renamed ReschedulePulseTime() to InvalidatePulseTime().
- AbstractDataIOGateway objects no longer take a DataIO pointer in their
constructor arguments; instead, a separate SetDataIO(DataIORef) call
is used to install the DataIO into the gateway.
- Renamed the constant MUSCLE_NEVER_PULSE to MUSCLE_TIME_NEVER (since
it is used in situations other than just Pulse() now).
- Added the constant MUSCLE_NO_LIMIT, which is defined as ((uint32)-1).
- Separated the DataIO creation from the CreateGateway() callback,
making CreateGateway() implementations a bit simpler. Also added
SetGateway() and GetGateway() methods so you can define a custom
gateway for your session "in advance" if you want to.
- Added SetRef(), SetFromGeneric(), and GetGeneric(), conveniences methods
to the Ref class, as well as a Ref constructor that takes a GenericRef.
- Renamed AddLogCallback() to PutLogCallback(), and change the arguments
to take a LogCallbackRef instead of just a pointer.
- Moved the log callback stuff into its own header file, syslog/LogCallback.h
- Modified several APIs that were taking a pointer and an "ownIt" boolean
to take Refs instead. That way the deletion can be handled automagically.
- Removed the InitializeTCPStack() method from NetworkUtilityFunctions and
added instead some SetupSystem classes, including a ThreadSetupSystem,
a NetworkSetupSystem, and a CompleteSetupSystem. Placing one of these
(usually a CompleteSetupSystem) on the stack at the beginning of main()
is now the correct way to handle all environment setup and tear-down.
- Added MiscUtilityFunctions.{cpp,h} files to the util subfolder. These
contain utility functions that don't fit in anywhere else--currently
they contain a ParseArgs() function that parses command line arguments
into a Message object.
- Added the SignalMessageIOGateway class -- a very simple gateway used
primarily as a convenience class for thread synchronization.
- Renamed MessageReceivedFromNeighbor() to MessageReceivedFromSession(),
and renamed BroadcastMessageToNeighbors() to BroadcastMessageToSessions().
- Added MessageReceivedFromFactory() and BroadcastMessageToFactory()
methods to the ServerComponent class and its subclasses.
- Added util/SocketHolder.h, to facilitate leak-proof socket file descriptor
transfers via Message objects.
- merged testreflectclient.cpp and testatheosclient.cpp into a single program,
and got rid of testplaintextclient.cpp
* Renamed Queue::CountItems() to GetNumItems(), and renamed Hashtable::Size()
to GetNumItems(), for clarity and consistency.
* Renamed all methods named MakeEmpty() to Clear(), for consistency.
* functions in the SysLog API are now serialized in order to be thread-safe.
* Removed the UnintrusiveRef class, as it isn't useful enough to keep around.
* Fixed a bug in the PlainTextMessageIOGateway that would sometimes
allow garbage characters into the imported text.
* All TCP port number arguments are now specified as uint16s instead of ints.
* All usages of size_t and ssize_t have been replaced with
uint32 and int32, respectively (since that is more explicit/precise).
* Removed the MUSCLE_CLASS_DECLARATIONS and MUSCLE_FUNCTION_DECLARATIONS
tokens from the headers, since they didn't have a well-defined meaning.
* Certain MUSCLE methods were using a non-standard convention of returning
a boolean value to indicate success or failure. Modified all of the
following methods to return a status_t (B_NO_ERROR or B_ERROR) instead:
HashtableIterator::GetNextKey() HashtableIterator::PeekNextKey()
HashtableIterator::GetNextValue() HashtableIterator::PeekNextValue()
Hashtable::Get Hashtable::Put() Hashtable::Remove Hashtable::RemoveAux()
Hashtable::GrowTable() Hashtable::MoveToFront() Hashtable::MoveToBack()
Hashtable::MoveToBefore() Hashtable::MoveToBehind() Hashtable::Sort()
Queue::AddTail() Queue::AddHead() Queue::RemoveTail() Queue::RemoveHead()
Queue::RemoveItemAt() Queue::GetItemAt() Queue::ReplaceItemAt()
Queue::InsertItemAt() Queue::EnsureSize()
AbstractMessageIOGateway::EnsureBufferSize()
Message::GetNextFieldName() Message::PeekNextFieldName()
StorageReflectSession::DataNode::PutChild()
StorageReflectSession::DataNode::InsertOrderedChild()
StorageReflectSession::DataNode::ReorderChild()
StorageReflectSession::DataNode::RemoveIndexEntry()
StringMatcher::SetPattern() Flattenable::ReadData()

Intel Version   (438 KB) 258 downloads
  Working Link Download LCS Canada
PowerPC Version   (438 KB) 83 downloads
  Working Link Download LCS Canada

Version 1.93
 License:   Other Open Source License
 Updated:   December 6, 2001
 Source:   Source Included
v1.93 - Released 12/05/01
- Added an optional second argument to PortableHashtable::GetIterator(),
that lets you traverse the hashtable's contents backwards.
- Added PortableHashtable::GetIteratorAt(), to allow iterations
that start from any item in the table's traversal list.
- Changed the compare function type for hash tables to return an int
(strcmp() style) rather than a bool (== style), so that it can be used
for sorting as well as comparison. Also added a (void *) cookie parameter
so that the callback can access user-defined context information easily.
- Changed PortableHashtable::SetCompareFunction() to take a second parameter
specifying whether or not the compare function should be used to auto-sort
entries as they are placed into the hash table.
- Added Sort() and Sort(compareFunc) methods to PortableHashtable to allow
in-place traversal order sorting.
- Added the PR_COMMAND_REORDERDATA message type, to let clients reorder their
indices without having to delete and reupload the associated data nodes.

Intel Version - requires R4.5   (385 KB) 204 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (385 KB) 75 downloads
  Working Link Download LCS Canada

Version 1.92
 License:   Other Open Source License
 Updated:   November 23, 2001
 Source:   Source Included
v1.92 - Released 11/23/01
- PortableHashtables now retain the ordering of the items you Put() into them.
(And since PortableMessage uses a PortableHashtable internally, this means
also that PortableMessage now retains the ordering of the data fields you
add to it)
- Added MoveToFront(), MoveToBack(), MoveToBefore(), and MoveToBehind()
methods to the PortableHashtable class. These methods allow the user
to modify the iteration traversal order.
- It is now possible to modify a PortableHashtable in the middle of
traversing its contents with a PortableHashtableIterator, without causing
an assertion failure or even messing up the traversal(!).
- Renamed PortableHashtable::Contains() to ContainsValue(), to avoid
confusion.
- Rewrote PortableHashtableFieldNameIterator to be simpler and more efficient.
- Rewrote ReflectServer to use only a PortableHashtable to hold
AbstractReflectSessionRefs, instead of both a PortableHashtable and a
PortableQueue.
- Renamed ReflectServer::GetSessionsList() and
AbstractReflectSession::GetSessionsList() to GetSessions(), which now
returns a hashtable iterator instead of a reference to a PortableQueue.
- Renamed ReflectServer::GetSessionByID() and
AbstractReflectSession::GetSessionByID() to GetSession(), which now
returns an AbstractReflectSessionRef instead of a status_t.
- Added a +(char) operator to PortableString class.
- Made the non-session-specific server API access methods in
AbstractReflectSession protected, instead of public.
- Added a SwapContents() method to the PortableHashtable class.

Intel Version - requires R4.5   (383 KB) 181 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (383 KB) 77 downloads
  Working Link Download LCS Canada

Version 1.91
 License:   Other Open Source License
 Updated:   November 2, 2001
 Source:   Source Included
v1.91 - Released 11/01/01
- Added atomic inc/decs for Linux and Windows into PortableRefCount.h
- The admin tool now waits for a response from the server, and informs you if your admin commands failed due to a privilege violation.
- Changed GetPeerInfo() to try and find out what the local host's "real" IP address is if necessary, instead of returning 127.0.0.1.
- moved the signal(SIGHUP, SIG_IGN) code into InitializeTCPStack().
* Integrated Vitaliy's patches to get QMessageTransceiverThread to work under Windows.

Intel Version - requires R5   (379 KB) 199 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (379 KB) 83 downloads
  Working Link Download LCS Canada

Version 1.90
 License:   Other Open Source License
 Updated:   October 27, 2001
 Source:   Source Included
v1.90 - Released 10/26/01
- Changed the PortableRefCount class to require that the items it reference-counts
are subclasses of PortableRefCountable. This has the advantage of removing all
the RefCountMem and RefCountMemPool dependencies; unfortunately it also breaks
most of the MUSCLE-using code out there (slightly). The old PortableRefCount
implementation is now called UnintrusivePortableRefCount.
- Added a StorageReflectSession::CloneDataNodeSubtree() convenience method.
- Added a CreateAcceptingSocket() function to NetworkUtilityFunctions. This
function creates and returns a socket that is listening for incoming TCP
connections on the given port.
- Added a Flush() callback method to the LogCallback class, and a LogFlush() global
function, so that SysLog output can be fflush()'d in a generic manner.
- Added support for defining a custom threadsafe incrementor function in
PortableRefCount.h
- Added #define PR_NAME_SESSION "session" into StorageReflectConstants.
Now when muscled sees a string with this field name in a client-to-client
PortableMessage, it will replace the string value with the sending client's
session ID. This allows receiving clients to be sure that the client who
sent them the message is the client indicated in the server field of the
message (i.e. it disallows "spoofing" of other clients).
- Added an example flattened-PortableMessage byte listing to the end of
PortableMessageIOGateway.h
- Added AddHead() and AddTail() methods to PortableQueue that take
other PortableQueues, rather than individual items.
- QMessageTransceiverThread::PortableMessageReceived()'s second argument
is now a uint32 instead of an int.
- Added the InitializeTCPStack() function to NetworkUtilityFunctions.h
(Starts up the TCP stack; only needed under Windows)
- Added handy factory functions for the PortableMessageIOGateway and
PlainTextMessageIOGateway classes.
- Added the LogLineCallback convenience subclass to SysLog.{cpp,h}
- Added Vitaliy's vc++ subfolder with VC++ project files.
* More windows compatibility tweaks; muscled now compiles and runs under
Windows XP with VC++! (many thanks to Vitaliy Mikitchenko aka VitViper!)
* StorageReflectSession::NodePathMatcher::DoTraversal() was not giving
correct results for traversals that used multiple query strings and
didn't start from the global database root. Fixed.

Intel Version   (370 KB) 180 downloads
  Working Link Download LCS Canada
PowerPC Version   (370 KB) 75 downloads
  Working Link Download LCS Canada

Version 1.84
 License:   Other Open Source License
 Updated:   October 16, 2001
 Source:   Source Included
v1.84 - Released 10/15/01
- Added a SpawnDaemonProcess() function to NetworkUtilityFunctions.h
- Added a Snooze64() function to NetworkUtilityFunctions.h
- Added ReleaseFile() and GetFile() methods to FileDataIO.h
- Added a PR_NAME_SET_QUIETLY tag so you can upload nodes to
the database without causing subscribers to be notified.
- Added a PR_NAME_REMOVE_QUIETLY tag so you can remove nodes from
the database without causing subscribers to be notified.
- Added Jonathon Padfield's QSocketDataIO class to the qtsupport
folder (for single-threaded Qt programs). Thanks, Jonathan!
- Added a MCHECKPOINT macro to PortableMacros.h for use in debugging.
- Added a RemoveAllInstancesOf(const ItemType &) method to the PortableQueue class.
- Added == and != operators to the PortableQueue class.
- testgateway.cpp now takes optional filename arguments. Any
filenames given to it will be read as flattened PortableMessages
and their contents printed to stdout.
- Added a OnceEvery(uint64, uint64 &) function to TimeUtilityFunctions.h
- PortableMessage::PrintToStream() now has optional arguments to make
it function recursively with varying levels of indentation.
- Added a new class regex/PathMatcher.{cpp,h} to the repertoire.
This class can be used to do efficient pattern matching against
node-path strings. Moved the functions in reflector/StorageReflectUtils.{cpp,h}
into these files instead.
- Previously subscribing to a string you were already subscribed to
was a no-op. Now it is equivalent to a PR_COMMAND_GETDATA using that string.
- PortableQueue::Sort() now takes an optional void pointer that will
be passed through to the item-compare callback function.
* Jonathon Padfield contributed a patch to PortableByteOrder.h to
make it compile under FreeBSD. Thanks again J :^)
* PortableRef class now has a proper copy-constructor.
* Changed B_ERROR and B_NO_ERROR declarations from an enumeration
to #defines, to avoid compiler warnings.
* Fixed a bug in QMessageTransceiverThread that would cause
TCP connections to be broken as soon as they were connected.
* TCPSocketDataIO::Shutdown() now calls shutdown() before close().
(Linux wasn't being properly punctual with just close())
* PortableString::Unflatten() now checks to make sure the
flattened string is terminated, and errors out if it isn't.
* PortableHashtable::Put()'s default value for the last argument
was false instead of NULL. Fixed.
* Made several methods in StorageReflectSession inline and const tagged.

Intel Version   (379 KB) 184 downloads
  Working Link Download LCS Canada
PowerPC Version   (379 KB) 68 downloads
  Working Link Download LCS Canada

Version 1.83
 License:   Other Open Source License
 Updated:   September 13, 2001
 Source:   Source Included
v1.83 - Released 9/12/01
- Added a qtsupport folder, containing QMessageTransceiverThread
and QThreadSafeObjectPool classes for use with the Qt API.
- Added more of David Rene's Visual C++ compatibility changes in.
- Renamed GetCurrentTime() to GetCurrentTime64() to avoid a
conflict with the like-named Windows function, and added
David's Win32 implementation of the method.
- Added MUSCLE_CLASS_DECLARATIONS and MUSCLE_FUNCTION_DECLARATIONS
tokens into the header files where appropriate. These tokens
are #defined to nothing by default, but can be overridden by the
compile environment (-D flag) if necessary.
- Added an "okayToAdd" argument to all the Replace*() methods
in the PortableMessage class; if set to true, then attempting
to replace a non-existing item will cause the new item
to be added to the message instead of returning B_NO_ERROR.
If set false, the old behaviour (fail if old item not present)
is used instead.
- Added a Reset() method to the MessageTransceiverThread classes.
You can call Reset() on a MessageTransceiverThread object to
re-initialize its state (comparable to deleting the
MessageTransceiverThread object and creating a new one)
- Added GetOutputStallLimit() methods to the AbstractMessageIOGateway,
PortableDataIO, and TCPSocketDataIO classes. Now output stall
detection is only done on TCP connections, and can be controlled
per gateway or per data io type.
- Changed the ReflectServer to take a ReflectSessionFactory object
in PutAcceptPort() instead of a callback function. Converted all session
creation callback functions into ReflectSessionFactory subclasses.
- Added an overloaded () operator to the StringTokenizer class, as
a convenience. It works as a synonym for GetNextToken().

Intel Version - requires R4.5   (366 KB) 227 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (366 KB) 93 downloads
  Working Link Download LCS Canada

Version 1.82
 License:   Other Open Source License
 Updated:   August 22, 2001
 Source:   Source Included
v1.82 - Released 8/21/01
- During a memory shortage, muscled now kicks users whose output
message queues have grown too large. This keeps someone with
a bad network connection and an ambitious subscription request
from tying up all the memory on the server indefinitely.
- Changed the signature of AbstractMessageIOGateway::DoInput() and
AbstractMessageIOGateway::DoOutput() to DoInput(uint32 & addReadBytes)
and DoOutput(uint32 & addWroteBytes). DoInput() and DoOutput()
should add to this argument the number of bytes they read or
wrote during the call, respectively. This helps the calling
code know when I/O is stalled.
- muscled now keeps track of how long an output has been "stalled"
(i.e. it has bytes queued to send to the client but none have
actually been sent) and will drop any clients that have been
stalled for more than 20 minutes.

Intel Version - requires R4.5   (352 KB) 208 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (352 KB) 78 downloads
  Working Link Download LCS Canada

Version 1.81
 License:   Other Open Source License
 Updated:   July 17, 2001
 Source:   Source Included
v1.81 - Released 7/16/01
- Added Alan's stream operators to the PortableString class.
* Made AtheOS refcounts use atomic_add(), for thread safety.
* Merged in David Rene's header tweaks to help MUSCLE code compile
cleanly under Visual C++.
* Tweaked time.h includes to compile properly under Debian Linux.
* Messages being returned to the global message pool now have
their 'what' code set to zero.
* Fixed a potential source of problems during out-of-memory
conditions in the PortableMessageIOGateway class.

Intel Version - requires R4.5   (349 KB) 238 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (349 KB) 84 downloads
  Working Link Download LCS Canada

Version 1.80
 License:   Other Open Source License
 Updated:   June 26, 2001
 Source:   Source Included
v1.80 - Released 6/26/01
- Added an atheossupport directory, which is a AtheOS port of
the BeOS code in the besupport directory.
- Added testatheosclient.cpp and testatheossupport.cpp testing
stubs to the test folder.
* Consolidated the netutil, string, stringtokenizer, hashtable,
refcount, pool, and queue subfolders into a single subfolder
named 'util'. All code that uses MUSCLE will probably need
to have its #include lines modified to reflect this, before
it will compile again. :^( (this change was necessary in
order to avoid #include space conflicts with the STL headers)

Intel Version - requires R4.5   (349 KB) 260 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (349 KB) 96 downloads
  Working Link Download LCS Canada

Version 1.72
 License:   Other Open Source License
 Updated:   June 23, 2001
 Source:   Source Included
v1.72 - Released 6/22/01
- Added a "maxnodespersession" parameter to muscled, which lets
you specify the maximum number of nodes any given session may
have in it its server-side database at one time.
- Added a uint32 PR_NAME_MAX_NODES_PER_SESSION read-only parameter
to the parameter set returned by PR_COMMAND_GET_PARAMETERS.
This returns the value mentioned above.
- Made some of the members of the DataNode class demand-allocated,
so as to use a little less memory.
- Tweaked the code to compile without errors under the CygWin environment.
(thanks to Joshua Schmiedlin for his help with this)
- Added a Sort() method to the PortableQueue class. This method
uses a nice in-place merge-sort algorithm that I liberated from
Thomas Baudel's sorting visualizer applet at
http://www-ihm.lri.fr/~thomas/VisuTri/
- Added Swap() and ReverseItemOrdering() methods to PortableQueue.
These let you swap two entries or a invert the ordering of a
whole range of entries, respectively.
- ReflectServer now preallocates 256 slots for the lame-duck session
list, so that adding a session to the lest is less likely to fail
during a memory pinch.
- Added a SetNotificationMessage() method to MessageTransceiverThread
class (in case the regular old PORTABLE_MESSAGES_RECEIVED message
isn't good enough for you)

Intel Version - requires R4.5   (337 KB) 156 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (337 KB) 89 downloads
  Working Link Download LCS Canada

Version 1.71
 License:   Other Open Source License
 Updated:   June 11, 2001
 Source:   Source Included
v1.71 - Released 6/11/01
- Renamed ReflectServer::AddAcceptPort() to PutAcceptPort().
Changed ReflectServer to allocate accept-sockets inside the
PutAcceptPort() call instead of at the beginning of the
ServerEventLoop(). Also added a RemoveAcceptPort() method to
ReflectServer, and added PutAcceptPort() and RemoveAcceptPort()
pass-through methods to AbstractReflectSession.
- Added a BroadcastToAllNeighbors() convenience method to
the AbstractReflectSession class.
- Added a Seek() method to the PortableDataIO interface, and
Seek() implementations to the various subclasses thereof.
Moved FileDescriptorDataIO's implementation into a .cpp file
so that it will link properly under Linux.
* Added some missing constants to StorageReflectSession.java

Intel Version - requires R4.5   (329 KB) 228 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (329 KB) 93 downloads
  Working Link Download LCS Canada

Version 1.70
 License:   Other Open Source License
 Updated:   May 21, 2001
 Source:   Source Included
v1.70 - Released 5/20/01
- Changed the Makefiles to reflect the changed, final location
of the BONE headers (/boot/develop/headers/be/bone)
- Changed the Put() methods of PortableHashtable to return
true on success, false on error (memory allocation failure).
NOTE: This changes the Put()'s return value semantics!
If you code was relying on them, you will need to modify it.
- Changed ReflectServer::ServerProcessLoop() to take no arguments,
and added a method ReflectServer::AddAcceptPort(func, port) instead.
This change allows a single server to accept connections on multiple
ports if it wants to, and create different AbstractReflectSession objects
based on the port the TCP connection was received on. As a consequence
of this, you can now have muscled listen on multiple ports if you like;
e.g. muscled port=2960 port=4000 port=9999
- Added a GetServerUptime() method to the ReflectServer and
AbstractReflectSession classes, and a PR_NAME_SERVER_UPTIME
field to the message returned by PR_COMMAND_GET_PARAMETERS.
The value returned is muscled's uptime, in microseconds.
* Changed the AddLogCallback() and AddOutOfMemoryHandler() functions
to return B_ERROR on out-of-memory.
* Changed the muscled code to handle Put() failing a little better.
This should fix some of the memory leaks that occur when the server
has hit its memory cap.

Intel Version - requires R4.5   (326 KB) 228 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (326 KB) 93 downloads
  Working Link Download LCS Canada

Version 1.64
 License:   Other Open Source License
 Updated:   May 7, 2001
 Source:   Source Included
v1.64 - Released 5/07/01
- Added dataio/MemoryBufferDataIO.h. This class lets you use
an in-memory array as a limited input or output device.
- Added a new first parameter to BecomeDaemonProcess(). This
first param lets you specify the directory that the child
process should chdir() to. Leave as NULL to not change directory at all.
- Added a GetReadByteTimeStamp() method to the PortableDataIO
interface. (used to support high-precision time-stamping in LCS-specific
subclasses. Not implemented by any of the included MUSCLE classes, though)
- Added a PR_COMMAND_BATCH message type. When the server receives
this message, it will parse the submessages in the PR_NAME_KEYS
field and execute them in order as if they had arrived separately.
- Added a PR_COMMAND_NOOP message types. When the server receives
this message it is guaranteed to do nothing at all with it.
- In the StorageReflectSession class, changed NotifySubscribersOfNewNode(),
NotifySubscribersThatNodeChanged(), and NotifySubscribersThatNodeIndexChanged()
to be virtual so that they can be overridden and used as hooks
in a subclass.
- Added a CreateConnectedSocketPair() function to the
NetworkUtilityFunctions.h package. This function is useful
for thread coordination.
- Added a SetSocketBlockingEnabled() function to NetworkUtilityFunctions.h
- muscled now compiles and runs under AtheOS, thanks to a
patch submitted by Jonas Sundstrom.
* The docs were referring to the muscled's pattern matching
feature as 'regular expressions'. This was inaccurate, as
muscled doesn't parse regular expressions so much as wildcard
expressions, a.k.a. globbing. Changed the docs to reflect this.
* PortableString::LastIndexOf(char) was broken. Fixed.
* Boolean PortableMessage fields were broken on architectures
where sizeof(bool) was not equal to one. Fixed.

Intel Version - requires R4.5   (325 KB) 232 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (325 KB) 112 downloads
  Working Link Download LCS Canada

Version 1.63
 License:   Other Open Source License
 Updated:   March 25, 2001
 Source:   Source Included
v1.63 - Released 3/25/01
- iogateway/PlainTextMessageIOGateway.cpp now works. While not
used by muscled, this class can be used by other programs for
easy communication with servers that speak ASCII text (e.g.
web servers, XML server, e-commerce servers, etc). See
PlainTextMessageIOGateway.h for details.
- Added test/plaintextclient.cpp and test/portableplaintext.cpp.
These are command line communications test programs, similar
to testreflectlient.cpp and portablereflectclient.cpp, respectively,
but using plain text streams rather than flattened PortableMessages.
- Added a Shutdown() method to the PortableDataIO classes. This
method can be used to immediately close the underlying socket/file
descriptor/whatever, without having to delete the PortableDataIO object.
- Made AbstractMessageIOGateway::GetDataIO() public.
- BecomeDaemonProcess() now takes two optional arguments: the
first indicates where to redirect stderr and stdout to. Default
value is "/dev/null". The second indicates whether or not to
try and create a file if it can't be opened; default is false.
* When the MessageTransceiverThread gets an I/O error, it now closes
its connection immediately (by calling GetDataIO()->Shutdown())
rather than waiting for the user to do it.
* The muscled ServerProcessLoop() and MessageTransceiverThread now
both suppress SIGPIPE signals, as these can be raised when sending
to a remotely-closed socket, killing the thread.

Intel Version - requires R4.5   (312 KB) 293 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (312 KB) 120 downloads
  Working Link Download LCS Canada

Version 1.62
 License:   Other Open Source License
 Updated:   March 3, 2001
 Source:   Source Included
v1.62 - Released 3/2/01
- Added a PR_NAME_SERVER_VERSION parameter to the parameter set
returned by the server. This field contains a string to indicate
the version of MUSCLE the muscled server was compiled from.
(Currently the string is "1.62")
* The clever byte-swapping macros put in for MacOS/X were screwing
up the byte-ordering for Linux, so I removed them.
* PortableMessage.java had a call to Vector.add() in it. Changed it to
Vector.addElement().
* Made the _empty Hashtable in PortableMessage.java demand allocated,
otherwise IE would barf on it.

Intel Version - requires R4.5   (321 KB) 234 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (321 KB) 112 downloads
  Working Link Download LCS Canada

Version 1.61
 License:   Other Open Source License
 Updated:   February 17, 2001
 Source:   Source Included
v1.61 - Released 2/16/01
- Changed the Pulse()/GetPulseTime() callbacks to use uint64s instead of
timeval structs--uint64's are much easier to use than timevals.
- Added a BecomeDaemonProcess() function to NetworkUtilityFunctions.h
This function calls fork() and all the other incantations necessary to
convert the current process into a canonical Posix daemon task.
- muscled now recognizes the parameter 'daemon'. If specified, muscled
will detach from the shell and run as a background/daemon task.
* muscled now parses keywords even if they have no '=' sign/value specified.
* Changed the SysLog implementation to use separate callbacks for console
and file logging. Before it was using the same callback for both, but
certain versions of Linux crash if I try to re-use a va_list object.

Intel Version - requires R4.5   (313 KB) 268 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (313 KB) 112 downloads
  Working Link Download LCS Canada

Version 1.60
 License:   Other Open Source License
 Updated:   February 2, 2001
 Source:   Source Included
v1.60 - Released 2/1/01
- Added Java client support to MUSCLE! (See README-JAVA.txt)
- Changed header comments to JavaDoc style throughout.
- Added extra commenting to a lot of previously uncommented header code.
Now all public and protected methods and member items are documented.
- The muscle/html/autodoc/genDocs.sh script now calls doxygen instead
of PERCEPS. Doxygen is a very nice autodocumenting program, and a
BeOS port can be found on BeBits.
- Added a muscle.dox config file to the muscle/html/autodoc directory.
- Added a () operator to the PortableString class so you can say
myString(), instead of myString.Cstr(), if you want.
- PortableString methods StartsWith, EndsWith(), EndsWithIgnoreCase(),
and StartsWithIgnoreCase() now return bool instead of int.
- The PR_RESULT_PARAMETERS messages returned by the server now include
uint64 PR_NAME_SERVER_MEM_AVAILABLE, PR_NAME_SERVER_MEM_USED, and
PR_NAME_SERVER_MEM_MAX fields that indicates how much
memory the server has available to be allocated by all MUSCLE clients.
- Added a FileDescriptorDataIO class to the dataio directory. This
dataio supports sessions that want to do read() and write() on a
file descriptor for their I/O.
* AddFlat(), PrependFlat(), ReplaceFlat(), and FindFlat() will
now call their Point, String, or Message counterparts if they
are passed a PortablePoint, PortableString, or PortableMessage object.
* Flattened objects added to a PortableMessage are now filed using
the field type returned by their TypeCode() member, rather than
always as B_OBJECT_TYPE. This will break compatibility with old
clients that expected B_OBJECT_TYPE flattened objects; sorry about that.
* Added in some extra tweaks so that MUSCLE will compile under MacOS/X.
* A bunch of member variables of the AbstractMessageIOGateway class
were protected when they should have been private. Changed them
to private and added protected accessor methods where necessary.
* HTML-ized the README.TXT file (now named README.html)

Intel Version - requires R4.5   (304 KB) 286 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (304 KB) 123 downloads
  Working Link Download LCS Canada

Version 1.51
 License:   Other Open Source License
 Updated:   January 4, 2001
 Source:   Source Included
v1.51 - Released 1/3/01
- Added PR_COMMAND_KICK, PR_COMMAND_ADDBANS, and PR_COMMAND_REMOVEBANS
commands. Messages of these types instruct the muscle server to
disconnect other clients, forbid IP addresses from connecting to
the server, and remove previously added bans, respectively.
These messages will only be honored if sent by a privileged
client; otherwise a PR_RESULT_ERRORACCESSDENIED message is returned.
- muscled now takes "privban=<pattern>", "privunban=<pattern>",
"privkick=<pattern>", and "privall=<pattern>" arguments, to
specify which clients are allowed to do kick, ban, or unban ops.
(if not specified, no clients will be privileged)
- Added an 'admin' command-line tool to the muscle/server
directory that lets you manage your server's ban lists
and/or kick users without having to restart the server.
Run 'admin help' for args.
- Made ReflectServer::GetCentralState() public.
* Removed the ClientConnected() and SetClientConnected()
callbacks in favor of a more elegant StorageReflectSession
oriented privileges system. The new system allows the server
operator to specify which clients are allowed to kick, ban,
and unban other clients.

Intel Version - requires R4.5   (222 KB) 361 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (222 KB) 138 downloads
  Working Link Download LCS Canada

Version 1.50
 License:   Other Open Source License
 Updated:   December 29, 2000
 Source:   Source Included
v1.50 - Released 12/29/00
- Loosened up the flattened-PortableMessage protocol specification
a little bit. It is now legal to add fields with arbitrary typecodes
to a PortableMessage, and PortableMessages with fields that have
arbitrary typecodes may be Unflatten()'d without causing an error.
This will allow the addition and use of new datatypes without breaking
backwards compatibility, thus avoiding a repeat of the problems that
were caused by adding the B_MIME_TYPE support.
- support/PortableMacros.h now contains a MUSCLE_VERSION_STRING
#define, indicating the current version of MUSCLE. muscled
will print this version string out on startup if you set
the display threshold to DEBUG or lower.
* Tweaked StorageReflectSession.{cpp,h} to get it to compile under
Red Hat Linux 7.0.

Intel Version - requires R4.5   (226 KB) 199 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (226 KB) 124 downloads
  Working Link Download LCS Canada

Version 1.45
 License:   Other Open Source License
 Updated:   December 23, 2000
 Source:   Source Included
v1.45 - Released 12/22/00
- Added a GetPeerInfo() function into NetworkUtilityFunctions.{cpp,h}.
This function returns the remote host IP and port of a connected socket.
- Added a ClientConnected() virtual method and SetClientConnectedCallbackFunc()
method to ReflectServer. Both of these mechanisms allow connecting clients
to be checked before allowing them access to the server.
- muscled can now accept zero or more ban=<ipaddr> arguments on the command
line. Each ban argument specifies an IP address (or regex pattern of
IP addresses) to ban from the server.
- Added EndServer() methods to the ReflectServer and AbstractReflectSession
classes. These allow you to cause muscled to exit in a controlled manner.
- You can now disable the memory-usage-tracking overloads of new and
delete by defining the preprocessor symbol DISABLE_MUSCLE_MEMORY_TRACKING
for ReflectServer.cpp.
- muscled's Makefile now supports both optimized and unoptimized builds
of muscled. Do "make" for an unoptimized build, or "make optimized"
for an optimized build. (Be sure to "make clean" first when switching
from one to the other!)
* Fixed a couple of memory leaks in the PortableHashtable class.
* Rewrote PortableHashtable::GrowTable() to handle out-of-memory
conditions correctly.
* Removed the WATCH_MUSCLE_MEMORY_USAGE macros, since the overloaded
new and delete operators do the same thing in a more elegant way.
* Updated the docs slightly to reflect the fact that level one
server-database nodes are named after the clients' IP addresses,
not their hostnames.
* Fixed an uninitialized-pointer problem that could make muscled
crash while denying a login.

Intel Version - requires R4.5   (229 KB) 196 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (229 KB) 121 downloads
  Working Link Download LCS Canada

Version 1.44
 License:   Other Open Source License
 Updated:   December 20, 2000
 Source:   Source Included
v1.44 - Released 12/21/00
- Modified PortableHashtable to maintain a linked list of
PortableHashtableEntry objects. This should speed up traversals
somewhat, as the PortableHashtableIterator no longer needs to
iterate over the empty portions of the table.
- Merged in Trey Boudreau's changes to support adding fields of
type B_MIME_TYPE to a PortableMessage.
- Added IndexOfIgnoreCase() and LastIndexOfIgnoreCase() methods
to PortableString that take chars instead of (const char *)'s
as their second argument.

Intel Version - requires R4.5   (231 KB) 182 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (231 KB) 118 downloads
  Working Link Download LCS Canada

Version 1.43
 License:   Other Open Source License
 Updated:   December 2, 2000
 Source:   Source Included
v1.43 - Released 12/01/00
- Added a "Custom Servers.html" file to muscle/html. This file contains
information on making your own custom MUSCLE server.
- Changed ObjectPool to reuse items in LIFO order rather than FIFO.
This may increase cache coherency in some cases.
- Makefile now compiles muscled with -O3 and -fomit-frame-pointer options
under gcc, for efficiency.
- Added SetMessageFlattenCallback() and SetMessageUnflattenCallback()
methods to the PortableMessageIOGateway class (for when you can't be
bothered to do proper subclassing ;^))
- Added ParseLogLevelToken() function to SysLog.h, and added 'display'
and 'log' arguments to muscled, so that you can specify how what sort
of output you want on the command line. (e.g. "./muscled display=debug log=none")
- Added more *IgnoreCase() methods to PortableString, and changed
PortableString::Equals() to return a bool instead of an int.
- Pulled the timeval utility functions out of NetworkUtilityFunctions.{cpp,h}
and into their own file, netutil/TimeUtilityFunctions.h
Also declared them all inline, so you don't need to link anything
extra in to use them.
- Moved references to <sys/time.h> into PortableTypeDefs.h, and added
a #include there so that including this header can be avoided.
(This is to support certain embedded architectures which don't
seem have this file...)
- Added a operator() overload to the PortableRefCount(), so you can
now specify myRef() instead of myRef.GetItemPointer().
* Renamed the LOG_* constants in SysLog.h to MUSCLE_LOG_*, to avoid
conflicts with the constants in Be's support/syslog.h header. (This
may break some existing code, sorry about that)
* Disabled the memory-allocation code under BeOS/PowerPC environments,
as it was causing mysterious crashes (possible compiler bug?). This
means that if you are running muscled on a PowerPC BeOS machine, the
memory allocation limits will be ignored.

Intel Version - requires R4.5   (221 KB) 249 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (221 KB) 130 downloads
  Working Link Download LCS Canada

Version 1.42
 License:   Other Open Source License
 Updated:   October 19, 2000
 Source:   Source Included
v1.42 - Released 10/18/00
- Added a new function, AddOutOfMemoryHandler((void *)()). This lets you
install your own handler that will be called in the event of a memory
allocation failure.
- Added a new command code, PR_COMMAND_PING. When muscled receives a message
of this type from its client, changes the message's 'what' code to
PR_RESULT_PONG, and sends the message right back to the client.
- Added a GetRemainderOfString() method to the StringTokenizer class.
* Moved the StorageReflectSession::DrainPools() call out of ReflectServer.cpp,
and into a callback that is installed by muscled.cpp. This allows custom
servers to be compiled without having to link in StorageReflectSession.o.
* The memory-tracking new and delete operators now count their own
4-byte-per-allocation overhead in the allocated-memory total.

Intel Version - requires R4.5   (214 KB) 399 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4.5   (214 KB) 168 downloads
  Working Link Download LCS Canada

Version 1.41
 License:   Other Open Source License
 Updated:   October 7, 2000
 Source:   Source Included
v1.41 - Released 10/8/00
- Added a FindDataPointer() method to the PortableMessage class.
This method returns a writable pointer to a field's data
array, for efficiency.
- PortableMessage::AddData() now allows the (data) parameter to
be NULL. If (data) is NULL, default-constructed objects or
uninitialized data bytes will be added to the PortableMessage.
- PortableMessage::FindData() and FindDataPointer() now allow
the (numBytes) parameter to be NULL.
- muscled now parses command line arguments of the form
keyword=value. Currently supported keywords are 'port',
'help', and 'maxmem'.
- muscled now detects out-of-memory situations and tries to free up
some memory by draining the object pools and/or forcibly
disconnecting the active session when an out-of-memory error occurs.
- muscled now lets you specify the maximum number of bytes of
data it should allow itself to have allocated at any one time.
For example, entering "muscled maxmem=15" will cause muscled
to not help itself to more than 15 megabytes of memory.
* Went through the code and made it more resistant to crashing
in out-of-memory situations. (i.e. it should correctly handle
NULL being returned by new (nothrow) in all cases)
* Fixed a bug that would cause muscled to crash if it was
sent a malformed PortableMessage. Thanks to Ben and Pete
for helping me find this bug!
* Now compiles cleanly with full warnings enabled, thanks
to Christopher Tate.

Intel Version - requires R4   (285 KB) 262 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R4   (285 KB) 162 downloads
  Working Link Download LCS Canada

Version 1.40
 License:   Other Open Source License
 Updated:   September 8, 2000
 Source:   Source Included
v1.40 - Released 9/8/00
- Added ordered-child-indexing to StorageReflectSession. Support
for this includes the new PR_COMMAND_INSERTORDEREDDATA code,
the PR_RESULT_INDEXUPDATED result code, and the INDEX_OP_*
enums. (see comments in StorageReflectConstants.h and the new
chapter at the end of the Beginner's Guide for details)
- Added Prepend*() methods to the PortableMessage class.
- PortableQueue and PortableString can now handle very small
strings/lists without having to do any dynamic memory allocation.
- Added Head(), Tail(), HeadPointer(), TailPointer(), and
InsertItemAt() to PortableQueue.

Any Processor - requires R4   (275 KB) 435 downloads
  Working Link Download LCS Canada

Version 1.31
 License:   Other Open Source License
 Updated:   July 31, 2000
 Source:   Source Included
v1.31 - Release 7/30/00
- Added custom-callback capability to the SysLog module.
(AddLogCallback(), RemoveLogCallback())
- Added the OnceEvery() function to NetworkUtilityFunctions.
* Fixed an uninitialized timeval struct in AbstractMessageIOGateway--
this was causing muscled to panic and exit sometimes under FreeBSD.
(Thanks to Peter Schultz for helping track down this bug!)

Any Processor - requires R4.5   (202 KB) 325 downloads
  Working Link Download LCS Canada

Version 1.30
 License:   Other Open Source License
 Updated:   July 1, 2000
 Source:   Source Included
v1.30 - Released 6/30/00
- Added optional object-allocation tracking into the code.
This tracking is useful for hunting down memory leaks; to enable it
uncomment the -DMUSCLE_WATCH_MEM_USAGE line in the Makefile and
recompile the server (from scratch). With this flag enabled,
the server will print out memory-allocation stats every so many
seconds.
- Added some PR_COMMAND_RESERVED and PR_RESULT_RESERVED constants
to StorageReflectConstants.h to allow future expansion.
- Added a PR_RESULT_ERROR_UNIMPLEMENTED code. This message is
sent back to the client when the client sends a PR_COMMAND_RESERVED
code that the serverd doesn't understand.
- Added a PR_COMMAND_JETTISON_RESULTS command. When the server receives
a message of this type, it will match the paths given in PR_NAME_KEYS
against the items in its list of outgoing PR_RESULTS_DATAITEMS messages,
and any matched items will be deleted and not sent. If no PR_NAME_KEYS
field is found in the PR_COMMAND_JETTISON_RESULTS message, then all
pending PR_RESULTS_DATAITEMS messages will be dumped. (This is useful
when a client is receiving a large result set and decides in the middle
of the download that he's no longer interested in it)
- muscled no longer does a hostname lookup when a client logs in.
This speeds up muscled's response time (and frees it from depending
on a working nameserver) but it means that nodes in level one
of the database tree will look like '127.0.0.1' instead of
'mycomputer.mydomain.com'.
- Added ClientConnectionClosed() callback to the AbstractReflectSession
class, so that a session can decide whether it wants to stick around
after its TCP connection is gone.
- Replaced the AbstractReflectSession class's GetIncomingMessageQueue()
and GetOutgoingMessageQueue() methods with the more flexible
GetGateway() and SetGateway() methods.
- Added some utility functions to StringMatcher.{cpp,h}:
IsRegexToken(), HasRegexTokens(), and MakeRegexCaseInsensitive().
- Now compiles under FreeBSD4.0, using gmake.
* The StringMatcher wasn't handling parentheses properly. Fixed it,
so now you can use expressions like *.(jpg,mp?). Also rewrote the
regex translation code to be more readable, and fixed a nasty
dangling-pointer bug in the process.
* Changed the RefCountMem class to use atomic_add instead of the
C preincrement and predecrement operators, so that it can be used
safely in multithreaded environments.
* Fixed a subtle bug in the Remove*() methods of the PortableQueue
class that could cause crashes if you were removing items whose
assignment operators looked at the PortableQueue they were
being removed from... geez
* Added some missing virtual destructors
* Rewrote the PortableString class to be more efficient, and
in the process found and fixed a nasty bug--the CStringHashFunc()
was completely broken.
* StringMatcher::Match() is now tagged as const.

Any Processor - requires R4.5   (259 KB) 328 downloads
  Working Link Download LCS Canada

Version 1.24
 License:   Other Open Source License
 Updated:   June 18, 2000
 Source:   Source Included
v1.24 - 6/17/00
- muscled now splits its PR_RESULT_DATAITEMS messages into multiple
messages if the message has more than 50 items in it. This allows
for more fine-grained updates.
- Added a PR_NAME_MAX_UPDATE_MESSAGE_ITEMS parameter that can
be set by the client to change the above threshold if desired.

Any Processor - requires R4.5   (255 KB) 314 downloads
  Working Link Download LCS Canada

Version 1.23
 License:   Other Open Source License
 Updated:   June 16, 2000
 Source:   Source Included
v1.23 - 6/15/00
- Added a StartServerThread() method to the MessageTransceiverThread
class. Now the MessageTransceiverThread can be used to accept
multiple overlapping connections, instead of just a series of
single connections.
* make clean now removes .xSYM files.

Any Processor - requires R4.5   (250 KB) 246 downloads
  Working Link Download LCS Canada

Version 1.22
 License:   Other Open Source License
 Updated:   June 15, 2000
 Source:   Source Included
v1.22 - 6/14/00
* MessageTransceiverThread::WaitForAllMessagesToBeSent() was broken.
Changed it to use benaphores instead of BLockers, and now all is well.

Any Processor - requires R4.5   (239 KB) 194 downloads
  Working Link Download LCS Canada

Version 1.21
 License:   Other Open Source License
 Updated:   June 13, 2000
 Source:   Source Included
v1.21 - 6/12/00
- Added Prepend() and Append() methods to PortableString.
- Added InetNtoA() convenience method to NetworkUtilityFunctions.cpp
- Added EscapeRegexTokens() to StorageReflectUtils.h
* User messages would be reflected back to the sender even when
the reflect-to-self flag wasn't set. Fixed.
* Fixed several bugs in the MessageTransceiverThread class.
* muscled now handles connections from localhost correctly.

Any Processor - requires R4.5   (239 KB) 254 downloads
  Working Link Download LCS Canada

Version 1.20
 License:   Other Open Source License
 Updated:   June 8, 2000
 Source:   Source Included
v1.20 - 6/8/00
- Added new accessors to PortableHashtable and PortableMessage that
return key and value objects by pointer rather than by value.
This can make access and traversals more efficient, as it eliminates
an unnecessary data copy.
- Added default constructors to the PortableHashtableIterator and
PortableMessageFieldNameIterator classes so that you can use
them in arrays, as class members, etc.
- Added SetOutgoingQueueDrainedMessage() to the MessageTransceiverThread
API so that you can (optionally) receive notification when the outgoing
message queue has become empty.
* Made ObjectPool's destructor virtual.

Any Processor   (252 KB) 244 downloads
  Working Link Download Primary Location

Version 1.10
 License:   Other Open Source License
 Updated:   June 2, 2000
 Source:   Source Included
v1.10 - 6/1/00
- Added ReplaceSession() method, by which a server-side session object
can replace itself with a different one.
- AbstractMessageIOGateway objects can now request Pulse() callbacks.
- Added system logging, to the console or to a log file, or both.
* Fixed some minor compilation problems

Any Processor   (242 KB) 268 downloads
  Working Link Download LCS Canada

Version 1.01
 License:   Other Open Source License
 Updated:   April 11, 2000
 Source:   Source Included
This is a very minor update; the only thing different is the server-side Pulse() support. Pulse() times are now based on absolute wakeup times instead of relative delay times, for improved timing accuracy over long periods.

Any Processor   (241 KB) 379 downloads
  Working Link Download LCS Canada

Version 1.00
 License:   Other Open Source License
 Updated:   March 29, 2000
 Source:   Source Included
 (no information provided)

Intel Version - requires R4.5   (236 KB) 301 downloads
  Working Link Download Primary download location
PowerPC Version - requires R4.5   (236 KB) 243 downloads
  Working Link Download Primary download location

 
BeGroovy
  Recent Downloads  -  # 173
Total Downloads  -  # 103
Total Views  -  # 32
User Ratings  -  # 52
  Class Libraries
Instant Messaging Servers
Miscellaneous Servers
1.  BePodder - 9.80
2.  QEMU - 9.68
3.  ScummVM - 9.57
4.  cpu_fix - 9.42
5.  Jukebox - 9.40
6.  libdl.so - 9.40
7.  Haiku AGP busm... - 9.35
8.  vim6 - 9.31
9.  Beezer - 9.26
10.  HandBrake - 9.25
1.  BeOS 5 Perso... - 13,528
2.  Realtek RTL8... - 13,071
3.  Ati Radeon G... - 12,502
4.  Ensoniq Audio... - 7,530
5.  ATI Rage 128... - 7,425
6.  USB Joystick... - 5,630
7.  Broadcom 440x... - 5,394
8.  USB Serial dr... - 4,699
9.  S3 Trio 64 v2... - 4,693
10.  Intel Extreme... - 4,457
You are not logged in.
 Login

 
Unless otherwise noted, everything is copyright © 1999-2009 Haikuware. All Rights Reserved.
For more legal trivia, take a gander at our
Legal Stuff page and our Privacy Statement.