diff options
Diffstat (limited to 'TAO/performance-tests/Cubit/Hardpack/IDL_Cubit/client_i.cpp')
-rw-r--r-- | TAO/performance-tests/Cubit/Hardpack/IDL_Cubit/client_i.cpp | 824 |
1 files changed, 824 insertions, 0 deletions
diff --git a/TAO/performance-tests/Cubit/Hardpack/IDL_Cubit/client_i.cpp b/TAO/performance-tests/Cubit/Hardpack/IDL_Cubit/client_i.cpp new file mode 100644 index 00000000000..073dbaca8a0 --- /dev/null +++ b/TAO/performance-tests/Cubit/Hardpack/IDL_Cubit/client_i.cpp @@ -0,0 +1,824 @@ +// $Id$ + +#include "ace/Env_Value_T.h" +#include "ace/Read_Buffer.h" +#include "client_i.h" + +ACE_RCSID(IDL_Cubit, client_i, "$Id$") + +#if defined (ACE_ENABLE_TIMEPROBES) + +static const char *Cubit_Client_Timeprobe_Description[] = +{ + "Cubit_Client::cube_octet - start", + "Cubit_Client::cube_octet - end", + + "Cubit_Client::cube_short - start", + "Cubit_Client::cube_short - end", + + "Cubit_Client::cube_long - start", + "Cubit_Client::cube_long - end", + + "Cubit_Client::cube_struct - start", + "Cubit_Client::cube_struct - end", + + "Cubit_Client::cube_union - start", + "Cubit_Client::cube_union - end", + + "Cubit_Client::cube_long_sequence - start", + "Cubit_Client::cube_long_sequence - end", + + "Cubit_Client::cube_octet_sequence - start", + "Cubit_Client::cube_octet_sequence - end" +}; + +enum +{ + // Timeprobe description table start key + CUBIT_CLIENT_CUBE_OCTET_START = 10000, + CUBIT_CLIENT_CUBE_OCTET_END, + + CUBIT_CLIENT_CUBE_SHORT_START, + CUBIT_CLIENT_CUBE_SHORT_END, + + CUBIT_CLIENT_CUBE_LONG_START, + CUBIT_CLIENT_CUBE_LONG_END, + + CUBIT_CLIENT_CUBE_STRUCT_START, + CUBIT_CLIENT_CUBE_STRUCT_END, + + CUBIT_CLIENT_CUBE_UNION_START, + CUBIT_CLIENT_CUBE_UNION_END, + + CUBIT_CLIENT_CUBE_LONG_SEQUENCE_START, + CUBIT_CLIENT_CUBE_LONG_SEQUENCE_END, + + CUBIT_CLIENT_CUBE_OCTET_SEQUENCE_START, + CUBIT_CLIENT_CUBE_OCTET_SEQUENCE_END +}; + +// Setup Timeprobes +ACE_TIMEPROBE_EVENT_DESCRIPTIONS (Cubit_Client_Timeprobe_Description, + CUBIT_CLIENT_CUBE_OCTET_START); + +#endif /* ACE_ENABLE_TIMEPROBES */ + +// Constructor. +Cubit_Client::Cubit_Client (void) + : cubit_factory_key_ (0), + cubit_key_ (ACE_OS::strdup ("key0")), + loop_count_ (250), + shutdown_ (0), + cubit_ (Cubit::_nil ()), + call_count_ (0), + error_count_ (0), + cubit_factory_ior_file_ (0), + f_handle_ (ACE_INVALID_HANDLE), + use_naming_service_ (1) +{ +} + +// Simple function that returns the substraction of 117 from the +// parameter. + +int +Cubit_Client::func (u_int i) +{ + return i - 117; +} + +// Reads the Cubit factory ior from a file + +int +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->cubit_factory_key_ = ior_buffer.read (); + + if (this->cubit_factory_key_ == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Unable to allocate memory to read ior: %p\n"), + -1); + return 0; +} + +// Parses the command line arguments and returns an error status. + +int +Cubit_Client::parse_args (void) +{ + ACE_Get_Opt get_opts (argc_, argv_, "n:f:k:xs"); + int c; + int result; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'n': // loop count + this->loop_count_ = (u_int) ACE_OS::atoi (get_opts.optarg); + break; + case 'f': // read the IOR from the file. + result = this->read_ior (get_opts.optarg); + if (result < 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Unable to read ior from %s : %p\n", + get_opts.optarg), + -1); + break; + case 'k': // read the cubit IOR from the command-line. + this->cubit_factory_key_ = + ACE_OS::strdup (get_opts.optarg); + break; + case 'x': + this->shutdown_ = 1; + break; + case 's': // Don't use the TAO Naming Service. + this->use_naming_service_ = 0; + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s" + " [-n loopcount]" + " [-f cubit_factory-obj-ref-key-file]" + " [-k cubit-obj-ref-key]" + " [-x]" + " [-s]" + "\n", + this->argv_ [0]), + -1); + } + + // Indicates successful parsing of command line. + return 0; +} + +// Exercise the union. Cube a union. + +// void +// Cubit_Client::cube_union (void) +// { +// Cubit::oneof u; + +// this->call_count_++; + +// u.l (3); // use the long union branch. + +// // Cube a "union" ... +// Cubit::oneof r; +// { +// ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_UNION_START); + +// try +// { +// r = this->cubit_->cube_union (u); +// } +// catch (...) +// { +// cout << "An unknown exception in cube_long\n"; +// this->error_count_++; +// return; +// } +// } +// u.l (u.l () * u.l () * u.l ()) ; + +// if (u.l () != r.l ()) +// { +// ACE_DEBUG ((LM_DEBUG, "** cube_union ERROR\n")); +// this->error_count_++; +// } + +// this->call_count_++; + +// u._d (Cubit::e_3rd); + +// u.cm ().l = 7; +// u.cm ().s = 5; +// u.cm ().o = 3; + +// // Cube another "union" which uses the default arm ... NOT tested yet +// { +// ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_UNION_START); +// try +// { +// r = this->cubit_->cube_union (u); +// } +// catch (...) +// { +// cout << "An unknown exception in cube_long\n"; +// this->error_count_++; +// return; +// } +// } +// u.cm ().l = u.cm ().l * u.cm ().l * u.cm ().l; +// u.cm ().s = u.cm ().s * u.cm ().s * u.cm ().s; +// u.cm ().o = u.cm ().o * u.cm ().o * u.cm ().o; + +// if (u.cm ().l != r.cm ().l +// || u.cm ().s != r.cm ().s +// || u.cm ().o != r.cm ().o) +// { +// ACE_DEBUG ((LM_DEBUG, "** cube_union ERROR\n")); +// this->error_count_++; +// } +// } + +// Cube a short. + +void +Cubit_Client::cube_short (int i) +{ + CORBA::Short arg_short = this->func (i); + + this->call_count_++; + // Cube a short. + CORBA::Short ret_short; + { + ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_SHORT_START); + try + { + ret_short = this->cubit_->cube_short (arg_short); + } + catch (...) + { + cout << "An unknown exception in cube_short\n"; + this->error_count_++; + return; + } + arg_short = arg_short * arg_short * arg_short; + if (arg_short != ret_short) + { + ACE_ERROR ((LM_ERROR, "** cube_short (%d) ERROR (--> %d)\n", + (CORBA::Short) i-117, + ret_short)); + this->error_count_++; + } + } +} + +void +Cubit_Client::cube_oneway (int i) +{ + try + { + this->cubit_->cube_oneway (); + } + catch (...) + { + cout << "An unknown exception in cube_short\n"; + this->error_count_++; + return; + } + + this->call_count_++; + return; +} + +void +Cubit_Client::cube_void (int i) +{ + try + { + this->cubit_->cube_void (); + } + catch (...) + { + cout << "An unknown exception in cube_short\n"; + this->error_count_++; + return; + } + this->call_count_++; +} + + +// Cube an octet + +void +Cubit_Client::cube_octet (int i) +{ + CORBA::Octet arg_octet = this->func (i); + + this->call_count_++; + // Cube an octet. + CORBA::Octet ret_octet; + { + ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_OCTET_START); + try + { + ret_octet = this->cubit_->cube_octet (arg_octet); + } + catch (...) + { + cout << "An unknown exception in cube_long\n"; + this->error_count_++; + return; + } + arg_octet = arg_octet * arg_octet * arg_octet; + if (arg_octet != ret_octet) { + ACE_DEBUG ((LM_DEBUG, + "** cube_octet (%d) ERROR (--> %d)\n", + (CORBA::Octet) this->func (i), + ret_octet)); + this->error_count_++; + } + } +} + + // calculate the cube from a long + +void +Cubit_Client::cube_long (int i) +{ + CORBA::Long arg_long = this->func (i); + + // Cube a long. + CORBA::Long ret_long; + { + ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_LONG_START); + try + { + ret_long = this->cubit_->cube_long (arg_long); + this->call_count_++; + } + catch (...) + { + cout << "An unknown exception in cube_long\n"; + this->error_count_++; + this->call_count_++; + return; + } + arg_long = arg_long * arg_long * arg_long; + if (arg_long != ret_long) + { + ACE_ERROR ((LM_ERROR, + "** cube_long (%ld) ERROR (--> %ld)\n", + (CORBA::Long) this->func (i), + ret_long)); + this->error_count_++; + } + } +} + +// // Cube the numbers in a struct + +void +Cubit_Client::cube_struct (int i) +{ + Cubit::Many arg_struct; + Cubit::Many ret_struct; + + this->call_count_++; + + arg_struct.l = this->func (i); + arg_struct.s = this->func (i); + arg_struct.o = this->func (i); + + // Cube a "struct" ... + { + ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_STRUCT_START); + try + { + ret_struct = this->cubit_->cube_struct (arg_struct); + } + catch (...) + { + cout << "An unknown exception in cube_struct\n"; + this->error_count_++; + return; + } + } + + arg_struct.l = arg_struct.l * arg_struct.l * arg_struct.l; + arg_struct.s = arg_struct.s * arg_struct.s * arg_struct.s; + arg_struct.o = arg_struct.o * arg_struct.o * arg_struct.o; + + if (arg_struct.l != ret_struct.l + || arg_struct.s != ret_struct.s + || arg_struct.o != ret_struct.o) + { + ACE_ERROR ((LM_ERROR, "** cube_struct ERROR\n")); + this->error_count_++; + } +} + + +// Cube the numbers in a sequence + +// void +// Cubit_Client::cube_long_sequence (int i, int l) +// { +// this->call_count_++; + +// Cubit::long_seq input (l); +// input.length (l); + +// // Just set the first item, otherwise it is hard to compare the +// // results for longer sequences, i.e. more than just marshalling +// // gets in the way. +// input[0] = 4; + +// Cubit::long_seq_var output ; + +// // Cube the sequence +// { +// ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_LONG_SEQUENCE_START); +// try +// { +// this->cubit_->cube_long_sequence (input,output); +// } +// catch (...) +// { +// cout << "An unknown exception in cube_long_sequence\n"; +// this->error_count_++; +// return; +// } +// } +// if (output->length () != input.length ()) +// { +// ACE_ERROR ((LM_ERROR, "** cube sequence, wrong length\n")); +// this->error_count_++; +// } + +// u_int rl = output->length (); +// if (input.length () < rl) +// rl = input.length (); +// CORBA::Long x = input[0]; +// if (x * x *x != output[0]) +// { +// ACE_ERROR ((LM_ERROR, "** cube_long_sequence ERROR\n")); +// this->error_count_++; +// } +// } + +// void +// Cubit_Client::cube_octet_sequence (int i, int l) +// { +// this->call_count_++; + +// Cubit::octet_seq input (l); +// input.length (l); + +// // Just set the first item, otherwise it is hard to compare the +// // results for longer sequences, i.e. more than just marshalling +// // gets in the way. +// input[0] = 4; + +// Cubit::octet_seq* output; + +// // Cube the sequence +// { +// ACE_FUNCTION_TIMEPROBE (CUBIT_CLIENT_CUBE_OCTET_SEQUENCE_START); + +// try +// { +// this->cubit_->cube_octet_sequence (input, output); +// } +// catch (...) +// { +// cout << "An unknown exception in cube_octec_sequence\n"; +// this->error_count_++; +// return; +// } +// } +// u_int rl = output->length (); +// if (rl != input.length ()) +// { +// ACE_ERROR ((LM_ERROR, "** cube octet, wrong length\n")); +// this->error_count_++; +// } + +// if (input.length () < rl) +// rl = input.length (); +// CORBA::Octet x = input[0]; +// if (x * x *x != output[0]) +// { +// ACE_ERROR ((LM_ERROR, "** cube_octet ERROR\n")); +// this->error_count_++; +// } +// } + +void +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_)); +} + +// Execute client example code. + +int +Cubit_Client::run (int testing_collocation) +{ + u_int i; + + ACE_Profile_Timer timer; + ACE_Profile_Timer::ACE_Elapsed_Time elapsed_time; + // ACE_Time_Value before; + + + // + // Show the results one type at a time. + // + + // ONEWAY + this->call_count_ = 0; + this->error_count_ = 0; + timer.start (); + for (i = 0; i < this->loop_count_; i++) + this->cube_oneway (i); + timer.stop (); + timer.elapsed_time (elapsed_time); + this->print_stats ("cube_oneway", elapsed_time); + + // VOID + this->call_count_ = 0; + this->error_count_ = 0; + timer.start (); + for (i = 0; i < this->loop_count_; i++) + this->cube_void (i); + timer.stop (); + timer.elapsed_time (elapsed_time); + this->print_stats ("cube_void", elapsed_time); + + // SHORT + this->call_count_ = 0; + this->error_count_ = 0; + timer.start (); + for (i = 0; i < this->loop_count_; i++) + this->cube_short (i); + timer.stop (); + timer.elapsed_time (elapsed_time); + this->print_stats ("cube_short", elapsed_time); + + // OCTET + this->call_count_ = 0; + this->error_count_ = 0; + timer.start (); + for (i = 0; i < this->loop_count_; i++) + this->cube_octet (i); + timer.stop (); + timer.elapsed_time (elapsed_time); + this->print_stats ("cube_octet", elapsed_time); + + // LONG + this->call_count_ = 0; + this->error_count_ = 0; + timer.start (); + for (i = 0; i < this->loop_count_; i++) + this->cube_long (i); + timer.stop (); + timer.elapsed_time (elapsed_time); + this->print_stats ("cube_long", elapsed_time); + + // STRUCT + this->call_count_ = 0; + this->error_count_ = 0; + timer.start (); + for (i = 0; i < this->loop_count_; i++) + this->cube_struct (i); + timer.stop (); + timer.elapsed_time (elapsed_time); + this->print_stats ("cube_struct", elapsed_time); + +// // UNION +// this->call_count_ = 0; +// this->error_count_ = 0; +// timer.start (); +// for (i = 0; i < this->loop_count_; i++) +// this->cube_union (); +// timer.stop (); +// timer.elapsed_time (elapsed_time); +// this->print_stats ("cube_union_stub call", elapsed_time); + +// // SMALL LONG SEQUENCES +// this->call_count_ = 0; +// this->error_count_ = 0; +// timer.start (); +// for (i = 0; i < this->loop_count_; i++) +// this->cube_long_sequence (this->loop_count_, 4); +// timer.stop (); +// timer.elapsed_time (elapsed_time); +// this->print_stats ("cube_small_sequence<long>", elapsed_time); + +// // LARGE LONG SEQUENCES +// this->call_count_ = 0; +// this->error_count_ = 0; +// timer.start (); +// for (i = 0; i < this->loop_count_; i++) +// this->cube_long_sequence (this->loop_count_, 1024); +// timer.stop (); +// timer.elapsed_time (elapsed_time); +// this->print_stats ("cube_large_sequence<long>", elapsed_time); + +// // SMALL OCTET SEQUENCES +// this->call_count_ = 0; +// this->error_count_ = 0; +// timer.start (); +// for (i = 0; i < this->loop_count_; i++) +// this->cube_octet_sequence (this->loop_count_, 16); +// timer.stop (); +// timer.elapsed_time (elapsed_time); +// this->print_stats ("cube_small_sequence<octet>", elapsed_time); + +// // LARGE OCTET SEQUENCES +// this->call_count_ = 0; +// this->error_count_ = 0; +// timer.start (); +// for (i = 0; i < this->loop_count_; i++) +// this->cube_octet_sequence (this->loop_count_, 4096); +// timer.stop (); +// timer.elapsed_time (elapsed_time); +// this->print_stats ("cube_large_sequence<octet>", elapsed_time); + + + // MIXIN + this->call_count_ = 0; + this->error_count_ = 0; + timer.start (); + for (i = 0; i < this->loop_count_; i++) + { + this->cube_short (i); + this->cube_octet (i); + this->cube_long (i); + } + timer.stop (); + timer.elapsed_time (elapsed_time); + this->print_stats ("cube mixin (short/octet/long)", elapsed_time); + + + return this->error_count_ == 0 ? 0 : 1; +} + +Cubit_Client::~Cubit_Client (void) +{ + // Free resources + // Close the ior files + if (this->cubit_factory_ior_file_) + ACE_OS::fclose (this->cubit_factory_ior_file_); + if (this->f_handle_ != ACE_INVALID_HANDLE) + ACE_OS::close (this->f_handle_); + + CORBA::release (this->cubit_); + + if (this->cubit_factory_key_ != 0) + ACE_OS::free (this->cubit_factory_key_); + if (this->cubit_key_ != 0) + ACE_OS::free (this->cubit_key_); +} + +int +Cubit_Client::init_naming_service (void) +{ + CORBA::Object_ptr dummy_object; + CosNaming::NamingContext_var nameserver; + CosNaming::Name name; + + try { + // Resolve initial reference to the nameserver + dummy_object = this->orb_-> resolve_initial_references("NameService"); + // Narrow the initial reference to the nameserver + nameserver = CosNaming::NamingContext::_narrow(dummy_object); + } catch (CORBA::BAD_PARAM) { + cout << "Bad parameter exception caught - narrow on the NameService" << endl; + exit(-1); + } catch (CORBA::SystemException) { + cout << "A general system exception was caught - resolve_initial_references" << endl; + exit(-1); + } catch (...) { + cout << "An exception of unknown type was caught - initializing the NameService" << endl; + exit(-1); + } + + // Resolve the server interface object which was bound under the name "cubit" + name.length(2); + + name[0].id = "cubit_S"; + name[0].kind = "ASE"; + name[1].id = "cubit"; + name[1].kind = "interface"; + + try { + dummy_object = nameserver -> resolve(name); + this->cubit_ = Cubit::_narrow(dummy_object); + } catch (CORBA::BAD_PARAM) { + cout << "Bad parameter exception caught - resolve or narrow on the cubit server object" << endl; + exit(-1); + } catch (...) { + cout << "An exception of unknown type was caught - resolve or narrow on the cubit server object" << endl; + exit(-1); + } + + cout << "cubit object resolved successfully\n"; + + return 0; +} + +int +Cubit_Client::init (int argc, char **argv) +{ + int argct; + char *argvt[1]; + int naming_result; + this->argc_ = argc; + this->argv_ = argv; + cout << "Starting the cubit client." << endl; + + try { + // Obtain an object reference to the ORB + argvt[0] = "-ORBase cubit_client"; + argct = 1; + this->orb_ = CORBA::ORB_init(argct, argvt, ORBIDENT); + } catch (CORBA::BAD_PARAM) { + cout << "Bad parameter exception caught - ORB_init" << endl; + exit(-1); + } catch (CORBA::INITIALIZE) { + cout << "Initialize exception caught - ORB_init" << endl; + exit(-1); + } catch (CORBA::INTERNAL) { + cout << "Internal exception caught - ORB_init" << endl; + exit(-1); + } catch (CORBA::UNKNOWN) { + cout << "Unknown exception caught - ORB_init" << endl; + exit(-1); + } catch(...) { + cout << "An exception of unknown type was caught - ORB_init" << endl; + exit(-1); + } + + try { + // Obtain an object reference to the BOA + argct = 0; + this->boa_ = this->orb_-> BOA_init(argct, argvt, BOAIDENT); + } catch (CORBA::UNKNOWN) { + cout << "Unknown exception caught - ORB_init" << endl; + exit(-1); + } catch (CORBA::SystemException) { + cout << "General system exception caught - BOA_init" << endl; + exit(-1); + } catch (...) { + cout << "An exception of unknown type was caught - BOA_init" << endl; + exit(-1); + } + naming_result = this->init_naming_service (); + if (naming_result < 0) + return naming_result; + + return 0; +} + +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) +template class ACE_Env_Value<unsigned long>; +template class ACE_Env_Value<unsigned short>; +#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) +#pragma instantiate ACE_Env_Value<unsigned long> +#pragma instantiate ACE_Env_Value<unsigned short> +#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |