diff options
author | stanleyk <stanleyk@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2013-01-28 16:19:56 +0000 |
---|---|---|
committer | stanleyk <stanleyk@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2013-01-28 16:19:56 +0000 |
commit | 8bf800a5aa61ff40ad94d4a0cc449d2824558840 (patch) | |
tree | 91ec7d44b9ccd964a53c07ed4fe543de64362c5e | |
parent | ace6321eaa7ac291095daa685dd14229e8b9314b (diff) | |
download | ATCD-8bf800a5aa61ff40ad94d4a0cc449d2824558840.tar.gz |
Merged with trunk. Resolved conflict on Options.hmtl.
42 files changed, 1369 insertions, 169 deletions
diff --git a/ACE/ChangeLog b/ACE/ChangeLog index 17abc81c3f8..ec7ef0059b3 100644 --- a/ACE/ChangeLog +++ b/ACE/ChangeLog @@ -1,3 +1,11 @@ +Mon Jan 28 07:55:27 UTC 2013 Johnny Willemsen <jwillemsen@remedy.nl> + + * ace/config-macosx-mountainlion.h: + * ace/config-macosx-mountain-lion.h: + * include/makeinclude/platform_macosx_mountainlion.GNU: + * include/makeinclude/platform_macosx_mountain_lion.GNU: + Renamed mountain-lion to mountainlion to simplify packaging + Tue Jan 22 12:28:19 UTC 2013 Johnny Willemsen <jwillemsen@remedy.nl> * ace/CDR_Size.h: diff --git a/ACE/OCI_RE_ChangeLog b/ACE/OCI_RE_ChangeLog index 621863e3310..c3e7962e97e 100644 --- a/ACE/OCI_RE_ChangeLog +++ b/ACE/OCI_RE_ChangeLog @@ -1,3 +1,17 @@ +Mon Jan 28 16:13:07 UTC 2013 "Kevin Stanley" <stanleyk@ociweb.com> + + * ace/config-macosx-lion.h: + * ace/config-macosx-mountainlion.h: + * ace/config-macosx-snowleopard.h: + * examples/Shared_Memory/test_MM.cpp: + * examples/Shared_Memory/test_SV.cpp: + * include/makeinclude/platform_macosx_mountainlion.GNU: + * ace/config-macosx-mountain-lion.h: + * include/makeinclude/platform_macosx_mountain_lion.GNU: + + Merged trunk into branch. The above files were changed in the + trunk. + Wed Dec 19 17:52:25 UTC 2012 Phil Mesnier <mesnier_p@ociweb.com> * ace/Mem_Map.inl: diff --git a/ACE/ace/config-macosx-lion.h b/ACE/ace/config-macosx-lion.h index 12c19660469..87fc5c7c9ec 100644 --- a/ACE/ace/config-macosx-lion.h +++ b/ACE/ace/config-macosx-lion.h @@ -2,7 +2,6 @@ #ifndef ACE_CONFIG_MACOSX_LION_H #define ACE_CONFIG_MACOSX_LION_H - #include "ace/config-macosx-leopard.h" #ifdef __clang__ diff --git a/ACE/ace/config-macosx-mountain-lion.h b/ACE/ace/config-macosx-mountainlion.h index 4173495276c..c8f6a08fbc5 100644 --- a/ACE/ace/config-macosx-mountain-lion.h +++ b/ACE/ace/config-macosx-mountainlion.h @@ -1,6 +1,6 @@ // $Id$ -#ifndef ACE_CONFIG_MACOSX_MOUNTAIN_LION_H -#define ACE_CONFIG_MACOSX_MOUNTAIN_LION_H +#ifndef ACE_CONFIG_MACOSX_MOUNTAINLION_H +#define ACE_CONFIG_MACOSX_MOUNTAINLION_H #include "ace/config-macosx-lion.h" diff --git a/ACE/ace/config-macosx-snowleopard.h b/ACE/ace/config-macosx-snowleopard.h index 76dbaf8916b..7d7341453d8 100644 --- a/ACE/ace/config-macosx-snowleopard.h +++ b/ACE/ace/config-macosx-snowleopard.h @@ -2,7 +2,6 @@ #ifndef ACE_CONFIG_MACOSX_SNOWLEOPARD_H #define ACE_CONFIG_MACOSX_SNOWLEOPARD_H - #include "ace/config-macosx-leopard.h" #ifdef __clang__ diff --git a/ACE/examples/Shared_Memory/test_MM.cpp b/ACE/examples/Shared_Memory/test_MM.cpp index 27184bb8e2d..cfb3f5a1af0 100644 --- a/ACE/examples/Shared_Memory/test_MM.cpp +++ b/ACE/examples/Shared_Memory/test_MM.cpp @@ -6,8 +6,6 @@ #include "ace/OS_NS_unistd.h" #include "ace/OS_NS_stdlib.h" - - #define SHMSZ 27 ACE_TCHAR shm_key[] = ACE_TEXT ("/tmp/fooXXXXXX"); diff --git a/ACE/examples/Shared_Memory/test_SV.cpp b/ACE/examples/Shared_Memory/test_SV.cpp index ce7e2218115..7745bc641ab 100644 --- a/ACE/examples/Shared_Memory/test_SV.cpp +++ b/ACE/examples/Shared_Memory/test_SV.cpp @@ -4,8 +4,6 @@ #include "ace/Log_Msg.h" #include "ace/OS_NS_unistd.h" - - #define SHMSZ 27 #define SHM_KEY (key_t) 5678 diff --git a/ACE/include/makeinclude/platform_macosx_mountain_lion.GNU b/ACE/include/makeinclude/platform_macosx_mountainlion.GNU index 5899db19fa2..5899db19fa2 100644 --- a/ACE/include/makeinclude/platform_macosx_mountain_lion.GNU +++ b/ACE/include/makeinclude/platform_macosx_mountainlion.GNU diff --git a/CIAO/ChangeLog b/CIAO/ChangeLog index dd7f18638ad..8b5653eba5a 100644 --- a/CIAO/ChangeLog +++ b/CIAO/ChangeLog @@ -1,3 +1,18 @@ +Mon Jan 28 10:11:13 UTC 2013 Johnny Willemsen <jwillemsen@remedy.nl> + + * bin/ciao_tests.lst: + * tests/Bug_4086_Regression/Bug_4086_Regression.mpc: + * tests/Bug_4086_Regression/Foo.idl: + * tests/Bug_4086_Regression/Foo_exec.h: + * tests/Bug_4086_Regression/Foo_exec.cpp: + * tests/Bug_4086_Regression/descriptors/DeploymentPlan.cdp: + * tests/Bug_4086_Regression/descriptors/run_test.pl: + * tests/Bug_4086_Regression/descriptors/run_test_cdr.pl: + New test for components with attributes as part of + supported interfaces. Thanks to Jiang Wei + <jiangwei_1976 at yahoo dot com dot cn> for reporting this and + providing the patch and unit test + Mon Jan 21 08:16:41 UTC 2013 Johnny Willemsen <jwillemsen@remedy.nl> * bin/ciao_tests.lst: diff --git a/CIAO/bin/ciao_tests.lst b/CIAO/bin/ciao_tests.lst index f0e2422006b..a3b1f61abd6 100644 --- a/CIAO/bin/ciao_tests.lst +++ b/CIAO/bin/ciao_tests.lst @@ -39,6 +39,8 @@ TAO/CIAO/tests/Bug_3832_Regression/run_test.pl: TAO/CIAO/tests/Bug_3936_Regression/run_test.pl TAO/CIAO/tests/Bug_3937_Regression/run_test.pl TAO/CIAO/tests/Bug_3944_Regression/run_test.pl +TAO/CIAO/tests/Bug_4086_Regression/descriptors/run_test.pl: +TAO/CIAO/tests/Bug_4086_Regression/descriptors/run_test_cdr.pl: TAO/CIAO/tests/IDL_Test/Cornucopia/run_test.pl: DOXYGEN TAO/CIAO/tests/Cookies/run_test.pl TAO/CIAO/tests/TTSCTest/descriptors/run_test.pl: diff --git a/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_DifferentProcesses.cdp b/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_DifferentProcesses.cdp index a7a9720e8f9..a7a9720e8f9 100755..100644 --- a/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_DifferentProcesses.cdp +++ b/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_DifferentProcesses.cdp diff --git a/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_SameProcess.cdp b/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_SameProcess.cdp index d57913ded9c..d57913ded9c 100755..100644 --- a/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_SameProcess.cdp +++ b/CIAO/tests/Bug_3834_Regression/descriptors/PlanLocality_SameProcess.cdp diff --git a/CIAO/tests/Bug_4086_Regression/Bug_4086_Regression.mpc b/CIAO/tests/Bug_4086_Regression/Bug_4086_Regression.mpc new file mode 100644 index 00000000000..9018cb37cd2 --- /dev/null +++ b/CIAO/tests/Bug_4086_Regression/Bug_4086_Regression.mpc @@ -0,0 +1,122 @@ +// $Id$ +// This file is generated with "generate_component_mpc.pl Foo" + +project(*idl_gen) : componentidldefaults { + custom_only = 1 + idlflags += -Wb,stub_export_macro=FOO_STUB_Export \ + -Wb,stub_export_include=Foo_stub_export.h \ + -Wb,skel_export_macro=FOO_SVNT_Export \ + -Wb,skel_export_include=Foo_svnt_export.h \ + -Wb,exec_export_macro=FOO_EXEC_Export \ + -Wb,exec_export_include=Foo_exec_export.h + + IDL_Files { + Foo.idl + } +} + +project(*lem_gen) : ciaoidldefaults { + after += *idl_gen + custom_only = 1 + idlflags += -Wb,stub_export_macro=FOO_LEM_STUB_Export \ + -Wb,stub_export_include=Foo_lem_stub_export.h \ + -SS -Gxhst + + IDL_Files { + FooE.idl + } +} + +project(*lem_stub) : ccm_svnt { + after += *lem_gen *stub + libs += Foo_stub + sharedname = Foo_lem_stub + dynamicflags += FOO_LEM_STUB_BUILD_DLL + + IDL_Files { + } + + Source_Files { + FooEC.cpp + } + + Header_Files { + FooEC.h + Foo_lem_stub_export.h + } + + Inline_Files { + FooEC.inl + } +} + +project(*stub) : ccm_stub { + after += *idl_gen + libs += + sharedname = Foo_stub + dynamicflags += FOO_STUB_BUILD_DLL + + IDL_Files { + } + + Source_Files { + FooC.cpp + } + + Header_Files { + FooC.h + Foo_stub_export.h + } + + Inline_Files { + FooC.inl + } +} + +project(*exec) : ciao_executor { + after += *lem_stub *stub + sharedname = Foo_exec + libs += Foo_stub Foo_lem_stub + dynamicflags += FOO_EXEC_BUILD_DLL + + IDL_Files { + } + + Source_Files { + Foo_exec.cpp + } + + Header_Files { + Foo_exec.h + Foo_exec_export.h + } + + Inline_Files { + } +} + +project(*svnt) : ciao_servant { + after += *lem_stub + sharedname = Foo_svnt + libs += Foo_stub Foo_lem_stub + dynamicflags += FOO_SVNT_BUILD_DLL + + IDL_Files { + } + + Source_Files { + FooS.cpp + Foo_svnt.cpp + } + + Header_Files { + FooS.h + Foo_svnt.h + Foo_svnt_export.h + } + + Inline_Files { + } +} + + diff --git a/CIAO/tests/Bug_4086_Regression/Foo.idl b/CIAO/tests/Bug_4086_Regression/Foo.idl new file mode 100644 index 00000000000..7d3672d5806 --- /dev/null +++ b/CIAO/tests/Bug_4086_Regression/Foo.idl @@ -0,0 +1,21 @@ +// $Id$ + +#ifndef FOO_IDL_ +#define FOO_IDL_ + +#include <Components.idl> + +interface FooSupportBase +{ + attribute short supported_short; +}; + +interface FooSupport : FooSupportBase +{ +}; + +component Foo supports FooSupport +{ +}; + +#endif /* FOO_IDL_ */ diff --git a/CIAO/tests/Bug_4086_Regression/Foo_exec.cpp b/CIAO/tests/Bug_4086_Regression/Foo_exec.cpp new file mode 100644 index 00000000000..594db22db4f --- /dev/null +++ b/CIAO/tests/Bug_4086_Regression/Foo_exec.cpp @@ -0,0 +1,95 @@ +// -*- C++ -*- +// $Id$ + +#include "Foo_exec.h" + +namespace CIAO_Foo_Impl +{ + //============================================================ + // Component Executor Implementation Class: Foo_exec_i + //============================================================ + + Foo_exec_i::Foo_exec_i (void) + : supported_short_ (false) + { + } + + Foo_exec_i::~Foo_exec_i (void) + { + } + + // Supported operations and attributes. + + ::CORBA::Short + Foo_exec_i::supported_short (void) + { + /* Your code here. */ + return 0; + } + + void + Foo_exec_i::supported_short ( + const ::CORBA::Short supported_short) + { + if(supported_short != 11) + ACE_ERROR ((LM_ERROR, "ERROR: supported_short != 11, it is %d\n", supported_short)); + else supported_short_ = true; + + } + + // Operations from Components::SessionComponent. + + void + Foo_exec_i::set_session_context ( + ::Components::SessionContext_ptr ctx) + { + this->context_ = + ::CCM_Foo_Context::_narrow (ctx); + + if ( ::CORBA::is_nil (this->context_.in ())) + { + throw ::CORBA::INTERNAL (); + } + } + + void + Foo_exec_i::configuration_complete (void) + { + } + + void + Foo_exec_i::ccm_activate (void) + { + if (! supported_short_ ) + { + ACE_ERROR ((LM_ERROR, "ERROR: Not all expected attributes were initialized\n")); + } + else + { + ACE_DEBUG ((LM_DEBUG, "OK: All attributes were correctly initialized\n")); + } + } + + void + Foo_exec_i::ccm_passivate (void) + { + } + + void + Foo_exec_i::ccm_remove (void) + { + } + + extern "C" FOO_EXEC_Export ::Components::EnterpriseComponent_ptr + create_Foo_Impl (void) + { + ::Components::EnterpriseComponent_ptr retval = + ::Components::EnterpriseComponent::_nil (); + + ACE_NEW_NORETURN ( + retval, + Foo_exec_i); + + return retval; + } +} diff --git a/CIAO/tests/Bug_4086_Regression/Foo_exec.h b/CIAO/tests/Bug_4086_Regression/Foo_exec.h new file mode 100644 index 00000000000..6514ee311e8 --- /dev/null +++ b/CIAO/tests/Bug_4086_Regression/Foo_exec.h @@ -0,0 +1,64 @@ +// -*- C++ -*- +// $Id$ + +#ifndef CIAO_FOO_EXEC_H_ +#define CIAO_FOO_EXEC_H_ + +#include "FooEC.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include /**/ "Foo_exec_export.h" +#include "tao/LocalObject.h" + +namespace CIAO_Foo_Impl +{ + class FOO_EXEC_Export Foo_exec_i + : public virtual Foo_Exec, + public virtual ::CORBA::LocalObject + { + public: + Foo_exec_i (void); + virtual ~Foo_exec_i (void); + + //@{ + /** Supported operations and attributes. */ + + virtual ::CORBA::Short + supported_short (void); + + virtual void + supported_short ( + ::CORBA::Short supported_short); + //@} + + + //@{ + /** Operations from Components::SessionComponent. */ + + virtual void + set_session_context ( + ::Components::SessionContext_ptr ctx); + + virtual void configuration_complete (void); + + virtual void ccm_activate (void); + virtual void ccm_passivate (void); + virtual void ccm_remove (void); + //@} + + + private: + ::CCM_Foo_Context_var context_; + + bool supported_short_; + }; + + extern "C" FOO_EXEC_Export ::Components::EnterpriseComponent_ptr + create_Foo_Impl (void); +} + +#endif /* ifndef */ + diff --git a/CIAO/tests/Bug_4086_Regression/descriptors/DeploymentPlan.cdp b/CIAO/tests/Bug_4086_Regression/descriptors/DeploymentPlan.cdp new file mode 100644 index 00000000000..6f5f3e15777 --- /dev/null +++ b/CIAO/tests/Bug_4086_Regression/descriptors/DeploymentPlan.cdp @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no" ?> +<!-- $Id$ --> +<Deployment:DeploymentPlan xmlns:Deployment="http://www.omg.org/Deployment" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/Deployment Deployment.xsd"> + + <UUID>e4a58f39-c343-4988-b7af-af6ad9ded5e2</UUID> + + <implementation xmi:id="_936b6d23-5a31-4241-b681-1dcd0d4180ee"> + <name>PICML_default_xme_file.ComponentImplementations.FooImpl.FooImpl</name> + <source/> + <artifact xmi:idref="_936b6d23-5a31-4241-b682-1dcd0d4180ee"/> + <artifact xmi:idref="_936b6d23-5a31-4241-b683-1dcd0d4180ee"/> + <execParameter> + <name>component factory</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>create_Foo_Impl</string> + </value> + </value> + </execParameter> + <execParameter> + <name>edu.vanderbilt.dre.CIAO.ExecutorArtifact</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>PICML_default_xme_file.ImplementationArtifacts.FooArtifacts.Foo_exec</string> + </value> + </value> + </execParameter> + <execParameter> + <name>edu.vanderbilt.dre.CIAO.ServantEntrypoint</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>create_Foo_Servant</string> + </value> + </value> + </execParameter> + <execParameter> + <name>edu.vanderbilt.dre.CIAO.ServantArtifact</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>PICML_default_xme_file.ImplementationArtifacts.FooArtifacts.Foo_svnt</string> + </value> + </value> + </execParameter> + </implementation> + + <instance xmi:id="_d6fbd4f9-1bc4-46eb-af5f-2b1ef5bf1ae8"> + <name>PICML_default_xme_file.ComponentImplementations.ComponentImplementationContainer.ComponentAssembly.Foo</name> + <node>NodeOne</node> + <source/> + <implementation xmi:idref="_936b6d23-5a31-4241-b681-1dcd0d4180ee"/> + <configProperty> + <name>edu.vanderbilt.dre.DAnCE.InstanceIOR</name> + <value> + <type> + <kind>tk_string</kind> + </type> + <value> + <string>FooImpl.ior</string> + </value> + </value> + </configProperty> + <configProperty> + <name>supported_short</name> + <value> + <type> + <kind>tk_short</kind> + </type> + <value> + <short>11</short> + </value> + </value> + </configProperty> + </instance> + + <artifact xmi:id="_936b6d23-5a31-4241-b682-1dcd0d4180ee"> + <name>PICML_default_xme_file.ImplementationArtifacts.FooArtifacts.Foo_svnt</name> + <source/> + <node/> + <location>Foo_svnt</location> + </artifact> + + <artifact xmi:id="_936b6d23-5a31-4241-b683-1dcd0d4180ee"> + <name>PICML_default_xme_file.ImplementationArtifacts.FooArtifacts.Foo_exec</name> + <source/> + <node/> + <location>Foo_exec</location> + </artifact> + + <localityConstraint> + <constraint>SameProcess</constraint> + <constrainedInstance xmi:idref="_d6fbd4f9-1bc4-46eb-af5f-2b1ef5bf1ae8"/> + </localityConstraint> + +</Deployment:DeploymentPlan> diff --git a/CIAO/tests/Bug_4086_Regression/descriptors/run_test.pl b/CIAO/tests/Bug_4086_Regression/descriptors/run_test.pl new file mode 100755 index 00000000000..33f087ecba9 --- /dev/null +++ b/CIAO/tests/Bug_4086_Regression/descriptors/run_test.pl @@ -0,0 +1,234 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- + +use lib "$ENV{'ACE_ROOT'}/bin"; +use PerlACE::TestTarget; + +$CIAO_ROOT = "$ENV{'CIAO_ROOT'}"; +$TAO_ROOT = "$ENV{'TAO_ROOT'}"; +$DANCE_ROOT = "$ENV{'DANCE_ROOT'}"; + +$daemons_running = 0; +$em_running = 0; +$ns_running = 0; + +$nr_daemon = 1; +@ports = ( 60001 ); +@iorbases = ( "NodeApp2.ior" ); +@iorfiles = 0; +@nodenames = ( "NodeOne" ); + +# ior files other than daemon +# ior files other than daemon +$ior_nsbase = "ns.ior"; +$ior_nsfile = 0; +$ior_embase = "EM.ior"; +$ior_emfile = 0; + +# Processes +$E = 0; +$EM = 0; +$NS = 0; +@DEAMONS = 0; + +# targets +@tg_daemons = 0; +$tg_naming = 0; +$tg_exe_man = 0; +$tg_executor = 0; + +$status = 0; +$cdp_file = "DeploymentPlan.cdp"; + +sub create_targets { + # naming service + $tg_naming = PerlACE::TestTarget::create_target (1) || die "Create target for ns failed\n"; + $tg_naming->AddLibPath ('..'); + # daemon + for ($i = 0; $i < $nr_daemon; ++$i) { + $tg_daemons[$i] = PerlACE::TestTarget::create_target ($i+1) || die "Create target for daemon $i failed\n"; + $tg_daemons[$i]->AddLibPath ('..'); + } + # execution manager + $tg_exe_man = PerlACE::TestTarget::create_target (1) || die "Create target for EM failed\n"; + $tg_exe_man->AddLibPath ('..'); + # executor (plan_launcher) + $tg_executor = PerlACE::TestTarget::create_target (1) || die "Create target for executor failed\n"; + $tg_executor->AddLibPath ('..'); +} + +sub init_ior_files { + $ior_nsfile = $tg_naming->LocalFile ($ior_nsbase); + $ior_emfile = $tg_exe_man->LocalFile ($ior_embase); + for ($i = 0; $i < $nr_daemon; ++$i) { + $iorfiles[$i] = $tg_daemons[$i]->LocalFile ($iorbases[$i]); + } + delete_ior_files (); +} + +# Delete if there are any .ior files. +sub delete_ior_files { + for ($i = 0; $i < $nr_daemon; ++$i) { + $tg_daemons[$i]->DeleteFile ($iorbases[$i]); + } + $tg_naming->DeleteFile ($ior_nsbase); + $tg_exe_man->DeleteFile ($ior_embase); + for ($i = 0; $i < $nr_daemon; ++$i) { + $iorfiles[$i] = $tg_daemons[$i]->LocalFile ($iorbases[$i]); + } +} + +sub kill_node_daemon { + for ($i = 0; $i < $nr_daemon; ++$i) { + $DEAMONS[$i]->Kill (); $DEAMONS[$i]->TimedWait (1); + } +} + +sub kill_open_processes { + if ($daemons_running == 1) { + kill_node_daemon (); + } + + if ($em_running == 1) { + $EM->Kill (); $EM->TimedWait (1); + } + + if ($ns_running == 1) { + $NS->Kill (); $NS->TimedWait (1); + } + # in case shutdown did not perform as expected + $tg_executor->KillAll ('dance_locality_manager'); +} + +sub run_node_daemons { + for ($i = 0; $i < $nr_daemon; ++$i) { + $iorbase = $iorbases[$i]; + $iorfile = $iorfiles[$i]; + $port = $ports[$i]; + $nodename = $nodenames[$i]; + $iiop = "iiop://localhost:$port"; + $node_app = $tg_daemons[$i]->GetArchDir("$DANCE_ROOT/bin/") . "dance_locality_manager"; + + $d_cmd = "$DANCE_ROOT/bin/dance_node_manager"; + $d_param = "-ORBEndpoint $iiop -s $node_app -n $nodename=$iorfile -t 30 --domain-nc corbaloc:rir:/NameService --instance-nc corbaloc:rir:/NameService"; + + print "Run dance_node_manager with $d_param\n"; + + $DEAMONS[$i] = $tg_daemons[$i]->CreateProcess ($d_cmd, $d_param); + $DEAMONS[$i]->Spawn (); + + if ($tg_daemons[$i]->WaitForFileTimed($iorbase, + $tg_daemons[$i]->ProcessStartWaitInterval ()) == -1) { + print STDERR + "ERROR: The ior $iorfile file of node daemon $i could not be found\n"; + for (; $i >= 0; --$i) { + $DEAMONS[$i]->Kill (); $DEAMONS[$i]->TimedWait (1); + } + return -1; + } + } + return 0; +} + +create_targets (); +init_ior_files (); + +# Invoke naming service + +$NS = $tg_naming->CreateProcess ("$TAO_ROOT/orbsvcs/Naming_Service/tao_cosnaming", " -ORBEndpoint iiop://localhost:60003 -o $ior_nsfile"); + +$ns_status = $NS->Spawn (); + +if ($ns_status != 0) { + print STDERR "ERROR: Unable to execute the naming service\n"; + kill_open_processes (); + exit 1; +} + +print STDERR "Starting Naming Service with -ORBEndpoint iiop://localhost:60003 -o ns.ior\n"; + +if ($tg_naming->WaitForFileTimed ($ior_nsbase, + $tg_naming->ProcessStartWaitInterval ()) == -1) { + print STDERR "ERROR: cannot find naming service IOR file\n"; + $NS->Kill (); $NS->TimedWait (1); + exit 1; +} + +$ns_running = 1; +# Set up NamingService environment +$ENV{"NameServiceIOR"} = "corbaloc:iiop:localhost:60003/NameService"; + +# Invoke node daemon. +print "Invoking node daemon\n"; +$status = run_node_daemons (); + +if ($status != 0) { + print STDERR "ERROR: Unable to execute the node daemon\n"; + kill_open_processes (); + exit 1; +} + +$daemons_running = 1; + +# Invoke execution manager. +print "Invoking execution manager (dance_execution_manager.exe) with -e$ior_emfile\n"; +$EM = $tg_exe_man->CreateProcess ("$DANCE_ROOT/bin/dance_execution_manager", + "-e$ior_emfile --domain-nc corbaloc:rir:/NameService"); +$EM->Spawn (); + +if ($tg_exe_man->WaitForFileTimed ($ior_embase, + $tg_exe_man->ProcessStartWaitInterval ()) == -1) { + print STDERR + "ERROR: The ior file of execution manager could not be found\n"; + kill_open_processes (); + exit 1; +} + +$em_running = 1; + +# Invoke executor - start the application -. +print "Invoking executor - launch the application -\n"; + +print "Start dance_plan_launcher.exe with -x $cdp_file -k file://$ior_emfile\n"; +$E = $tg_executor->CreateProcess ("$DANCE_ROOT/bin/dance_plan_launcher", + "-x $cdp_file -k file://$ior_emfile"); +$E->SpawnWaitKill (2*$tg_executor->ProcessStartWaitInterval ()); + +for ($i = 0; $i < $nr_daemon; ++$i) { + if ($tg_daemons[$i]->WaitForFileTimed ($iorbases[$i], + $tg_daemons[$i]->ProcessStopWaitInterval ()) == -1) { + print STDERR "ERROR: The ior file of daemon $i could not be found\n"; + kill_open_processes (); + exit 1; + } +} + +print "Sleeping 5 seconds to allow task to complete\n"; +sleep (5); + +# Invoke executor - stop the application -. +print "Invoking executor - stop the application -\n"; +print "by running dance_plan_launcher.exe with -k file://$ior_emfile -x $cdp_file\n"; + +$E = $tg_executor->CreateProcess ("$DANCE_ROOT/bin/dance_plan_launcher", + "-k file://$ior_emfile -x $cdp_file -s"); + +$pl_status = $E->SpawnWaitKill ($tg_executor->ProcessStartWaitInterval ()); + +if ($pl_status != 0) { + print STDERR "ERROR: dance_plan_launcher returned $pl_status\n"; + kill_open_processes (); + exit 1; +} + +print "Executor returned.\n"; +print "Shutting down rest of the processes.\n"; + +delete_ior_files (); +kill_open_processes (); + +exit $status; diff --git a/CIAO/tests/Bug_4086_Regression/descriptors/run_test_cdr.pl b/CIAO/tests/Bug_4086_Regression/descriptors/run_test_cdr.pl new file mode 100755 index 00000000000..ead7a7c7e98 --- /dev/null +++ b/CIAO/tests/Bug_4086_Regression/descriptors/run_test_cdr.pl @@ -0,0 +1,251 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- + +use lib "$ENV{'ACE_ROOT'}/bin"; +use PerlACE::TestTarget; + +$CIAO_ROOT = "$ENV{'CIAO_ROOT'}"; +$TAO_ROOT = "$ENV{'TAO_ROOT'}"; +$DANCE_ROOT = "$ENV{'DANCE_ROOT'}"; + +$daemons_running = 0; +$em_running = 0; +$ns_running = 0; + +$nr_daemon = 1; +@ports = ( 60001 ); +@iorbases = ( "NodeApp2.ior" ); +@iorfiles = 0; +@nodenames = ( "NodeOne" ); + +# ior files other than daemon +# ior files other than daemon +$ior_nsbase = "ns.ior"; +$ior_nsfile = 0; +$ior_embase = "EM.ior"; +$ior_emfile = 0; + +# Processes +$E = 0; +$EM = 0; +$NS = 0; +@DEAMONS = 0; + +# targets +@tg_daemons = 0; +$tg_naming = 0; +$tg_exe_man = 0; +$tg_executor = 0; + +$status = 0; +$cdp_file = "DeploymentPlan.cdp"; + +sub create_targets { + # naming service + $tg_naming = PerlACE::TestTarget::create_target (1) || die "Create target for ns failed\n"; + $tg_naming->AddLibPath ('..'); + # daemon + for ($i = 0; $i < $nr_daemon; ++$i) { + $tg_daemons[$i] = PerlACE::TestTarget::create_target ($i+1) || die "Create target for daemon $i failed\n"; + $tg_daemons[$i]->AddLibPath ('..'); + } + # execution manager + $tg_exe_man = PerlACE::TestTarget::create_target (1) || die "Create target for EM failed\n"; + $tg_exe_man->AddLibPath ('..'); + # executor (plan_launcher) + $tg_executor = PerlACE::TestTarget::create_target (1) || die "Create target for executor failed\n"; + $tg_executor->AddLibPath ('..'); +} + +sub init_ior_files { + $ior_nsfile = $tg_naming->LocalFile ($ior_nsbase); + $ior_emfile = $tg_exe_man->LocalFile ($ior_embase); + for ($i = 0; $i < $nr_daemon; ++$i) { + $iorfiles[$i] = $tg_daemons[$i]->LocalFile ($iorbases[$i]); + } + delete_ior_files (); +} + +# Delete if there are any .ior files. +sub delete_ior_files { + for ($i = 0; $i < $nr_daemon; ++$i) { + $tg_daemons[$i]->DeleteFile ($iorbases[$i]); + } + $tg_naming->DeleteFile ($ior_nsbase); + $tg_exe_man->DeleteFile ($ior_embase); + for ($i = 0; $i < $nr_daemon; ++$i) { + $iorfiles[$i] = $tg_daemons[$i]->LocalFile ($iorbases[$i]); + } +} + +sub kill_node_daemon { + for ($i = 0; $i < $nr_daemon; ++$i) { + $DEAMONS[$i]->Kill (); $DEAMONS[$i]->TimedWait (1); + } +} + +sub kill_open_processes { + if ($daemons_running == 1) { + kill_node_daemon (); + } + + if ($em_running == 1) { + $EM->Kill (); $EM->TimedWait (1); + } + + if ($ns_running == 1) { + $NS->Kill (); $NS->TimedWait (1); + } + # in case shutdown did not perform as expected + $tg_executor->KillAll ('dance_locality_manager'); +} + +sub run_node_daemons { + for ($i = 0; $i < $nr_daemon; ++$i) { + $iorbase = $iorbases[$i]; + $iorfile = $iorfiles[$i]; + $port = $ports[$i]; + $nodename = $nodenames[$i]; + $iiop = "iiop://localhost:$port"; + $node_app = $tg_daemons[$i]->GetArchDir("$DANCE_ROOT/bin/") . "dance_locality_manager"; + + $d_cmd = "$DANCE_ROOT/bin/dance_node_manager"; + $d_param = "-ORBEndpoint $iiop -s $node_app -n $nodename=$iorfile -t 30 --domain-nc corbaloc:rir:/NameService --instance-nc corbaloc:rir:/NameService"; + + print "Run dance_node_manager with $d_param\n"; + + $DEAMONS[$i] = $tg_daemons[$i]->CreateProcess ($d_cmd, $d_param); + $DEAMONS[$i]->Spawn (); + + if ($tg_daemons[$i]->WaitForFileTimed($iorbase, + $tg_daemons[$i]->ProcessStartWaitInterval ()) == -1) { + print STDERR + "ERROR: The ior $iorfile file of node daemon $i could not be found\n"; + for (; $i >= 0; --$i) { + $DEAMONS[$i]->Kill (); $DEAMONS[$i]->TimedWait (1); + } + return -1; + } + } + return 0; +} + +create_targets (); +init_ior_files (); + +# Invoke naming service + +$NS = $tg_naming->CreateProcess ("$TAO_ROOT/orbsvcs/Naming_Service/tao_cosnaming", " -ORBEndpoint iiop://localhost:60003 -o $ior_nsfile"); + +$ns_status = $NS->Spawn (); + +if ($ns_status != 0) { + print STDERR "ERROR: Unable to execute the naming service\n"; + kill_open_processes (); + exit 1; +} + +print STDERR "Starting Naming Service with -ORBEndpoint iiop://localhost:60003 -o ns.ior\n"; + +if ($tg_naming->WaitForFileTimed ($ior_nsbase, + $tg_naming->ProcessStartWaitInterval ()) == -1) { + print STDERR "ERROR: cannot find naming service IOR file\n"; + $NS->Kill (); $NS->TimedWait (1); + exit 1; +} + +$ns_running = 1; +# Set up NamingService environment +$ENV{"NameServiceIOR"} = "corbaloc:iiop:localhost:60003/NameService"; + +# Invoke node daemon. +print "Invoking node daemon\n"; +$status = run_node_daemons (); + +if ($status != 0) { + print STDERR "ERROR: Unable to execute the node daemon\n"; + kill_open_processes (); + exit 1; +} + +$cdr_file = $cdp_file; +$cdr_file =~ s/cdp/cdr/; + +print "Converting $cdp_file to $cdr_file\n"; + +$tg_executor->DeleteFile ($cdr_file); + +$CONVERT = $tg_executor->CreateProcess ("$DANCE_ROOT/bin/dance_convert_plan", "-x $cdp_file -o $cdr_file"); + +$convert_status = $CONVERT->SpawnWaitKill ($tg_executor->ProcessStartWaitInterval ()); + +if ($convert_status != 0) { + print STDERR "ERROR: Can't convert $cdp_file to $cdr_file\n"; + kill_open_processes (); + exit 1; +} + +$daemons_running = 1; + +# Invoke execution manager. +print "Invoking execution manager (dance_execution_manager.exe) with -e$ior_emfile\n"; +$EM = $tg_exe_man->CreateProcess ("$DANCE_ROOT/bin/dance_execution_manager", + "-e$ior_emfile --domain-nc corbaloc:rir:/NameService"); +$EM->Spawn (); + +if ($tg_exe_man->WaitForFileTimed ($ior_embase, + $tg_exe_man->ProcessStartWaitInterval ()) == -1) { + print STDERR + "ERROR: The ior file of execution manager could not be found\n"; + kill_open_processes (); + exit 1; +} + +$em_running = 1; + +# Invoke executor - start the application -. +print "Invoking executor - launch the application -\n"; + +print "Start dance_plan_launcher.exe with -c $cdr_file -k file://$ior_emfile\n"; +$E = $tg_executor->CreateProcess ("$DANCE_ROOT/bin/dance_plan_launcher", + "-c $cdr_file -k file://$ior_emfile"); +$E->SpawnWaitKill (2*$tg_executor->ProcessStartWaitInterval ()); + +for ($i = 0; $i < $nr_daemon; ++$i) { + if ($tg_daemons[$i]->WaitForFileTimed ($iorbases[$i], + $tg_daemons[$i]->ProcessStopWaitInterval ()) == -1) { + print STDERR "ERROR: The ior file of daemon $i could not be found\n"; + kill_open_processes (); + exit 1; + } +} + +print "Sleeping 5 seconds to allow task to complete\n"; +sleep (5); + +# Invoke executor - stop the application -. +print "Invoking executor - stop the application -\n"; +print "by running dance_plan_launcher.exe with -k file://$ior_emfile -c $cdr_file\n"; + +$E = $tg_executor->CreateProcess ("$DANCE_ROOT/bin/dance_plan_launcher", + "-k file://$ior_emfile -c $cdr_file -s"); + +$pl_status = $E->SpawnWaitKill ($tg_executor->ProcessStartWaitInterval ()); + +if ($pl_status != 0) { + print STDERR "ERROR: dance_plan_launcher returned $pl_status\n"; + kill_open_processes (); + exit 1; +} + +print "Executor returned.\n"; +print "Shutting down rest of the processes.\n"; + +delete_ior_files (); +kill_open_processes (); + +exit $status; diff --git a/TAO/ChangeLog b/TAO/ChangeLog index 1168993b06e..ab22bb18272 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,3 +1,53 @@ +Mon Jan 28 12:44:24 UTC 2013 Johnny Willemsen <jwillemsen@remedy.nl> + + * examples/Advanced/ch_12/client.cpp: + * examples/Advanced/ch_18/client.cpp: + * examples/Advanced/ch_21/client.cpp: + * examples/Advanced/ch_8_and_10/client.cpp: + Fixed compile errors when ostream streaming is enabled + in TAO_IDL + +Mon Jan 28 11:26:06 UTC 2013 Johnny Willemsen <jwillemsen@remedy.nl> + + * TAO_IDL/be/be_visitor_interface/interface_ch.cpp: + * TAO_IDL/be/be_visitor_interface/interface_cs.cpp: + Generate also ostream insertion methods for components + + * tao/DynamicInterface/Request.h: + Doxygen fixes + +Fri Jan 25 13:55:00 UTC 2013 Simon Massey <simon dot massey at prismtech dot com> + + * orbsvcs/tests/Miop/McastFragmentation/server.cpp: + Correction. + +Fri Jan 25 13:35:00 UTC 2013 Simon Massey <simon dot massey at prismtech dot com> + + * orbsvcs/orbsvcs/PortableGroup/miop_resource.cpp: + * orbsvcs/tests/Miop/McastFragmentation/client.cpp: + * orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.cpp: + * orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.h: + * orbsvcs/tests/Miop/McastFragmentation/run_test.pl: + * orbsvcs/tests/Miop/McastFragmentation/run_test_ipv6.pl: + * orbsvcs/tests/Miop/McastFragmentation/server.cpp: + Missed the parameter parsing changes from the last update and report + possiable problems from the McastFragmentation test but make the test + less demanding for the scoreboard systems. + +Thu Jan 24 15:51:00 UTC 2013 Simon Massey <simon dot massey at prismtech dot com> + + * NEWS: + * doc/Options.h: + * orbsvcs/orbsvcs/PortableGroup/miop_resource.cpp: + * orbsvcs/orbsvcs/PortableGroup/miop_resource.h: + * orbsvcs/orbsvcs/PortableGroup/miopconf.h: + * orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.cpp: + * orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.h: + * orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp: + Added MIOP configuration options -ORBSendThrottling and -ORBEagerDequeueing, + along with #define overrides for their default settings. See the descriptions + in the MIOP section of doc/Options.html for their use. + Wed Jan 23 19:43:50 UTC 2013 Adam Mitz <mitza@ociweb.com> * tao/RTScheduling/Request_Interceptor.cpp: @@ -1,6 +1,10 @@ USER VISIBLE CHANGES BETWEEN TAO-2.1.7 and TAO-2.1.8 ==================================================== +. Added MIOP configuration options -ORBSendThrottling and -ORBEagerDequeueing, + along with #define overrides for their default settings. See the descriptions + in the MIOP section of doc/Options.html for their use. + USER VISIBLE CHANGES BETWEEN TAO-2.1.6 and TAO-2.1.7 ==================================================== diff --git a/TAO/OCI_RE_ChangeLog b/TAO/OCI_RE_ChangeLog index 0d334690cc8..551c7c05db4 100644 --- a/TAO/OCI_RE_ChangeLog +++ b/TAO/OCI_RE_ChangeLog @@ -1,3 +1,32 @@ +Mon Jan 28 16:09:03 UTC 2013 "Kevin Stanley" <stanleyk@ociweb.com> + * docs/Options.html: + + Resolved conflict between trunk update and branch changes. + + * NEWS: + * TAO_IDL/be/be_visitor_interface/interface_ch.cpp: + * TAO_IDL/be/be_visitor_interface/interface_cs.cpp: + * examples/Advanced/ch_12/client.cpp: + * examples/Advanced/ch_18/client.cpp: + * examples/Advanced/ch_21/client.cpp: + * examples/Advanced/ch_8_and_10/client.cpp: + * orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.h: + * orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.cpp: + * orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp: + * orbsvcs/orbsvcs/PortableGroup/miop_resource.h: + * orbsvcs/orbsvcs/PortableGroup/miop_resource.cpp: + * orbsvcs/orbsvcs/PortableGroup/miopconf.h: + * orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.h: + * orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.cpp: + * orbsvcs/tests/Miop/McastFragmentation/client.cpp: + * orbsvcs/tests/Miop/McastFragmentation/run_test.pl: + * orbsvcs/tests/Miop/McastFragmentation/run_test_ipv6.pl: + * orbsvcs/tests/Miop/McastFragmentation/server.cpp: + * tao/DynamicInterface/Request.h: + + Merged trunk to OCI_Reliability_Enhancements branch. These files were changed on + the trunk. + Sun Jan 27 18:57:35 UTC 2013 Byron Harris <harrisb@ociweb.com> * tao/Storable_Base.h: diff --git a/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp b/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp index d4f0a72de4c..0fb0b926ebb 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp @@ -171,7 +171,7 @@ be_visitor_interface_ch::visit_interface (be_interface *node) << "virtual TAO_Policy_Scope _tao_scope (void) const;" << be_nl; } - if (c == 0 && be_global->gen_ostream_operators ()) + if (be_global->gen_ostream_operators ()) { *os << be_nl << "virtual std::ostream &_tao_stream_v (std::ostream &) const;"; diff --git a/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp b/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp index 44294893e9e..543d5e13936 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp @@ -139,7 +139,7 @@ be_visitor_interface_cs::visit_interface (be_interface *node) << "}" << be_nl; } - if (c == 0 && be_global->gen_ostream_operators ()) + if (be_global->gen_ostream_operators ()) { *os << be_nl_2 << "std::ostream &" << be_nl diff --git a/TAO/docs/Options.html b/TAO/docs/Options.html index 25229ec816d..d29f11c3ef2 100644 --- a/TAO/docs/Options.html +++ b/TAO/docs/Options.html @@ -1908,7 +1908,8 @@ strategy. <tr> <td ALIGN="left"><code>‑ORBMaxFragmentRate</code> <em>microseconds</em></td> <td ALIGN="left"> - <P>This client-side option specifies a non-zero, positive amount of time (in + <P>This client-side option (if enabled, see <code>‑ORBSendThrottling</code> below) + specifies a non-zero, positive amount of time (in uSec, i.e. microseconds) that it takes to transmit and process an individual message fragment of the maximum size; see the <code>‑ORBMaxFragmentSize</code> option above. (This is the total of the @@ -1929,7 +1930,8 @@ strategy. </tr> <tr> <td ALIGN="left"><code>‑ORBSendHighWaterMark</code> <em>bytes</em></td> - <td ALIGN="left">This client-side option is the usable size of the message + <td ALIGN="left">This client-side option (if enabled, see <code>‑ORBSendThrottling</code> below) + is the usable size of the message buffer, i.e how much data can be sent without introducing delays into the transmition of individual MIOP fragments (due to the <code>‑ORBMaxFragmentRate</code> option above). <b>Its default value is the size of the buffer maintained by the @@ -1944,6 +1946,21 @@ strategy. </td> </tr> <tr> + <td ALIGN="left"><code>‑ORBSendThrottling</code> <em>0 | 1</em></td> + <td ALIGN="left">This is a client-side option that is enabled by default; + although this default can be overriden when the TAO libraries are built in the <CODE> + ace/config.h</CODE>, by specifying the new default such as <CODE>#define TAO_DEFAULT_MIOP_SEND_THROTTLING false</CODE> + which in this case would turn off throttling by default, unless specified in + the service file. If disabled (0) the client will always attempt to transmit + all MIOP message fragments without any delay. If enabled (1) the client will + attempt to automatically restrict the speed of sending individual MIOP messages + to maintain an average of <code>‑ORBMaxFragmentSize</code> bytes per <code>‑ORBMaxFragmentRate</code> + microseconds once the threshold of <code>‑ORBSendHighWaterMark</code> bytes + of data are currently being transmitted or are in progress via each individual transport + (i.e. each individual client-side connection to the server). + </td> + </tr> + <tr> <td ALIGN="left"><code>‑ORBSndSock</code> <em>bytes</em></td> <td ALIGN="left">This client-side option is the size of the outgoing socket's message buffer. If specified in the service configuration file, this value will @@ -1978,7 +1995,29 @@ strategy. </td> </tr> <tr> - <td ALIGN="left"><code>‑ORBFragmentsCleanupStrategy</code> <em>DELAY | NUMBER + <td ALIGN="left"><code>‑ORBEagerDequeueing</code> <em>0 | 1</em></td> + <td ALIGN="left">This is a server-side option that is enabled by default; + although this default can be overriden when the TAO libraries are built in the <CODE> + ace/config.h</CODE>, by specifying the new default such as <CODE>#define TAO_DEFAULT_MIOP_EAGER_DEQUEUEING false</CODE> + which in this case would turn this off by default, unless specified in the + service file. If disabled (0) each thread servicing the MIOP listener will only + dequeue enough MIOP message fragments from the socket receive buffer to + complete a single full MIOP message which it will then process. This action + reduces the amount of user memory consumed by the server process, but it also + increases the likelyhood of the OS sockets receive buffer overflowing (as + whilst processing each message, the thread cannot dequeue other incomming + message fragments). If enabled (1) it specifies that each server thread will + attempt to dequeue all available MIOP messages from the receiver's socket and + queue these up in a user memory FIFO queue, before attempting to process a + single MIOP message from the head of this FIFO queue. This action attempts to + speed up the dequeueing of MIOP messages from the OS socket receive buffer + (with a corresponding increase in the amount of user memory consumed by the + server process) so as to limit the number of MIOP messages that the server may + miss due to the OS sockets receive buffer becoming full. + </td> + </tr> + <tr> + <td ALIGN="left"><code>‑ORBFragmentsCleanupStrategy</code> <em>DELAY | NUMBER | MEMORY</em></td> <td ALIGN="left">This option is used on the server to specify the incomplete fragments cleanup strategy. The default is <em>DELAY</em>, indicating that the diff --git a/TAO/examples/Advanced/ch_12/client.cpp b/TAO/examples/Advanced/ch_12/client.cpp index 97801bea1a1..f41253a3c67 100644 --- a/TAO/examples/Advanced/ch_12/client.cpp +++ b/TAO/examples/Advanced/ch_12/client.cpp @@ -14,6 +14,7 @@ #include "CCSC.h" // ORB-specific +#include <iterator> #include <ace/streams.h> using namespace std; @@ -21,7 +22,8 @@ using namespace std; // Generic ostream inserter for exceptions. Inserts the exception // name, if available, and the repository ID otherwise. -#if 0 // This inserter may or may not be needed for your ORB. +// This inserter may or may not be needed for your ORB. +#if !defined (GEN_OSTREAM_OPS) static ostream & operator<< (ostream &os, const CORBA::Exception &e) @@ -38,8 +40,6 @@ operator<< (ostream &os, const CORBA::Exception &e) return os; } -#endif - // Show the details for a thermometer or thermostat. static std::ostream & @@ -99,8 +99,9 @@ operator<< (std::ostream &os, const CCS::Controller::EChange &ec) return os; } -// Change the temperature of a thermostat. +#endif +// Change the temperature of a thermostat. static void set_temp (CCS::Thermostat_ptr tmstat, CCS::TempType new_temp) { diff --git a/TAO/examples/Advanced/ch_18/client.cpp b/TAO/examples/Advanced/ch_18/client.cpp index 42c8d8a5cc5..1581a423250 100644 --- a/TAO/examples/Advanced/ch_18/client.cpp +++ b/TAO/examples/Advanced/ch_18/client.cpp @@ -14,6 +14,7 @@ #include "CCSC.h" // ORB-specific #include "assert.h" +#include <iterator> #include <orbsvcs/CosNamingC.h> #include <ace/streams.h> // ---------------------------------------------------------------- @@ -130,6 +131,9 @@ operator<<(ostream & os, const CORBA::Exception & e) // Show the details for a thermometer or thermostat. +// This inserter may or may not be needed for your ORB. +#if !defined (GEN_OSTREAM_OPS) + static std::ostream & operator<<(std::ostream &os, CCS::Thermometer_ptr t) { @@ -189,6 +193,8 @@ operator<<(std::ostream &os, const CCS::Controller::EChange &ec) return os; } +#endif + //---------------------------------------------------------------- // Change the temperature of a thermostat. diff --git a/TAO/examples/Advanced/ch_21/client.cpp b/TAO/examples/Advanced/ch_21/client.cpp index eda65f7c518..f07fd00a9f2 100644 --- a/TAO/examples/Advanced/ch_21/client.cpp +++ b/TAO/examples/Advanced/ch_21/client.cpp @@ -22,7 +22,8 @@ using namespace std; // Generic ostream inserter for exceptions. Inserts the exception // name, if available, and the repository ID otherwise. -#if 0 // This inserter is not needed for TAO. +// This inserter may or may not be needed for your ORB. +#if !defined (GEN_OSTREAM_OPS) static ostream & operator<<(ostream & os, const CORBA::Exception & e) @@ -39,8 +40,6 @@ operator<<(ostream & os, const CORBA::Exception & e) return os; } -#endif - //---------------------------------------------------------------- // Show the details for a thermometer or thermostat. @@ -104,6 +103,8 @@ operator<<(std::ostream &os, const CCS::Controller::EChange &ec) return os; } +#endif + //---------------------------------------------------------------- // Change the temperature of a thermostat. diff --git a/TAO/examples/Advanced/ch_8_and_10/client.cpp b/TAO/examples/Advanced/ch_8_and_10/client.cpp index 6f236100f90..086dd1bb2c7 100644 --- a/TAO/examples/Advanced/ch_8_and_10/client.cpp +++ b/TAO/examples/Advanced/ch_8_and_10/client.cpp @@ -17,6 +17,9 @@ using namespace std; +// This inserter may or may not be needed for your ORB. +#if !defined (GEN_OSTREAM_OPS) + // Show the details for a thermometer or thermostat. static std::ostream & operator<<(std::ostream & os, CCS::Thermometer_ptr t) @@ -83,8 +86,6 @@ operator<<(std::ostream & os, const CCS::Controller::EChange & ec) // Generic ostream inserter for exceptions. Inserts the exception // name, if available, and the repository ID otherwise. - #if 0 // This inserter may or may not be needed for your ORB. - static std::ostream & operator<<(std::ostream & os, const CORBA::Exception & e) { diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.cpp index 6e0b8762556..22459eb5b44 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.cpp @@ -284,115 +284,206 @@ TAO_UIPMC_Mcast_Transport::recv_packet ( return &buf[miop_header_size]; } -bool -TAO_UIPMC_Mcast_Transport::recv_all (void) +TAO_PG::UIPMC_Recv_Packet * +TAO_UIPMC_Mcast_Transport::recv_all (TAO_Resume_Handle &rh) { + const TAO_MIOP_Resource_Factory *const factory = + ACE_Dynamic_Service<TAO_MIOP_Resource_Factory>::instance ( + this->orb_core_->configuration(), + ACE_TEXT ("MIOP_Resource_Factory")); + const bool eager_dequeue= factory->enable_eager_dequeue (); + + // Only one thread will do recv at the same time. // FUZZ: disable check_for_ACE_Guard - // Only one thread will do recv. ACE_Guard<TAO_SYNCH_MUTEX> recv_guard (this->recv_lock_, 0); // tryacquire - if (!recv_guard.locked ()) - return !this->complete_.is_empty (); // FUZZ: enable check_for_ACE_Guard - - // The buffer on the stack which will be used to hold the input - // messages. - char buf [MIOP_MAX_DGRAM_SIZE + ACE_CDR::MAX_ALIGNMENT]; - char *aligned_buf = ACE_ptr_align_binary (buf, ACE_CDR::MAX_ALIGNMENT); + if (recv_guard.locked ()) + { + // The buffer on the stack which will be used to hold the input + // messages. + char buf [MIOP_MAX_DGRAM_SIZE + ACE_CDR::MAX_ALIGNMENT]; + char *aligned_buf = ACE_ptr_align_binary (buf, ACE_CDR::MAX_ALIGNMENT); #if defined (ACE_INITIALIZE_MEMORY_BEFORE_USE) - (void) ACE_OS::memset (buf, - '\0', - sizeof buf); + (void) ACE_OS::memset (buf, '\0', sizeof buf); #endif /* ACE_INITIALIZE_MEMORY_BEFORE_USE */ - while (true) - { - // This guard will cleanup expired packets each iteration. - TAO_PG::UIPMC_Recv_Packet_Cleanup_Guard guard (this); + while (true) + { + // This guard will cleanup expired packets each iteration. + TAO_PG::UIPMC_Recv_Packet_Cleanup_Guard guard (this); - ACE_INET_Addr from_addr; - CORBA::UShort packet_length; - CORBA::ULong packet_number; - bool stop_packet; - u_long id_hash; + ACE_INET_Addr from_addr; + CORBA::UShort packet_length; + CORBA::ULong packet_number; + bool stop_packet; + u_long id_hash; - char *start_data = - this->recv_packet (aligned_buf, MIOP_MAX_DGRAM_SIZE, from_addr, - packet_length, packet_number, stop_packet, id_hash); + char *start_data = + this->recv_packet (aligned_buf, MIOP_MAX_DGRAM_SIZE, from_addr, + packet_length, packet_number, stop_packet, id_hash); - // The socket buffer is empty. Try to do other useful things. - if (start_data == 0) - { - if (errno != EWOULDBLOCK && errno != EAGAIN) + // The socket buffer is empty. Try to do other useful things. + if (start_data == 0) { + if (errno != EWOULDBLOCK && errno != EAGAIN) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") + ACE_TEXT ("recv_all, unexpected failure of recv_packet '%m'\n"), + this->id ())); + } + break; + } + + if (TAO_debug_level >= 9) + { + char tmp[INET6_ADDRSTRLEN]; + from_addr.get_host_addr (tmp, sizeof tmp); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") - ACE_TEXT ("recv_all, unexpected failure of recv_packet '%m'\n"), - this->id ())); + ACE_TEXT ("recv, received %d bytes from <%C:%u> ") + ACE_TEXT ("(hash %d)\n"), + this->id (), + packet_length, + tmp, + from_addr.get_port_number (), + id_hash)); } - break; - } - if (TAO_debug_level >= 10) - { - char tmp[INET6_ADDRSTRLEN]; - from_addr.get_host_addr (tmp, sizeof tmp); - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") - ACE_TEXT ("recv, received %d bytes from <%C:%u> ") - ACE_TEXT ("(hash %d)\n"), - this->id (), - packet_length, - tmp, - from_addr.get_port_number (), - id_hash)); - } + TAO_PG::UIPMC_Recv_Packet *packet = 0; + if (this->incomplete_.find (id_hash, packet) == -1) + { + ACE_NEW_THROW_EX (packet, + TAO_PG::UIPMC_Recv_Packet, + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO::VMCID, + ENOMEM), + CORBA::COMPLETED_NO)); + + if (this->incomplete_.bind (id_hash, packet) != 0) + { + // Cleanup the packet. + delete packet; + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") + ACE_TEXT ("recv_all, could not queue fragment\n"), + this->id ())); + continue; + } + } - TAO_PG::UIPMC_Recv_Packet *packet = 0; - if (this->incomplete_.find (id_hash, packet) == -1) - { - ACE_NEW_THROW_EX (packet, - TAO_PG::UIPMC_Recv_Packet, - CORBA::NO_MEMORY ( - CORBA::SystemException::_tao_minor_code ( - TAO::VMCID, - ENOMEM), - CORBA::COMPLETED_NO)); - - if (this->incomplete_.bind (id_hash, packet) != 0) + // We have incomplete packet so add a new data to it. + // add_fragment returns 1 iff the packet is complete. + if (1 == packet->add_fragment (start_data, packet_length, + packet_number, stop_packet)) { - // Cleanup the packet. - ACE_Auto_Ptr<TAO_PG::UIPMC_Recv_Packet> bail_guard (packet); - continue; + // Remove this packet from incomplete packets. + this->incomplete_.unbind (id_hash); + + // If there are no completed message ahead of us AND + // we only want a single message, just return it. + if (this->complete_.is_empty () && !eager_dequeue) + { + if (TAO_debug_level >= 9) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") + ACE_TEXT ("recv_all, completed MIOP message %@\n"), + this->id (), static_cast<void *> (packet))); + } + + return packet; + } + ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, + guard, + this->complete_lock_, + packet); + if (this->complete_.is_empty () && !eager_dequeue) + { + // Another thread dequeued the waiting MIOP message before we got + // the lock, simply return our single message, don't bother queueing + // it after all. + if (TAO_debug_level >= 9) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") + ACE_TEXT ("recv_all, completed MIOP message %@\n"), + this->id (), static_cast<void *> (packet))); + } + + return packet; + } + + if (TAO_debug_level >= 9) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") + ACE_TEXT ("recv_all, completed MIOP message %@ (QUEUED)\n"), + this->id (), static_cast<void *> (packet))); + } + + // Add it to the complete queue. + this->complete_.enqueue_tail (packet); + + // Stop attempting to queue more messages if we are not in eager mode. + if (!eager_dequeue) + break; } } + recv_guard.release (); + } - // We have incomplete packet so add a new data to it. - int const ret = packet->add_fragment (start_data, packet_length, - packet_number, stop_packet); - - // add_fragment returns 1 iff the packet is complete. - if (ret == 1) - { - // Remove this packet from incomplete packets. - this->incomplete_.unbind (id_hash); + // Ok we have received as many packets as we could, now if we have + // any completed packets queued up, return the first to the caller. + if (this->complete_.is_empty ()) + return 0; + ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, complete_guard, this->complete_lock_, 0); + if (this->complete_.is_empty ()) + return 0; // Another thread got here first, not a problem. - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, - guard, - this->complete_lock_, - !this->complete_.is_empty ()); + TAO_PG::UIPMC_Recv_Packet *packet = 0; + if (this->complete_.dequeue_head (packet) == -1) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - TAO_UIPMC_Mcast_Transport[%d]::recv_all, ") + ACE_TEXT ("unable to dequeue completed message\n"), + this->id ())); + return 0; + } - // Add it to the complete queue. - this->complete_.enqueue_tail (packet); + if (TAO_debug_level >= 9) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") + ACE_TEXT ("recv_all, completed MIOP message %@ (DEQUEUED)\n"), + this->id (), static_cast<void *> (packet))); + } - // The following break stops the eager de-queuing of - // further completed MIOP messages. This should probably - // be configuable via a MIOP Server -ORB option. - break; + // If there is another message waiting to be processed (in addition + // to the one we have just taken off), notify another thread (if + // available) so this can also be processed in parrellel. + if (!this->complete_.is_empty ()) + { + int const retval = this->notify_reactor_now (); + if (retval == 1) + { + // Now we have handed off to another thread, let the class + // know that it doesn't need to resume with OUR handle + // after we have processed our message. + rh.set_flag (TAO_Resume_Handle::TAO_HANDLE_LEAVE_SUSPENDED); + } + else if (retval < 0 && TAO_debug_level > 2) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - TAO_UIPMC_Mcast_Transport[%d]::recv_all, ") + ACE_TEXT ("notify to the reactor failed.\n"), + this->id ())); } } - return !this->complete_.is_empty (); + return packet; } int @@ -411,47 +502,17 @@ TAO_UIPMC_Mcast_Transport::handle_input ( this->id ())); } - if (this->recv_all ()) + // Grab the next completed MIOP message to process from the FIFO Queue. + ACE_Auto_Ptr<TAO_PG::UIPMC_Recv_Packet> complete_owner (this->recv_all (rh)); + if (TAO_PG::UIPMC_Recv_Packet *complete = complete_owner.get ()) { - // Unqueue the first available completed message for us to process. - TAO_PG::UIPMC_Recv_Packet *complete = 0; - ACE_Auto_Ptr<TAO_PG::UIPMC_Recv_Packet> owner (0); - { - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->complete_lock_, 0); - if (this->complete_.is_empty ()) - return 0; // Another thread got here first, no problem. - if (this->complete_.dequeue_head (complete) == -1) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - TAO_UIPMC_Mcast_Transport[%d]::handle_input, ") - ACE_TEXT ("unable to dequeue completed message\n"), - this->id ())); - return 0; - } - ACE_auto_ptr_reset (owner, complete); - - // If there is another message waiting to be processed (in addition - // to the one we have just taken off to be processed), notify another - // thread (if available) so this can also be processed in parrellel. - if (!this->complete_.is_empty ()) - { - int const retval = this->notify_reactor_now (); - if (retval == 1) - { - // Now we have handed off to another thread, let the class - // know that it doesn't need to resume with OUR handle - // after we have processed our message. - rh.set_flag (TAO_Resume_Handle::TAO_HANDLE_LEAVE_SUSPENDED); - } - else if (retval < 0 && TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - TAO_UIPMC_Mcast_Transport[%d]::handle_input, ") - ACE_TEXT ("notify to the reactor failed.\n"), - this->id ())); - } - } - } + if (TAO_debug_level >= 9) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - UIPMC_Mcast_Transport[%d]::") + ACE_TEXT ("handle_input, processing MIOP message %@ (%d bytes)\n"), + this->id (), static_cast<void *> (complete), complete->data_length ())); + } // Create a data block from our dequeued completed message. char *buffer= 0; diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.h index 406fa8a84c9..75befb1e41d 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.h +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Mcast_Transport.h @@ -31,7 +31,6 @@ TAO_BEGIN_VERSIONED_NAMESPACE_DECL // Forward decls. class TAO_ORB_Core; class TAO_UIPMC_Mcast_Connection_Handler; - namespace TAO_PG { class UIPMC_Recv_Packet_Cleanup_Guard; @@ -118,8 +117,9 @@ private: bool &stop_packet, u_long &id_hash) const; - /// Receive as much UDP packets as possible. - bool recv_all (void); + /// Return the next complete MIOP packet, possiably dequeueing + /// as many as are available first from the socket. + TAO_PG::UIPMC_Recv_Packet *recv_all (TAO_Resume_Handle &rh); /// Cleanup either all packets or expired only depending the /// expired_only flag. diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp index 9c9e9f2b07c..2b986c4afd9 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp @@ -330,10 +330,11 @@ TAO_UIPMC_Transport::send ( this_fragment_size-= static_cast<u_long> (already_sent)) { // Make sure we don't send our fragments too quickly - this->throttle_send_rate ( - factory->max_fragment_rate (), - max_fragment_size, - this_fragment_size); + if (factory->enable_throttling ()) + this->throttle_send_rate ( + factory->max_fragment_rate (), + max_fragment_size, + this_fragment_size); // Haven't sent some of the data yet, we need to adjust the fragments iov's // to skip the data we have actually manage to send so far. @@ -382,7 +383,8 @@ TAO_UIPMC_Transport::send ( } // Keep a note of the number of bytes we have just buffered - this->total_bytes_outstanding_+= static_cast<u_long> (already_sent); + if (factory->enable_throttling ()) + this->total_bytes_outstanding_+= static_cast<u_long> (already_sent); } // Keep sending the rest of the fragment // Increment the number of bytes of payload transferred. diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.cpp index f61ff35a2f3..83d84972a82 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.cpp @@ -20,6 +20,8 @@ TAO_MIOP_Resource_Factory::TAO_MIOP_Resource_Factory (void) , send_hi_water_mark_ (0u) // Zero sets this to actual -ORBSndSock , send_buffer_size_ (0u) // Zero is unspecified (-ORBSndSock). , receive_buffer_size_ (0u) // Zero is unspecified (-ORBRcvSock). + , enable_throttling_ (!!(TAO_DEFAULT_MIOP_SEND_THROTTLING)) // Client-side SendRate throttling enabled. + , enable_eager_dequeue_ (!!(TAO_DEFAULT_MIOP_EAGER_DEQUEUEING)) // Server-side Multiple message dequeueing. { } @@ -235,6 +237,32 @@ TAO_MIOP_Resource_Factory::init (int argc, ACE_TCHAR *argv[]) ACE_TEXT ("TAO (%P|%t) - MIOP_Resource_Factory ") ACE_TEXT ("-ORBRcvSock missing size in bytes.\n"))); } + else if (ACE_OS::strcasecmp (argv[curarg], + ACE_TEXT ("-ORBSendThrottling")) == 0 || + ACE_OS::strcasecmp (argv[curarg], + ACE_TEXT ("-ORBSendThrottle")) == 0) + { + if (++curarg < argc) + this->enable_throttling_= static_cast<bool> (ACE_OS::atoi (argv[curarg])); + else + ACE_DEBUG ((LM_ERROR, + ACE_TEXT ("TAO (%P|%t) - MIOP_Resource_Factory ") + ACE_TEXT ("%s missing 0 or 1 parameter.\n"), + argv[curarg-1])); + } + else if (ACE_OS::strcasecmp (argv[curarg], + ACE_TEXT ("-ORBEagerDequeueing")) == 0 || + ACE_OS::strcasecmp (argv[curarg], + ACE_TEXT ("-ORBEagerDequeue")) == 0) + { + if (++curarg < argc) + this->enable_eager_dequeue_= static_cast<bool> (ACE_OS::atoi (argv[curarg])); + else + ACE_DEBUG ((LM_ERROR, + ACE_TEXT ("TAO (%P|%t) - MIOP_Resource_Factory ") + ACE_TEXT ("%s missing 0 or 1 parameter.\n"), + argv[curarg-1])); + } else if (ACE_OS::strncmp (argv[curarg], ACE_TEXT ("-ORB"), 4) == 0) { // Can we assume there is an argument after the option? @@ -342,6 +370,18 @@ TAO_MIOP_Resource_Factory::receive_buffer_size (void) const return receive_buffer_size_; } +bool +TAO_MIOP_Resource_Factory::enable_throttling (void) const +{ + return enable_throttling_; +} + +bool +TAO_MIOP_Resource_Factory::enable_eager_dequeue (void) const +{ + return enable_eager_dequeue_; +} + TAO_END_VERSIONED_NAMESPACE_DECL // **************************************************************** diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.h b/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.h index a4cfac1b51d..8f45618c04d 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.h +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/miop_resource.h @@ -90,8 +90,13 @@ public: u_long receive_buffer_size (void) const; //@} -private: + /// Get the client-side transmission rate throttling enable flag. + bool enable_throttling (void) const; + + /// Get the server-side eager complete message dequeuing enable flag. + bool enable_eager_dequeue (void) const; +private: enum Fragments_Cleanup_Strategy_Type { TAO_MIOP_CLEANUP_TIME_BOUND, @@ -122,6 +127,12 @@ private: /// Get the desired socket receive buffer's size in bytes. u_long receive_buffer_size_; + + /// Get the client-side transmission rate throttling enable flag. + bool enable_throttling_; + + /// Get the server-side eager complete message dequeuing enable flag. + bool enable_eager_dequeue_; }; TAO_END_VERSIONED_NAMESPACE_DECL diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h b/TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h index b45947b340a..49afdf15567 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/miopconf.h @@ -98,6 +98,14 @@ static u_long const TAO_DEFAULT_MIOP_FRAGMENT_SIZE = MIOP_MAX_DGRAM_SIZE; static u_long const TAO_DEFAULT_MIOP_MAX_FRAGMENTS = 0u; // Zero is unlimited #endif +#if !defined (TAO_DEFAULT_MIOP_SEND_THROTTLING) +static bool const TAO_DEFAULT_MIOP_SEND_THROTTLING = true; // Enabled +#endif + +#if !defined (TAO_DEFAULT_MIOP_EAGER_DEQUEUEING) +static bool const TAO_DEFAULT_MIOP_EAGER_DEQUEUEING = true; // Enabled +#endif + static CORBA::Octet const miop_magic[4] = { 0x4d, 0x49, 0x4f, 0x50 }; // in ASCII this is 'M', 'I', 'O', 'P' diff --git a/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.cpp b/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.cpp index 906ffd17ccc..c6f0b7e7654 100644 --- a/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.cpp +++ b/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.cpp @@ -4,6 +4,8 @@ #include "Hello_Impl.h" +ACE_Atomic_Op< TAO_SYNCH_MUTEX, u_long > Number_of_Problems = 0uL; + UIPMC_Object_Impl::UIPMC_Object_Impl (CORBA::ULong payload, CORBA::ULong clients, CORBA::ULong calls) @@ -20,6 +22,7 @@ UIPMC_Object_Impl::~UIPMC_Object_Impl (void) ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: expected %d clients but only %d encountered\n"), this->clients_, this->received_.current_size ())); + ++Number_of_Problems; return; } @@ -29,12 +32,15 @@ UIPMC_Object_Impl::~UIPMC_Object_Impl (void) this->received_.find (Test::ClientIDs[i], count); if (count != this->calls_) - // This perfectly ok for MIOP to lose messages. - // So, this is not an error. - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("DEBUG: expected %d messages from '%c' client ") - ACE_TEXT ("but only %d encountered\n"), - this->calls_, Test::ClientIDs[i], count)); + { + // This perfectly ok for MIOP to lose messages. + // So, this is not an error. + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("DEBUG: expected %d messages from '%c' client ") + ACE_TEXT ("but only %d encountered\n"), + this->calls_, Test::ClientIDs[i], count)); + ++Number_of_Problems; + } } } @@ -47,6 +53,7 @@ UIPMC_Object_Impl::process (Test::Octets const &payload) ACE_TEXT ("ERROR: expected %d but received %d ") ACE_TEXT ("sequence length\n"), this->payload_, payload.length ())); + ++Number_of_Problems; return; } @@ -66,6 +73,7 @@ UIPMC_Object_Impl::process (Test::Octets const &payload) ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: received malformed message from client '%c'\n"), c)); + ++Number_of_Problems; return; } @@ -74,6 +82,7 @@ UIPMC_Object_Impl::process (Test::Octets const &payload) ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: client id '%c' doesn't match any known value\n"), c)); + ++Number_of_Problems; return; } @@ -82,6 +91,7 @@ UIPMC_Object_Impl::process (Test::Octets const &payload) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: cann't rebind received count\n"))); + ++Number_of_Problems; } } @@ -107,6 +117,7 @@ Hello_Impl::shutdown (void) } catch (const CORBA::Exception& ex) { + ++Number_of_Problems; ex._tao_print_exception ("Exception caught in shutdown():"); } } diff --git a/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.h b/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.h index 1b60a05f84c..890ec58bd8e 100644 --- a/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.h +++ b/TAO/orbsvcs/tests/Miop/McastFragmentation/Hello_Impl.h @@ -7,6 +7,9 @@ #include "ace/Hash_Map_Manager_T.h" #include "HelloS.h" +#include "ace/Atomic_Op_T.h" + +extern ACE_Atomic_Op< TAO_SYNCH_MUTEX, u_long > Number_of_Problems; class UIPMC_Object_Impl : public virtual POA_Test::UIPMC_Object { diff --git a/TAO/orbsvcs/tests/Miop/McastFragmentation/client.cpp b/TAO/orbsvcs/tests/Miop/McastFragmentation/client.cpp index e55c8874557..1fc0e819426 100644 --- a/TAO/orbsvcs/tests/Miop/McastFragmentation/client.cpp +++ b/TAO/orbsvcs/tests/Miop/McastFragmentation/client.cpp @@ -185,10 +185,10 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[]) catch (const CORBA::Exception& ex) { ex._tao_print_exception ("Exception caught in client main ():"); - return -1; + return 1; } ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("\nClient finished successfully\n"))); + ACE_TEXT ("\nClient finished successfully.\n"))); return 0; } diff --git a/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test.pl b/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test.pl index 764f22f07d6..99c705421fa 100755 --- a/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test.pl +++ b/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test.pl @@ -14,8 +14,8 @@ $client_level = '0'; $orbs = 10; $payload = 3000; -$threads = 10; -$count = 10; +$threads = 5; +$count = 5; foreach $i (@ARGV) { if ($i eq '-debug') { diff --git a/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test_ipv6.pl b/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test_ipv6.pl index 4ca7bae0cd5..41972cfbbdb 100755 --- a/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test_ipv6.pl +++ b/TAO/orbsvcs/tests/Miop/McastFragmentation/run_test_ipv6.pl @@ -13,9 +13,9 @@ $server_level = '0'; $client_level = '0'; $orbs = 10; -$payload = 300000; -$threads = 10; -$count = 10; +$payload = 3000; +$threads = 5; +$count = 5; foreach $i (@ARGV) { if ($i eq '-debug') { diff --git a/TAO/orbsvcs/tests/Miop/McastFragmentation/server.cpp b/TAO/orbsvcs/tests/Miop/McastFragmentation/server.cpp index 8cd9bffcf6f..045adfe7820 100644 --- a/TAO/orbsvcs/tests/Miop/McastFragmentation/server.cpp +++ b/TAO/orbsvcs/tests/Miop/McastFragmentation/server.cpp @@ -195,6 +195,14 @@ ACE_TMAIN (int argc, ACE_TCHAR *argv[]) return -1; } + if (Number_of_Problems.value ()) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("\nServer finished with *Possiably* %u PROBLEMS.\n"), + Number_of_Problems.value ())); + return 1; + } + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nServer finished successfully.\n"))); return 0; diff --git a/TAO/tao/DynamicInterface/Request.h b/TAO/tao/DynamicInterface/Request.h index 92581d2d0f3..e912de15fe6 100644 --- a/TAO/tao/DynamicInterface/Request.h +++ b/TAO/tao/DynamicInterface/Request.h @@ -185,8 +185,8 @@ namespace CORBA /// Set the byte order member. void _tao_byte_order (int byte_order); - // Hold on to a user exception in case we are part of a TAO - // gateway. + /// Hold on to a user exception in case we are part of a TAO + /// gateway. void raw_user_exception (TAO_InputCDR &cdr); /// Accessor for the input stream containing the exception. @@ -270,7 +270,6 @@ namespace CORBA /// Stores user exception as a CDR stream when this request is /// used in a TAO gateway. ACE_CString raw_user_exception_; - }; } // End CORBA namespace. |