summaryrefslogtreecommitdiff
path: root/TAO/performance-tests/Cubit/TAO/DII_Cubit/client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/performance-tests/Cubit/TAO/DII_Cubit/client.cpp')
-rw-r--r--TAO/performance-tests/Cubit/TAO/DII_Cubit/client.cpp863
1 files changed, 863 insertions, 0 deletions
diff --git a/TAO/performance-tests/Cubit/TAO/DII_Cubit/client.cpp b/TAO/performance-tests/Cubit/TAO/DII_Cubit/client.cpp
new file mode 100644
index 00000000000..a5db0ce0523
--- /dev/null
+++ b/TAO/performance-tests/Cubit/TAO/DII_Cubit/client.cpp
@@ -0,0 +1,863 @@
+// $Id$
+
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/tests/Cubit/TAO/DII_Cubit
+//
+// = FILENAME
+// client.cpp
+//
+// = DESCRIPTION
+// This class implements a simple CORBA client of the Cubit
+// interface using DII functionality.
+//
+// = AUTHOR
+// Jeff Parsons <parsons@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "tao/DynamicInterface/Request.h"
+#include "tao/debug.h"
+#include "tao/AnyTypeCode/TypeCode_Constants.h"
+#include "ace/Profile_Timer.h"
+#include "ace/Get_Opt.h"
+#include "ace/Read_Buffer.h"
+#include "ace/OS_NS_fcntl.h"
+
+// Since we don't yet have an interface repository or dynamic-Any, we
+// just get the info from the IDL-generated files, since we're mainly
+// interested in timing comparisons anyway.
+#include "../IDL_Cubit/cubitC.h"
+
+ACE_RCSID(DII_Cubit, client, "$Id$")
+
+ // Some constants used below.
+const CORBA::ULong DEFAULT_LOOP_COUNT = 250;
+const char *DEFAULT_FACTORY_IOR = "ior00";
+const int SMALL_OCTET_SEQ_LENGTH = 16;
+const int LARGE_OCTET_SEQ_LENGTH = 4096;
+const int SMALL_LONG_SEQ_LENGTH = 4;
+const int LARGE_LONG_SEQ_LENGTH = 1024;
+const int NUMBER_OF_TESTS = 10;
+
+class DII_Cubit_Client
+{
+ // = TITLE
+ // Defines a class that encapsulates behaviour of a Cubit client
+ // that makes requests using DII rather than stubs.
+ //
+ // = DESCRIPTION
+ // This class declares an interface to run an example client for
+ // a Cubit CORBA server. All the complexity for initializing the
+ // client is hidden in the class. Just the run() interface is
+ // needed.
+public:
+ // = Constructor and destructor.
+ DII_Cubit_Client (void);
+ // Constructor.
+
+ ~DII_Cubit_Client (void);
+ // Destructor.
+
+ int init (int argc, char **argv);
+ // Initialize the ORB and gets the Cubit objref.
+
+ int run (void);
+ // Execute client example code.
+
+private:
+ int init_naming_service (void);
+ // Gets objref through naming service.
+
+ int parse_args (void);
+ // Parses the arguments passed on the command line.
+
+ int read_ior (char *filename);
+ // Function to read the cubit factory IOR from a file.
+
+ void print_stats (const char *call_name,
+ ACE_Profile_Timer::ACE_Elapsed_Time &elapsed_time);
+ // Prints the timing stats.
+
+ // = DII versions of Cubit operations:
+
+ void cube_short_dii (void);
+ void cube_long_dii (void);
+ void cube_octet_dii (void);
+ void cube_union_dii (void);
+ void cube_struct_dii (void);
+ void cube_octet_seq_dii (int length);
+ void cube_long_seq_dii (int length);
+
+ // = Wrappers for cubing small and large sequences w/o args:
+
+ void cube_small_long_seq (void);
+ void cube_large_long_seq (void);
+ void cube_small_octet_seq (void);
+ void cube_large_octet_seq (void);
+ void cube_mixin (void);
+ // Wrapper for the mixin call, just to be neat.
+
+ void (DII_Cubit_Client::*op_array_[NUMBER_OF_TESTS])(void);
+ // Array of pointers to the operation functions.
+
+ static const char *stats_messages_[];
+ // Array of labels for passing to print_stats.
+
+ int argc_;
+ // # of arguments on the command line.
+
+ char **argv_;
+ // arguments from command line.
+
+ CORBA::ULong loop_count_;
+ // # of calls in test loop.
+
+ int shutdown_;
+ // Flag to tell server to exit.
+
+ CORBA::ORB_var orb_var_;
+ // Storage of the ORB reference.
+
+ CORBA::Object_var factory_var_;
+ // Storage of the Cubit_factory objref
+
+ CORBA::Object_var obj_var_;
+ // Storage of the Cubit objref.
+
+ CORBA::ULong call_count_;
+ // # of calls made to functions.
+
+ CORBA::ULong error_count_;
+ // # of errors incurred in the lifetime of the application.
+
+ char *factory_IOR_;
+ // IOR of the factory used to make a Cubit object.
+
+ FILE *cubit_factory_ior_file_;
+ // File from which to obtain the IOR.
+
+ ACE_HANDLE f_handle_;
+ // File handle to read the IOR.
+};
+
+// Constructor
+DII_Cubit_Client::DII_Cubit_Client (void)
+ : loop_count_ (DEFAULT_LOOP_COUNT),
+ shutdown_ (0),
+ orb_var_ (0),
+ factory_var_ (CORBA::Object::_nil ()),
+ obj_var_ (CORBA::Object::_nil ()),
+ call_count_ (0),
+ error_count_ (0),
+ factory_IOR_ (CORBA::string_dup (DEFAULT_FACTORY_IOR))
+{
+ // Initialize the array of pointers-to-member-functions.
+ this->op_array_[0] = &DII_Cubit_Client::cube_short_dii;
+ this->op_array_[1] = &DII_Cubit_Client::cube_octet_dii;
+ this->op_array_[2] = &DII_Cubit_Client::cube_long_dii;
+ this->op_array_[3] = &DII_Cubit_Client::cube_struct_dii;
+ this->op_array_[4] = &DII_Cubit_Client::cube_union_dii;
+ this->op_array_[5] = &DII_Cubit_Client::cube_small_long_seq;
+ this->op_array_[6] = &DII_Cubit_Client::cube_large_long_seq;
+ this->op_array_[7] = &DII_Cubit_Client::cube_small_octet_seq;
+ this->op_array_[8] = &DII_Cubit_Client::cube_large_octet_seq;
+ this->op_array_[9] = &DII_Cubit_Client::cube_mixin;
+}
+
+// Destructor
+DII_Cubit_Client::~DII_Cubit_Client (void)
+{
+ CORBA::string_free (this->factory_IOR_);
+}
+
+// An array of messages to pass to print_stats, so we can step through
+// this along with op_array_.
+const char *DII_Cubit_Client::stats_messages_[] =
+{
+ "DII cube_short",
+ "DII cube_octet",
+ "DII cube_long",
+ "DII cube_struct",
+ "DII cube_union",
+ "DII cube_small_sequence<long>",
+ "DII cube_large_sequence<long>",
+ "DII cube_small_sequence<octet>",
+ "DII cube_large_sequence<octet>",
+ "DII cube mixin (short/octet/long)"
+};
+
+int
+DII_Cubit_Client::init (int argc, char **argv)
+{
+ // Nice and safe.
+ this->argc_ = argc;
+ this->argv_ = argv;
+
+ ACE_TRY_NEW_ENV
+ {
+ // Initialize the ORB.
+ this->orb_var_ = CORBA::ORB_init (this->argc_,
+ this->argv_,
+ "internet"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Parse command line and verify parameters.
+ if (this->parse_args () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%p\n",
+ "DII_Cubit_Client::parse_args failed"),
+ -1);
+
+ // Get a factory object reference from the factory IOR.
+ this->factory_var_ =
+ this->orb_var_->string_to_object (this->factory_IOR_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get a Cubit object with a DII request on the Cubit factory.
+ CORBA::Request_var mc_req (this->factory_var_->_request ("make_cubit"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ // make_cubit takes a char* arg that it doesn't use, but we must
+ // still include it in the request.
+ const char * dummy = "";
+
+ mc_req->add_in_arg () <<= dummy;
+
+ mc_req->set_return_type (CORBA::_tc_Object);
+
+ // Invoke the <make_cubit> operation to ask the Cubit factory
+ // for a Cubit object.
+ mc_req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Extract the returned object reference from the request.
+ mc_req->return_value () >>= CORBA::Any::to_object (this->obj_var_.out ());
+
+ if (CORBA::is_nil (this->obj_var_.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " could not obtain Cubit object from Cubit factory <%s>\n"),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "DII_Cubit_Client::init");
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}
+
+// Sort out the args in the command line.
+
+int
+DII_Cubit_Client::parse_args (void)
+{
+ ACE_Get_Opt opts (argc_, argv_, "dn:i:f:x");
+ int c;
+ int result;
+
+ while ((c = opts ()) != -1)
+ switch (c)
+ {
+ case 'd': // debug flag
+ TAO_debug_level++;
+ break;
+ case 'n': // loop count
+ this->loop_count_ = ACE_OS::atoi (opts.opt_arg ());
+ break;
+ case 'i': // Get the IOR from the command line.
+ this->factory_IOR_ = opts.opt_arg ();
+ break;
+ case 'f': // Read the IOR from the file.
+ result = this->read_ior (opts.opt_arg ());
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to read ior from %s : %p\n",
+ opts.opt_arg ()),
+ -1);
+ break;
+ case 'x': // Shut down server after test run.
+ this->shutdown_ = 1;
+ break;
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s"
+ " [-d]"
+ " [-n calls/loop]"
+ " [-i cubit-factory-IOR]"
+ " [-f filename]"
+ " [-x]"
+ "\n",
+ this->argv_ [0]),
+ -1);
+ }
+ return 0; // Indicates successful parsing of command line.
+}
+
+// Get the factory IOR from the file created by the server.
+int
+DII_Cubit_Client::read_ior (char *filename)
+{
+ // Open the file for reading.
+ this->f_handle_ = ACE_OS::open (filename,0);
+
+ if (this->f_handle_ == ACE_INVALID_HANDLE)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open %s for writing: %p\n",
+ filename),
+ -1);
+
+ ACE_Read_Buffer ior_buffer (this->f_handle_);
+
+ this->factory_IOR_ = ior_buffer.read ();
+
+ if (this->factory_IOR_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to allocate memory to read ior: %p\n"),
+ -1);
+ return 0;
+}
+
+// Formats and prints time statistics. Identical to function in
+// IDL_Cubit, for ease of comparison.
+
+void
+DII_Cubit_Client::print_stats (const char *call_name,
+ ACE_Profile_Timer::ACE_Elapsed_Time &elapsed_time)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "%s:\n",
+ call_name));
+
+ if (this->call_count_ > 0
+ && this->error_count_ == 0)
+ {
+#if defined (ACE_LACKS_FLOATING_POINT)
+ // elapsed_time.real_time is in units of microseconds.
+ const u_int calls_per_sec =
+ this->call_count_ * 1000000u / elapsed_time.real_time;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\treal_time\t= %u ms,\n"
+ "\t%u calls/second\n",
+ elapsed_time.real_time / 1000u,
+ calls_per_sec));
+#else /* ! ACE_LACKS_FLOATING_POINT */
+ // elapsed_time.real_time is in units of seconds.
+ double calls_per_sec =
+ this->call_count_ / elapsed_time.real_time;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\treal_time\t= %0.06f ms, \n\t"
+ "user_time\t= %0.06f ms, \n\t"
+ "system_time\t= %0.06f ms\n"
+ "\t%0.00f calls/second\n",
+ elapsed_time.real_time < 0.0 ? 0.0
+ : elapsed_time.real_time * ACE_ONE_SECOND_IN_MSECS,
+ elapsed_time.user_time < 0.0 ? 0.0
+ : elapsed_time.user_time * ACE_ONE_SECOND_IN_MSECS,
+ elapsed_time.system_time < 0.0 ? 0.0
+ : elapsed_time.system_time * ACE_ONE_SECOND_IN_MSECS,
+ calls_per_sec < 0.0 ? 0.0 : calls_per_sec));
+#endif /* ! ACE_LACKS_FLOATING_POINT */
+ }
+ else
+ ACE_ERROR ((LM_ERROR,
+ "\tNo time stats printed. "
+ "Call count zero or error ocurred.\n"));
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\t%d calls, %d errors\n",
+ this->call_count_,
+ this->error_count_));
+}
+
+void
+DII_Cubit_Client::cube_short_dii (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create the request ...
+ CORBA::Request_var req (this->obj_var_->_request ("cube_short"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ CORBA::Short ret_short = 0;
+ CORBA::Short arg_short = -3;
+
+ // Add the short to the request arg list.
+ req->add_in_arg () <<= arg_short;
+
+ req->set_return_type (CORBA::_tc_short);
+
+ this->call_count_++;
+
+ req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ req->return_value () >>= ret_short;
+
+ if (ret_short != arg_short * arg_short * arg_short)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_short_dii -- bad results\n"));
+
+ this->error_count_++;
+ }
+ }
+ ACE_CATCHANY
+ {
+ this->error_count_++;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "cube_short_dii");
+ return;
+ }
+ ACE_ENDTRY;
+}
+
+void
+DII_Cubit_Client::cube_long_dii (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create the request ...
+ CORBA::Request_var req (this->obj_var_->_request ("cube_long"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ CORBA::Long ret_long = 0;
+ CORBA::Long arg_long = -7;
+
+ // Add the long to the request arg list.
+ req->add_in_arg () <<= arg_long;
+
+ req->set_return_type (CORBA::_tc_long);
+
+ this->call_count_++;
+
+ req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ req->return_value () >>= ret_long;
+
+ if (ret_long != arg_long * arg_long * arg_long)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_long_dii -- bad results\n"));
+
+ this->error_count_++;
+ }
+ }
+ ACE_CATCHANY
+ {
+ this->error_count_++;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "cube_long_dii");
+ return;
+ }
+ ACE_ENDTRY;
+}
+
+void
+DII_Cubit_Client::cube_octet_dii (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create the request ...
+ CORBA::Request_var req (this->obj_var_->_request ("cube_octet"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ CORBA::Octet ret_octet = 0;
+ CORBA::Octet arg_octet = 5;
+
+ // Add the octet to the request arg list.
+ CORBA::Any::from_octet from_arg_octet (arg_octet);
+ req->add_in_arg () <<= from_arg_octet;
+
+ req->set_return_type (CORBA::_tc_octet);
+
+ // Invoke, check for an exception and verify the result.
+ this->call_count_++;
+
+ req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ CORBA::Any::to_octet to_ret_octet (ret_octet);
+ req->return_value () >>= to_ret_octet;
+
+ if (ret_octet != arg_octet * arg_octet * arg_octet)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_octet_dii -- bad results\n"));
+
+ this->error_count_++;
+ }
+ }
+ ACE_CATCHANY
+ {
+ this->error_count_++;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "cube_octet_dii");
+ return;
+ }
+ ACE_ENDTRY;
+}
+
+void
+DII_Cubit_Client::cube_union_dii (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create the request ...
+ CORBA::Request_var req (this->obj_var_->_request ("cube_union"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ Cubit::oneof arg_union;
+
+ arg_union._d(Cubit::e_3rd);
+ arg_union.cm ().l = 5;
+ arg_union.cm ().s = -7;
+ arg_union.cm ().o = 3;
+
+ // Add the union to the request arg list and set the return type.
+ req->add_in_arg () <<= arg_union;
+
+ req->set_return_type (Cubit::_tc_oneof);
+
+ // Invoke, check for an exception and verify the result
+
+ this->call_count_++;
+
+ req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ // Extract the result and check validity.
+ Cubit::oneof* ret_ptr;
+ req->return_value () >>= ret_ptr;
+
+ if (ret_ptr->cm ().l != arg_union.cm ().l * arg_union.cm ().l * arg_union.cm ().l
+ || ret_ptr->cm ().s != arg_union.cm ().s * arg_union.cm ().s * arg_union.cm ().s
+ || ret_ptr->cm ().o != arg_union.cm ().o * arg_union.cm ().o * arg_union.cm ().o)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_union_dii -- bad results\n"));
+
+ this->error_count_++;
+ }
+ }
+ ACE_CATCHANY
+ {
+ this->error_count_++;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "cube_union_dii");
+ return;
+ }
+ ACE_ENDTRY;
+}
+
+void
+DII_Cubit_Client::cube_struct_dii (void)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create the request ...
+ CORBA::Request_var req (this->obj_var_->_request ("cube_struct"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ Cubit::Many arg_struct, *ret_struct_ptr;
+
+ arg_struct.l = 5;
+ arg_struct.s = -7;
+ arg_struct.o = 3;
+
+ // Add struct to the request arg list.
+ req->add_in_arg () <<= arg_struct;
+
+ req->set_return_type (Cubit::_tc_Many);
+
+ // Invoke, check for an exception and verify the result.
+
+ this->call_count_++;
+
+ req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ req->return_value () >>= ret_struct_ptr;
+
+ if (ret_struct_ptr->l != arg_struct.l * arg_struct.l * arg_struct.l
+ || ret_struct_ptr->s != arg_struct.s * arg_struct.s * arg_struct.s
+ || ret_struct_ptr->o != arg_struct.o * arg_struct.o * arg_struct.o)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_struct_dii -- bad results\n"));
+
+ this->error_count_++;
+ }
+ }
+ ACE_CATCHANY
+ {
+ this->error_count_++;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "cube_struct_dii");
+ return;
+ }
+ ACE_ENDTRY;
+}
+
+void
+DII_Cubit_Client::cube_octet_seq_dii (int length)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create the request ...
+ CORBA::Request_var req (this->obj_var_->_request ("cube_octet_sequence"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ // Same length as in IDL_Cubit tests so timings can be compared.
+ // Return value holder is set to a different length to test resizing.
+ Cubit::octet_seq arg_octet_seq (length), *ret_octet_seq_ptr;
+ arg_octet_seq.length (length);
+ arg_octet_seq[0] = 4;
+
+ // Add octet sequence to the request arg list
+
+ req->add_in_arg () <<= arg_octet_seq;
+
+ req->set_return_type (Cubit::_tc_octet_seq);
+
+ // Invoke, check for an exception and verify the result.
+
+ this->call_count_++;
+
+ req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ req->return_value () >>= ret_octet_seq_ptr;
+
+ // Check for correct length.
+ if (ret_octet_seq_ptr->length () != arg_octet_seq.length ())
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_octet_seq_dii -- bad length\n"));
+
+ this->error_count_++;
+ }
+
+ // Check for correct value(s).
+ if ((*ret_octet_seq_ptr)[0] != arg_octet_seq[0] * arg_octet_seq[0] * arg_octet_seq[0])
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_octet_seq_dii -- bad results\n"));
+
+ this->error_count_++;
+ }
+ }
+ ACE_CATCHANY
+ {
+ this->error_count_++;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "cube_octet_seq_dii");
+ return;
+ }
+ ACE_ENDTRY;
+}
+
+void
+DII_Cubit_Client::cube_long_seq_dii (int length)
+{
+ ACE_TRY_NEW_ENV
+ {
+ // Create the request ...
+ CORBA::Request_var req (this->obj_var_->_request ("cube_long_sequence"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ // Same length as in IDL_Cubit tests so timings can be compared.
+ // Return value holder is set to a different length to test
+ // resizing.
+ Cubit::long_seq *ret_long_seq_ptr;
+ Cubit::long_seq arg_long_seq (length);
+ arg_long_seq.length (length);
+ arg_long_seq[0] = 4;
+
+ // Add the long_seq to the request arg list.
+ req->add_in_arg () <<= arg_long_seq;
+
+ req->set_return_type (Cubit::_tc_long_seq);
+
+ // Invoke, check for an exception and verify the result.
+
+ this->call_count_++;
+
+ req->invoke (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ req->return_value () >>= ret_long_seq_ptr;
+
+ // Check for correct length.
+ if (ret_long_seq_ptr->length () != arg_long_seq.length ())
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_long_seq_dii -- bad length\n"));
+
+ this->error_count_++;
+ }
+
+ // Check for correct value(s).
+ if ((*ret_long_seq_ptr)[0] != arg_long_seq[0] * arg_long_seq[0] * arg_long_seq[0])
+ {
+ ACE_ERROR ((LM_ERROR,
+ "cube_long_seq_dii -- bad results\n"));
+
+ this->error_count_++;
+ }
+ }
+ ACE_CATCHANY
+ {
+ this->error_count_++;
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "cube_long_seq_dii");
+ return;
+ }
+ ACE_ENDTRY;
+}
+
+// Wrappers for operations with non-void arg lists and the 3-in-1
+// mixin test, so an array of pointers to functions can be stepped
+// through in run ().
+
+void
+DII_Cubit_Client::cube_small_long_seq (void)
+{
+ this->cube_long_seq_dii (SMALL_LONG_SEQ_LENGTH);
+}
+
+void
+DII_Cubit_Client::cube_large_long_seq (void)
+{
+ this->cube_long_seq_dii (LARGE_LONG_SEQ_LENGTH);
+}
+
+void
+DII_Cubit_Client::cube_small_octet_seq (void)
+{
+ this->cube_octet_seq_dii (SMALL_OCTET_SEQ_LENGTH);
+}
+
+void
+DII_Cubit_Client::cube_large_octet_seq (void)
+{
+ this->cube_octet_seq_dii (LARGE_OCTET_SEQ_LENGTH);
+}
+
+void
+DII_Cubit_Client::cube_mixin (void)
+{
+ this->cube_short_dii ();
+ this->cube_octet_dii ();
+ this->cube_long_dii ();
+}
+
+int
+DII_Cubit_Client::run (void)
+{
+ // loop counter.
+ CORBA::ULong i;
+
+ // Make a timer and an elapsed time holder.
+ ACE_Profile_Timer dii_timer;
+ ACE_Profile_Timer::ACE_Elapsed_Time dii_elapsed_time;
+
+ // Order and format of test calls matches that of SII (IDL) tests
+ // for easy comparison.
+
+ for (int j = 0; j < NUMBER_OF_TESTS; j++)
+ {
+ this->call_count_ = 0;
+
+ this->error_count_ = 0;
+
+ dii_timer.start ();
+
+ for (i = 0; i < this->loop_count_; i++)
+ (this->*op_array_[j])();
+
+ dii_timer.stop ();
+
+ dii_timer.elapsed_time (dii_elapsed_time);
+
+ this->print_stats (this->stats_messages_[j],
+ dii_elapsed_time);
+ }
+
+ ACE_TRY_NEW_ENV
+ {
+ // Shut down server via a DII request.
+ if (this->shutdown_)
+ {
+ CORBA::Request_var req (this->obj_var_->_request ("shutdown"
+ ACE_ENV_ARG_PARAMETER));
+
+ ACE_TRY_CHECK;
+
+ // Cubit::shutdown () is a oneway operation.
+ req->send_oneway (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\n\t Shutting down IDL_Cubit server \n\n"));
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "DII_Cubit_Client: server shutdown");
+ return -1;
+ }
+ ACE_ENDTRY;
+
+ return this->error_count_ == 0 ? 0 : 1;
+}
+
+// Start the test.
+
+int main (int argc, char *argv[])
+{
+ DII_Cubit_Client cubit_client;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\n\t DII_Cubit::CLIENT \n\n"));
+
+ if (cubit_client.init (argc, argv) == -1)
+ return 1;
+
+ return cubit_client.run ();
+}