Changes since version 1.0.1 --------------------------- - Added support for Visual Studio .NET 2003 aka VC 7.1 - In IceUtil, all "try" and "timed" functions now return false when the resource could not be acquired (i.e., an expected failure). The "Try" from "timedTry" functions was removed, and for consistency the functions trylock, readlock and writelock were renamed to tryLock, readLock and writeLock. - Update to the library versioning scheme: On Windows, only the major and minor version are now used, for example: ice11d.dll (11d means 1.1 debug). In 1.0.x, the patch level was included in the version string, for example ice101d.dll. On Unix, the internal name (soname) is now constructed as lib.so., for example libIce.so.11 (for Ice 1.1.x). This internal name identifies a symbolic link to lib.so., for example: libIce.so.11 -> libIce.so.1.1.0. In 1.0.x, the internal name was set to the actual shared library file name, lib.so.. - Ice now implements slicing for exceptions and classes: if a process receives an exception or class that is of a more derived type than the receiver understands, the exception or class is automatically sliced. (Previously, this situation resulted in an exception.) - Class factories are no longer necessary for non-abstract classes (that is, for classes that do not have operations). For non-abstract classes, the necessary factories are automatically installed by the Ice run time. If you have existing code that implements factories for non-abstract classes, you can simply delete that code. Note that for abstract classes (that is, classes with operations), it is necessary to install a factory for each abstract class, exactly as in version 1.0.x. - User exception factories and user exception factory managers no longer exist. The factories for user exceptions are now automatically installed by the Ice run time. If you have existing code that implements user exception factories, you can simply delete it. - Fixed a bug in the Slice parser: the semantic check to see whether an identifier introduced into a scope has changed meaning was too stringent. - If a client receives a derived exception for which it does not have a user exception factory installed, the client receives the exception sliced to a known base exception. In 1.0.x, the client would have received NoUserExceptionFactoryException, an exception that no longer exists in 1.1.x. - Fixed a bug with connections being closed even though they have outstanding batch requests. - Fixed bug in the WIN32 icepatch client. The removal of orphaned files didn't take into account that WIN32 file names are not case sensitive. - New Ice.Nohup property: when its value is >0, shutdownOnInterrupt() in Application will ignore SIGHUP on Unix and CTRL_LOGOFF_EVENT on Windows. - Updated Application class: * The default behavior is now shutdownOnInterrupt(). * Removed the member function defaultInterrupt(). - Removed Communicator::signalShutdown(): Ice is not using signal handlers anymore, so Communicator::shutdown() can be used all the time. - Added IceUtil::CtrlCHandler: a class that provides portable handling of CTRL+C and CTRL+C-like signals, - Added IceUtil::StaticMutex, for simple, non-recursive, statically allocated and initialized mutexes. - Updated Mutex, RecMutex and RWRecMutex APIs: lock and unlock now return void, and trylock returns a bool that indicates whether the mutex was acquired or not. Also added new member functions to LockT, TryLockT, RLockT, TryLockT, WLockT, TryWLockT: acquire(), tryAcquire(), release(), acquired() and more. - Removed dependency on E2FSPROGS for UUID generation. On Unix, UUIDs are now generated directly with /dev/urandom. - Added support for `env' XML element in IcePack descriptors to allow setting environment variables. - Fixed a bug in the Slice parser: the semantic check to see whether an identifier introduced into a scope has changed meaning was too stringent. - Fixed integer parsing bugs in the C++ XML stream class. - Changed glacier router to send all requests from a separate thread. Previously, only requests forwarded as batch would be sent from a separate thread. - Added support for SPARC/Solaris with the Sun C++ 5.3, 5.4 and 5.5 compilers (32 and 64 bit). See INSTALL.SOLARIS for details. - Replaced the Freeze::EvictorPersistenceMode enumeration with the interface Freeze::PersistenceStrategy. - Added support for GCC 2.95.3. - Several incompatible IceStorm changes: * Moved the subscribe and unsubscribe operations to the Topic interface. * Added an object adapter to host publisher objects, and hence a new configuration property IceStorm.Publish.Endpoints. - Added dynamic thread pools, i.e., thread pools that grow and shrink based on a calculated load factor. Please see the section about thread pools in the manual for further details. - Structs and sequences which hold other structs or sequences are now legal dictionary key types, as long as such nested structs or sequences are (recursively) legal. - The connection timeout is now also used when connections are closed. This avoid hanging processes if the peer misbehaves, or if asynchronous methods invocations don't return. - In some cases, communicator destruction could result in a NullHandleException. This has been fixed. Now a CommunicatorDestroyedException is raised. - A monitor now holds the mutex lock while signaling a condition variable. Otherwise it's possible that the condition variable is destroyed before the signaling call returns, resulting in undefined behavior. The performance difference is minimal, hardly measurable. - Further performance improvements with respect to latency. - Added demo/Ice/throughput, which can be used to measure the transfer time of large sequences. - Fixed a bug in the slice2cpp code generator: if a class was forward declared and used as a class member, but the definition of the class was not supplied in the same Slice compilation unit, invalid code was generated. - Inlined most operators in IceUtil::Time for performance reasons. - Added IceUtil::ThreadControl::isAlive(). This function is useful for implementing a non-blocking join(). - Added IceUtil::ThreadControl::id() member function. - The scope of IceUtil::Thread::ThreadId has been changed to IceUtil::ThreadId. This is the type returned by both Thread::id() and ThreadControl::id(). - Joining with a thread more than once, joining with a detached thread, or detaching a detached thread now have undefined behavior. (Previously, doing any of these things raised an exception.) - Added timestamps to the default Ice logger. You can enable timestamps by setting the `Ice.Logger.Timestamp' property to a value larger than zero. By default timestamps are disabled. - Added several conversion functions to IceUtil::Time: toString, toSeconds, toMilliSeconds, toMicroSeconds. - Fixed a bug in Freeze::DBEnvironment which caused the sync method to hang. - Improved IceBox service deactivation. Instead of successively stopping a service and destroying its communicator, services are now all stopped first and then their communicators are destroyed. - Modified the Ice protocol to marshal sizes more efficiently. Sizes less than 255 now require a single byte whereas previously, sizes between 127 and 254 required five bytes. - Modified the Ice protocol to fix a problem with compression. The compressed message types have been removed, and a field has been added to the message header indicating compression status. - Added version negotiation to the Ice protocol. This permits future protocol extensions to be added without breaking interoperability with older deployed clients and servers. Unfortunately, doing this broke compatibility with the existing protocol so, when upgrading to this version, you must make sure that clients and servers use the same version of libIce.so. - Added a magic number to the Ice protocol. All Ice protocol messages have 'I', 'c', 'e', 'P' (encoded as ASCII) in the first four bytes. This is useful to allow protocol analyzers to recognize Ice messages. - Changed the encoding of encapsulations. An encapsulation now looks like: size (4 bytes) major version number (1 byte) minor version number (1 byte) data (n bytes) The size includes the count of bytes for the size and versions, so the value of size is n + 6. - Added -v and -e options to stringified UDP endpoints. -v sets the protocol version and -e sets the encoding version. (The current version for both protocol and encoding is 1.0.) - Compatibility fixes for GCC 2.96. - Added `option' and `vm-option' elements to IcePack server descriptors. These elements are used to pass command line options to server processes. - Added scandir() and alphasort() for Sun-OS and other Unix systems that do not have these BSD calls. Changes since version 1.0.0 --------------------------- - Added --header-ext and --source-ext command-line options to slice2cpp and slice2freeze. These permit setting header and source file extensions for C++ other than the default `h' and `cpp' file extensions. - Added the macro ICE_INT64 as a portable wrapper for long long constants. - Added support for Xerces 2.2.0. - Added support for OpenSSL 0.97a. - Added OPENSSL_FLAGS to several Makefiles that were missing it. - Changed signature of IceUtil::Time::milliSeconds() to IceUtil::Int64, to avoid overflows. - Renamed Lock and TryLock templates to LockT and TryLockT, to avoid compilation problems with Sun Forte 6.2. - Fixed a bug with throwing exceptions in AMD calls after invoking ice_response(). - Fixed a bug with throwing exceptions in AMI from within ice_response(). - For posix threads, PTHREAD_MUTEX_RECURSIVE_NP is now only used if __linux__ is defined. Otherwise, PTHREAD_MUTEX_RECURSIVE is used. - The EPROTO error code is now only used if it is defined (such as on Linux). - Several other changes that make Ice for C++ more portable. - Updated SSL test certificates. The old ones have expired.