📄 client.cpp
字号:
// client.cpp,v 1.25 2003/10/28 18:34:32 bala Exp
// ============================================================================
//
// = 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/TC_Constants_Forward.h"
#include "ace/Profile_Timer.h"
#include "ace/Get_Opt.h"
#include "ace/Read_Buffer.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, "client.cpp,v 1.25 2003/10/28 18:34:32 bala Exp")
// 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
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -