diff options
Diffstat (limited to 'TAO/performance-tests/Demux/server.cpp')
-rw-r--r-- | TAO/performance-tests/Demux/server.cpp | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/TAO/performance-tests/Demux/server.cpp b/TAO/performance-tests/Demux/server.cpp new file mode 100644 index 00000000000..d4c10e35a5d --- /dev/null +++ b/TAO/performance-tests/Demux/server.cpp @@ -0,0 +1,317 @@ +// $Id$ + +#include "tao_demux_i.h" + +#ifdef USE_QUANTIFY +#include <quantify.h> +#endif + +#include <iostream.h> +#include <fstream.h> + +#include "ace/SString.h" + +ACE_RCSID(Demux_Test, server, "$Id$") + +void print_exception (const CORBA_Exception *x, + const char *info, + FILE *stream + ); + +#if !defined (__cplusplus) +typedef void (*SIG_TYP)(); +#endif + +#ifdef SVR4 +void +sigpipe (int foo) +#else + void +sigpipe () +#endif +{ +} + +//****************** perf hash for obj lookup ************* +// for perfect hash +struct object_db +{ + char *name; // name of method + CORBA_Object_ptr obj; //fn pointer to obj impl +}; + +// include the perfect hash code for objects +#include "gperf_object.i" + +// Perfect hash table class +class TAO_Perfect_Hash_ObjTable: public TAO_Object_Table +{ +public: + TAO_Perfect_Hash_ObjTable (Object_Hash *oh); + + ~TAO_Perfect_Hash_ObjTable (void); + + virtual int bind (const CORBA_OctetSeq &key, + CORBA_Object_ptr obj); + // Registers a CORBA_Object into the object table and associates the + // key with it. Returns -1 on failure, 0 on success, 1 on + // duplicate. + + virtual int find (const CORBA_OctetSeq &key, + CORBA_Object_ptr &obj); + // Looks up an object in the object table using <{key}>. Returns + // non-negative integer on success, or -1 on failure. + +private: + Object_Hash *hash_; +}; + +TAO_Perfect_Hash_ObjTable::TAO_Perfect_Hash_ObjTable (Object_Hash *oh) + : hash_ (oh) +{ +} + +TAO_Perfect_Hash_ObjTable::~TAO_Perfect_Hash_ObjTable (void) +{ +} + +int +TAO_Perfect_Hash_ObjTable::bind (const CORBA_OctetSeq &key, CORBA_Object_ptr obj) +{ + struct object_db *entry; + + ACE_CString objkey ((char *)key.buffer, key.length); + entry = this->hash_->in_word_set (objkey.rep (), key.length); + if (entry != 0) + { + // now fill up the entry + entry->obj = obj; + } + else + { + return -1; // error + } +} + +int +TAO_Perfect_Hash_ObjTable::find (const CORBA_OctetSeq &key, CORBA_Object_ptr &obj) +{ + struct object_db *entry; + + ACE_CString objkey ((char *)key.buffer, key.length); + entry = this->hash_->in_word_set (objkey.rep (), key.length); + + if (entry != 0) + { + obj = entry->obj; + return 0; + } + else + { + return -1; + } +} + +//****************** perf hash for opname lookup ************* +struct method_db +{ + char *name; // name of method + TAO_Skeleton skel_ptr_; //fn pointer to obj impl +}; + +#include "gperf_method.i" + +// Perfect hash table class +class TAO_Perfect_Hash_Op_Table: public TAO_Operation_Table +{ +public: + TAO_Perfect_Hash_Op_Table (Method_Hash *mh); + + ~TAO_Perfect_Hash_Op_Table (void); + + virtual int find (const CORBA_String &opname, + TAO_Skeleton &skel_ptr); + // Uses <{opname}> to look up the skeleton function and pass it back + // in <{skelfunc}>. Returns non-negative integer on success, or -1 + // on failure. + + virtual int bind (const CORBA_String &opname, + const TAO_Skeleton skelptr); + // Associate the skeleton <{skel_ptr}> with an operation named + // <{opname}>. Returns -1 on failure, 0 on success, 1 on duplicate. +private: + Method_Hash *hash_; +}; + +TAO_Perfect_Hash_Op_Table::TAO_Perfect_Hash_Op_Table (Method_Hash *mh) + : hash_ (mh) +{ +} + +TAO_Perfect_Hash_Op_Table::~TAO_Perfect_Hash_Op_Table (void) +{ +} + +int +TAO_Perfect_Hash_Op_Table::bind (const CORBA_String &opname, + const TAO_Skeleton skelptr) +{ + return 0; // nothing to do +} + +int +TAO_Perfect_Hash_Op_Table::find (const CORBA_String &opname, + TAO_Skeleton &skelptr) +{ + method_db *entry; + + entry = (method_db*) this->hash_->in_word_set (opname, ACE_OS::strlen (opname)); + if (entry != 0) + { + skelptr = entry->skel_ptr_; + return 0; + } + else + { + return -1; + } +} + +//*********************************************************** +char Usage[] = "\ +Usage: server [options] \n\ +Common options:\n\ +-t demux_strategy: l(linear), g(GPERF), a (delayered active demux), d (dynamic hash)\n\ +-i iter: number of iterations to expect from client \n\ +"; + +extern CORBA_Double TAO_Avg; +extern CORBA_Long TAO_HowMany; +extern CORBA_Long TAO_Loop; +int +main (int argc, char *const *argv) +{ + unsigned long addr_tmp; + int c; + unsigned short done = 0; + CORBA_Environment env; + CORBA_ORB_ptr orb_ptr; + CORBA_POA_ptr oa_ptr; + int iter = 1; + TAO_OA_Parameters *params = TAO_OA_PARAMS::instance(); + char *orb_name = "ior"; + int idle = -1; + int use_ior = 0; + int terminationStatus = 0; + tao_demux_i **mymux; // array of objects implementing the "demux" interface + int numObjs = 5, numMethods = 4; + Object_Hash oh; + TAO_Object_Table *objt = new TAO_Perfect_Hash_ObjTable (&oh); + Method_Hash mh; + TAO_Operation_Table *optbl = new TAO_Perfect_Hash_Op_Table (&mh); + + TAO_Operation_Table_Parameters *op_params = + TAO_OP_TABLE_PARAMETERS::instance(); + + fstream iorfile; // stores the object references of all the objects + fstream outfile; + CORBA_String str; // scratch area + + params->userdef_lookup_strategy (objt); + + orb_ptr = CORBA_ORB_init (argc, argv, orb_name, env); + if (env.exception () != 0) { + print_exception (env.exception (), "ORB init", stdout); + return 1; + } + + oa_ptr = orb_ptr->BOA_init (argc, argv, "ROA"); + if (env.exception () != 0) { + print_exception (env.exception (), "OA init", stdout); + return 1; + } + + TAO_debug_level = 0; + // Now process the options other than Orbix specific options + while ((c = getopt (argc, argv, "ui:t:o:m:")) != -1) + { + switch (c) + { + case 't': + switch (*optarg) + { + case 'l': + op_params->lookup_strategy + (TAO_Operation_Table_Parameters::TAO_LINEAR); + break; + case 'a': + op_params->lookup_strategy + (TAO_Operation_Table_Parameters::TAO_ACTIVE_DEMUX); + break; + case 'g': + op_params->lookup_strategy + (TAO_Operation_Table_Parameters::TAO_PERFECT_HASH); + op_params->concrete_strategy (optbl); + break; + case 'd': + default: + op_params->lookup_strategy + (TAO_Operation_Table_Parameters::TAO_DYNAMIC_HASH); + break; + } + break; + case 'u': + use_ior = 1; + orb_name = ""; + break; + case 'i': + iter = atoi (optarg); + break; + case 'o': + numObjs = atoi(optarg); + break; + case 'm': + numMethods = atoi(optarg); + break; + default: + goto usage; + } + } + + TAO_Avg = 0; + TAO_Loop = 0; + TAO_HowMany = iter*numObjs*numMethods; + + // + // Receiver + // + + iorfile.open ("ior.txt", ios::out); + mymux = new tao_demux_i* [numObjs]; + + // instantiate objects +#include "obj_create.i" + iorfile.close(); + cout << "Server ready to handle events" << endl; + +#if defined (USE_QUANTIFY) + quantify_clear_data(); + quantify_start_recording_data(); +#endif + + ACE_Service_Config::run_reactor_event_loop(); + + outfile.open ("muxcost.dat", ios::out|ios::app); + outfile << numObjs << "\t" << numMethods << "\t" << TAO_Avg << endl; + outfile.close (); + // + // Shut down the OA -- recycles all underlying resources (e.g. file + // descriptors, etc). + // + oa_ptr->clean_shutdown (env); + return terminationStatus; +usage: + fprintf (stderr, Usage); + return(1); +} + |