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

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) 24 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 4 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) 23 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 2 downloads
  Working Link Download LCS Canada

Version 4.21
 License:   BSD/MIT
 Updated:   January 22, 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) 35 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 7 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) 29 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 9 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) 29 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.8 MB) 5 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) 37 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.7 MB) 13 downloads
  Working Link Download LCS Canada

Version 4.00
 License:   BSD/MIT
 Updated:   October 3, 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) 35 downloads
  Working Link Download LCS Canada
  Working Link Download Alternate Location
PowerPC Version - requires R5   (1.6 MB) 12 downloads
  Working Link Download LCS Canada
  Working Link Download Alternate Location

Version 3.40
 License:   BSD/MIT
 Updated:   September 6, 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) 28 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.6 MB) 14 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) 41 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.6 MB) 14 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) 51 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.6 MB) 14 downloads
  Working Link Download LCS Canada

Version 3.31
 License:   BSD/MIT
 Updated:   March 14, 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) 46 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.53 MB) 15 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) 71 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.53 MB) 25 downloads
  Working Link Download LCS Canada

Version 3.24
 License:   BSD/MIT
 Updated:   November 28, 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) 71 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 18 downloads
  Working Link Download LCS Canada

Version 3.23
 License:   BSD/MIT
 Updated:   September 15, 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) 49 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 23 downloads
  Working Link Download LCS Canada

Version 3.22
 License:   BSD/MIT
 Updated:   July 5, 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) 52 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 14 downloads
  Working Link Download LCS Canada

Version 3.21
 License:   BSD/MIT
 Updated:   May 27, 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) 41 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.5 MB) 15 downloads
  Working Link Download LCS Canada

Version 3.20
 License:   BSD/MIT
 Updated:   March 26, 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) 76 downloads
  Working Link Download LCS Canada
PowerPC Version - requires R5   (1.49 MB) 14 downloads
  Working Link Download LCS Canada

Version 3.11
 License:   BSD/MIT
 Updated:   March 1, 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