Release Notes for snapshot 971224 - by Sai-Lai Lo --------------------------------- A new snapshot is now available for download at: http://www.uk.research.att.com/omniORB/snapshots/snapshot_971224.tar.gz IMPORTANT NOTE: The naming service now uses the prefix pragma "omg.org". This is introduced to bring our environment in line with the clarifications in the CORBA specification. Unfortunately, this results in on-the-wire incompatibility with clients that are linked with the old library, i.e. any programs linked before this version is released. Please read the section on omniNames below for details. Summary of changes since snapshot_971120: ---------------------------------------- 1. The Naming service now uses the prefix pragma "omg.org" in its IDL. 2. Support for egcs-1.0 with Redhat-5.0. Both x86 Redhat-5.0 and alpha Redhat-5.0 are supported. Notice that the unpatched egcs-1.0 does not have thread-safe exception handling. You *MUST* apply the thread-safe EH patch for it to work properly with omniORB2. 3. New hook for plugging in access control policy modules to determine whether to accept new client connections. Unix platforms use host-based access control based on tcp_wrapper_7.6. Win32 remains unchanged, i.e. all incomings are accepted. 4. The port to HPUX with aC++ (B3910B A.01.04) is now completed (thanks to Hugo Vandeputte and Marcel Ruff). 5. Working LifeCycle service support. 6. Fixes to bugs uncovered since snapshot_971120. You should also consult the release notes of snapshot_971112 and snapshot_971120 for more instructions on building this snapshot. --------------------------------------------------------------------------- omniNames --------- The naming service now uses the prefix pragma "omg.org" in its IDL. Unfortunately, this is not compatible on-the-wire with clients that are linked with the old library, i.e. any programs linked before this version is released. The implications of this change are as follows: a) omniNames built in this snapshot *CANNOT* read the data file of the old omniNames. A new instance must be started from scratch. If you start omniNames and tell it to use the old data file, it will certainly crash. Possible migration path: In our lab, we are running the old and the new omniNames in parallel. The new instance is setup to run on a different port. Also the new tree is built to read by default a different configuration file: (/project/omni/var/omniORB_NEW.cfg instead of /project/omni/var/omniORB.cfg) so that a client will pick up the IOR of the old or the new omniNames depending on whether it is compiled with the old or the new library. When all our services have been recompiled, the old omniNames will be withdrawn. b) If you want to continue to use the old omniNames, you can undo this change with the following steps: 1. Edit /src/lib/omniORB2/Naming.idl and remove the #pragma prefix "omg.org" line. 2. Do the same to /idl/Naming.idl. 3. Remove /include/omniORB2/Naming.hh. 4. Rebuild everything. You should do a gnumake/make veryclean at the top of /src to make sure that the naming service stubs are regenerated. --------------------------------------------------------------------------- egcs-1.0 -------- Egcs-1.0 must be patched with the thread-safe exception handling patch by Teemu Torma for it to generate the correct code for running omniORB2. With the exception of the seq_tests and seq1.idl, the build passes all the tests in the omniORB2_testsuite. There is a compiler bug in egcs-1.0 that make it unable to compile some of the sequence templates in omniORB2. The bug might be fixed in the latest snapshot of egcs but I'm not certain. Teemu Torma's patch is reported to be working on Solaris, HPUX and AIX as well. Andrey Slepuhin has run the omniORB2_testsuite with egcs on AIX. Let me know if you have success in running the testsuite on other platforms. I've left my binaries for x86 Redhat linux 5.0 and alpha Redhat linux 5.0 in: ftp.uk.research.att.com:/pub/linux/egcs-1.0.alphabin.tgz (4M) and ftp.uk.research.att.com:/pub/linux/egcs-1.0.x86bin.tgz (4M) The diff against the unpatched egcs-1.0 is in: ftp.uk.research.att.com:/pub/linux/egcs-1.0-thread-safe-eh.diff (60K) The diff is based on Teemu Torma's patch + patch for RedHat 5.0 by H.J. Lu + my bug fix to get the thread-safe-eh stuff to work with linux-threads (or any draft 10 or later posix thread implementations). For x86 Redhat linux 5.0, you must update binutils to 2.8.1.0.17. If you are building the compiler yourself, you have to apply this patch to the resulting spec file: 23c23 < %{pg:-lgmon} %{pg:-lc_p} %{!pg:-lc} %{pthread:-lpthread} --- > %{pg:-lgmon} %{pg:-lc_p} %{!pg:-lc} %{pthread:-rpath /usr/local/lib/pthread -lpthread} This is to ensure that the thread-safe-eh version of the stdc++ library is picked up when the executable is run. --------------------------------------------------------------------------- Host-based access control ------------------------- A new hook is provided for plugging in access control policy modules to determine whether to accept new client connections. On unix platforms, an access control module based on Wietse Venema's tcp_wrapper_7.6 is implemented. Based on the client's IP address, the server can decide whether to accept or reject the connection. The access control policy is defined in 2 files: hosts.allow and hosts.deny. The default location of the files are in /etc. Alternatively, the pathname of these files can be specified in the GATEKEEPER_ALLOWFILE and GATEKEEPER_DENYFILE options in the omniORB configuration file (omniORB.cfg). E.g. GATEKEEPER_ALLOWFILE /project/omni/var/hosts.allow GATEKEEPER_DENYFILE /project/omni/var/hosts.deny The syntax of the files are described in the man page in /src/lib/omniORB2/gatekeepers/tcpwrapper/hosts_access.5 --------------------------------------------------------------------------- LifeCycle service support ------------------------- Support for lifecycle service is now included (thanks to Duncan Crisby). The code in /src/examples/lifecycle demonstrates how this is used. The documentation /src/examples/lifecycle/lchowto.ps contains further details. --------------------------------------------------------------------------- Bugs fixed ---------- The following bugs are fixed (except bug 12 which is MS VC++ specific and has no workaround): (1) // If a forward declared interface is used in a constructed type, and // that constructed type is used in a Union, Digital C++ complains about the // non-existance of CORBA::release() for that type. // (This is used in the destructor of the interfaceName_member template - // Digital C++, unlike other compilers, uses CORBA::release() instead of // T_Helper::release() - a previous bug with templates in Digital C++ ? ) // --- fixed interface intf1; struct aStruct { intf1 an_intf1; }; union unionb switch(long) { case 1: aStruct a; }; (2) // If typedef to forward declared interface, code is generated that tries to // create aliases for _proxy_, _sk_, and _nil_, which don't exist. // -- fixed typedef intf1 alias_intf1; (3) // If a forward declared interface is used in a Union, the member function // to set that interface uses interfaceName::_duplicate(), which may not // exist if the interface is defined in another IDL file. Should use // interfaceName_helper::duplicate() instead (have fixed this). // --- fixed union aUnion switch(long) { case 1: intf1 an_intf1; }; (4) // Incorrect code generated for anonymous arrays and sequences in exceptions. // --- fixed exception anException { long arrayLong[10]; sequence seqLong; }; (5) // Incorrect marshalling code generated for marshalling multi-dimensional // arrays of object references and for calculating size of the message using // NP_alignedSize. Generates a[_i0]._ptr[_i1]._ptr instead of a[_i0][i1]._ptr // (Have fixed the marshalling code for this, as it affects Any insertion // operator) // Digital C++ also complains about ambiguous type-conversions when // marshalling a multi-dimensional array _slice of object references // (both with and without the fix). // --- fixed interface intf4 { void anOp(); }; typedef intf4 multiIntf4[10][20]; interface intf5 { void anOp(in multiIntf4 a, out multiIntf4 b); }; (7) // Typedef to type Object yields typedefs with only one argument for // _proxy_ , _sk_, and _nil_ . // --- fixed typedef Object aliasObject; (8) // Union incorrectly places an array of fixed length Unions into // an anonymous Union (whether the array is anonymous or not). // SunPro C++ complains: // "Error: A union member cannot require initialization or destruction." // --- fixed union Union1 switch(long) { case 1: long a; }; typedef Union1 arrayUnion1[10]; union Union2 switch(long) { case 1: arrayUnion1 b; }; union Union3 switch(long) { case 1: Union1 b[10]; }; (9) // A sequence of arrays of sequences produces an incorrect declaration in the // stubs header (.hh) file. // --- fixed typedef sequence arraySeqLong[10]; typedef sequence seqArraySeqLong; #if !defined(TEST_EGCS) || (EGCS_MAJOR != 1 || EGCS_MINOR != 0) // The stub code of the following cannot be compiled by egcs-1.0 because of // a compiler bug. interface intf7 { seqArraySeqLong op(in seqArraySeqLong a1, inout seqArraySeqLong a2, out seqArraySeqLong a3); }; #endif (10) // Defining a typedef to an array will result in _alloc(), _free(), and // _dup() functions being declared for the alias. These functions are declared // as extern and implemented in the stub header file. This results in // multiply-defined clashes at link-time between the stubs skeleton (SK.cc) // file and any file including the stubs header (.hh) file. Fix is to declare // the functions as inline or friend inline. // --- Fixed typedef long arrayLong[10]; typedef arrayLong aliasArrayLong; (11) // An anonymous array in a union called d will result in the generation of // an alias called _d, which clashes with the _d() used to get the discriminant // value of the union // --- fixed union sampleUnion switch(long) { case 1: long d[10]; }; (12) // MSVC++ specific // If a multi-dimensional array of object references is used as the in // argument of an operation, MSVC++ 4.2 can't convert the type as necessary // when the upcall to the implementation is made in the dispatch function. // --- Not fixed interface intf8 { void op(); }; typedef intf8 multiIntf8[2][4][6]; #if !defined(TEST_MSVC) interface intf2 { void multiOp(in multiIntf8 inArg); }; #endif (13) _CORBA_Sequence template copy ctor should really allocate buffer according to the max size of the original. (14) Can now use OMNIORB_CONFIG environment variable on Win32 platforms to tell the ORB to read in the nameing service IOR.