summaryrefslogtreecommitdiff
path: root/TAO/tests/Policies/Manipulation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/Policies/Manipulation.cpp')
-rw-r--r--TAO/tests/Policies/Manipulation.cpp317
1 files changed, 317 insertions, 0 deletions
diff --git a/TAO/tests/Policies/Manipulation.cpp b/TAO/tests/Policies/Manipulation.cpp
new file mode 100644
index 00000000000..e1ced15d5d8
--- /dev/null
+++ b/TAO/tests/Policies/Manipulation.cpp
@@ -0,0 +1,317 @@
+// $Id$
+
+#include "testC.h"
+
+#include "tao/Messaging/Messaging.h"
+#include "tao/AnyTypeCode/Any.h"
+#include "tao/AnyTypeCode/TAOA.h"
+#include "tao/TAOC.h"
+#include "tao/Object_T.h"
+#include "ace/Get_Opt.h"
+#include "ace/Task.h"
+#include "ace/OS_NS_time.h"
+
+ACE_RCSID(Policies, Manipulation, "$Id$")
+
+int nthreads = 5;
+int niterations = 100;
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "n:i:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'n':
+ nthreads = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+ case 'i':
+ niterations = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-n <nthreads> "
+ "-i <niterations> "
+ "\n",
+ argv [0]),
+ -1);
+ }
+ // Indicates sucessful parsing of the command line
+ return 0;
+}
+
+class Manipulation : public ACE_Task_Base
+{
+ // = TITLE
+ // Run the client thread
+ //
+ // = DESCRIPTION
+ // Use the ACE_Task_Base class to run the client threads.
+ //
+public:
+ Manipulation (CORBA::ORB_ptr orb,
+ Test_ptr test,
+ int niterations);
+ // ctor
+
+ virtual int svc (void);
+ // The thread entry point.
+
+private:
+ void perform_iteration (ACE_RANDR_TYPE &seed,
+ CORBA::PolicyList_var &policies,
+ CORBA::PolicyManager_ptr policy_manager,
+ CORBA::PolicyCurrent_ptr policy_current);
+
+private:
+ CORBA::ORB_var orb_;
+ // The ORB pointer
+
+ Test_var test_;
+ // The test object reference
+
+ int niterations_;
+ // The number of iterations on this thread
+};
+
+int
+main (int argc, char *argv[])
+{
+ try
+ {
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv);
+
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ CORBA::Object_var object =
+ orb->string_to_object ("corbaloc:iiop:localhost:12345/FakeIOR");
+
+ Test_var test =
+ TAO::Narrow_Utils<Test>::unchecked_narrow (
+ object.in (),
+ _TAO_Test_Proxy_Broker_Factory_function_pointer);
+
+ if (CORBA::is_nil (test.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Object reference is nil\n"),
+ 1);
+ }
+
+ Manipulation manipulation (orb.in (),
+ test.in (),
+ niterations);
+ if (manipulation.activate (THR_NEW_LWP | THR_JOINABLE,
+ nthreads) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot activate manipulation threads\n"),
+ 1);
+
+ manipulation.thr_mgr ()->wait ();
+
+ ACE_DEBUG ((LM_DEBUG, "threads finished\n"));
+
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Caught exception:");
+ return 1;
+ }
+
+ return 0;
+}
+
+// ****************************************************************
+
+Manipulation::Manipulation (CORBA::ORB_ptr orb,
+ Test_ptr test,
+ int niterations)
+ : orb_ (CORBA::ORB::_duplicate (orb)),
+ test_ (Test::_duplicate (test)),
+ niterations_ (niterations)
+{
+}
+
+void
+Manipulation::perform_iteration (ACE_RANDR_TYPE &seed,
+ CORBA::PolicyList_var &policies,
+ CORBA::PolicyManager_ptr policy_manager,
+ CORBA::PolicyCurrent_ptr policy_current)
+{
+ try
+ {
+ int r = ACE_OS::rand_r (seed);
+
+ const int ADD_OBJECT_POLICY = 0;
+ const int ADD_CURRENT_POLICY = 1;
+ const int ADD_MANAGER_POLICY = 2;
+
+ const int SET_OBJECT_POLICY = 3;
+ const int SET_CURRENT_POLICY = 4;
+ const int SET_MANAGER_POLICY = 5;
+
+ const int SAVE_CURRENT_POLICIES = 6;
+ const int RESTORE_CURRENT_POLICIES = 7;
+ const int SAVE_MANAGER_POLICIES = 8;
+ // const int RESTORE_MANAGER_POLICIES = 9;
+ const int LAST_OPERATION = 10;
+ int operation = r % LAST_OPERATION;
+
+ if (operation == ADD_OBJECT_POLICY
+ || operation == ADD_CURRENT_POLICY
+ || operation == ADD_MANAGER_POLICY
+ || operation == SET_OBJECT_POLICY
+ || operation == SET_CURRENT_POLICY
+ || operation == SET_MANAGER_POLICY)
+ {
+ CORBA::Policy_var policy;
+
+ CORBA::Any any;
+ CORBA::ULong policy_type = 0;
+
+ int type = ACE_OS::rand_r (seed) % 3;
+ if (type == 0)
+ {
+ TimeBase::TimeT value = 0;
+ any <<= value;
+
+ policy_type =
+ Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE;
+ }
+ else if (type == 1)
+ {
+ TAO::BufferingConstraint value;
+ any <<= value;
+
+ policy_type =
+ TAO::BUFFERING_CONSTRAINT_POLICY_TYPE;
+ }
+ else // type == 2 (or something else)
+ {
+ Messaging::SyncScope value = 0;
+ any <<= value;
+
+ policy_type =
+ Messaging::SYNC_SCOPE_POLICY_TYPE;
+ }
+
+ policy = this->orb_->create_policy (policy_type,
+ any);
+
+ CORBA::SetOverrideType override_type = CORBA::SET_OVERRIDE;
+ if (operation == ADD_OBJECT_POLICY
+ || operation == ADD_CURRENT_POLICY
+ || operation == ADD_MANAGER_POLICY)
+ {
+ override_type = CORBA::ADD_OVERRIDE;
+ }
+
+ CORBA::PolicyList policy_list (1);
+ policy_list.length (1);
+ policy_list[0] = CORBA::Policy::_duplicate (policy.in ());
+
+ if (operation == ADD_OBJECT_POLICY
+ || operation == SET_OBJECT_POLICY)
+ {
+ CORBA::Object_var tmp =
+ this->test_->_set_policy_overrides (policy_list,
+ override_type);
+ }
+ else if (operation == ADD_CURRENT_POLICY
+ || operation == SET_CURRENT_POLICY)
+ {
+ policy_current->set_policy_overrides (policy_list,
+ override_type);
+ }
+ else
+ {
+ // operation == ADD_CURRENT_POLICY
+ // || operation == SET_CURRENT_POLICY)
+ policy_manager->set_policy_overrides (policy_list,
+ override_type);
+ }
+ policy_list[0]->destroy ();
+ }
+ else if (operation == SAVE_CURRENT_POLICIES)
+ {
+ CORBA::PolicyTypeSeq types;
+ policies =
+ policy_current->get_policy_overrides (types);
+ }
+ else if (operation == SAVE_MANAGER_POLICIES)
+ {
+ CORBA::PolicyTypeSeq types;
+ policies =
+ policy_manager->get_policy_overrides (types);
+ }
+ else if (operation == RESTORE_CURRENT_POLICIES)
+ {
+ if (policies.ptr () != 0)
+ {
+ policy_current->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE);
+ }
+ }
+ else // operation == RESTORE_MANAGER_POLICIES)
+ {
+ if (policies.ptr () != 0)
+ {
+ policy_manager->set_policy_overrides (policies.in (),
+ CORBA::SET_OVERRIDE);
+ }
+ }
+ }
+ catch (const CORBA::Exception&)
+ {
+ // Ignore all exceptions
+ }
+}
+
+
+int
+Manipulation::svc (void)
+{
+ try
+ {
+#ifndef ACE_LACKS_LONGLONG_T
+ ACE_RANDR_TYPE seed =
+ static_cast<ACE_RANDR_TYPE> (ACE_OS::gethrtime ());
+#else
+ ACE_RANDR_TYPE seed =
+ static_cast<ACE_RANDR_TYPE> (ACE_OS::gethrtime().lo());
+#endif
+ CORBA::Object_var object =
+ this->orb_->resolve_initial_references ("ORBPolicyManager");
+
+ CORBA::PolicyManager_var policy_manager =
+ CORBA::PolicyManager::_narrow (object.in ());
+
+ object =
+ this->orb_->resolve_initial_references ("PolicyCurrent");
+
+ CORBA::PolicyCurrent_var policy_current =
+ CORBA::PolicyCurrent::_narrow (object.in ());
+
+
+ for (int i = 0; i != this->niterations_; ++i)
+ {
+ CORBA::PolicyList_var policies;
+ this->perform_iteration (seed,
+ policies,
+ policy_manager.in (),
+ policy_current.in ());
+ }
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Manipulation: exception raised");
+ }
+ return 0;
+}