// $Id$ #include "ace/Get_Opt.h" #include "ace/High_Res_Timer.h" #include "ace/Stats.h" #include "ace/Throughput_Stats.h" #include "ace/Sample_History.h" #include "ace/Read_Buffer.h" #include "ace/Array_Base.h" #include "ace/Task.h" #include "ace/OS_NS_unistd.h" #include "tao/ORB_Core.h" #include "tao/debug.h" #include "tao/RTCORBA/RTCORBA.h" #include "tao/RTCORBA/Priority_Mapping_Manager.h" #include "LWFTC.h" #include "tests/RTCORBA/common_args.cpp" #include "tests/RTCORBA/check_supported_priorities.cpp" #include "ace/Event.h" #include "Client_ORBInitializer.h" #include "tao/ORBInitializer_Registry.h" #include "Agent.h" #include "ace/Barrier.h" #include #include #include ACE_RCSID(Thread_Pool, client, "$Id$") enum Priority_Setting { AT_THREAD_CREATION = 0, AFTER_THREAD_CREATION = 1 }; static const char *ior = "file://s1.ior"; static const char *rates_file = "rates"; static const char *invocation_priorities_file = "empty-file"; static int shutdown_server = 0; static int do_dump_history = 0; static const char *history_file_name; static ACE_UINT32 gsf = 0; static CORBA::ULong continuous_workers = 0; static int done = 0; static CORBA::ULong time_for_test = 10; static CORBA::ULong work = 10; static CORBA::ULong max_throughput_timeout = 5; static CORBA::ULong continuous_worker_priority = 0; static int set_priority = 1; static Priority_Setting priority_setting = AFTER_THREAD_CREATION; static int individual_continuous_worker_stats = 0; static int print_missed_invocations = 0; static ACE_hrtime_t test_start; static CORBA::ULong prime_number = 9619; static int count_missed_end_deadlines = 0; const char *agent_ior_file = "agent.ior"; const char *rm_ior = "file://rm.ior"; std::vector sample_vector (3100); size_t count = 0; const char *dummy_file_name = "temp1"; class Agent_Thread : public ACE_Task_Base { public: Agent_Thread (CORBA::ORB_ptr orb, Agent_i *agent, ACE_Barrier *barrier); virtual int svc (void); private: CORBA::ORB_ptr orb_; Agent_i *agent_; ACE_Barrier *synchronizer_; }; Agent_Thread::Agent_Thread (CORBA::ORB_ptr orb, Agent_i *agent, ACE_Barrier *thread_barrier) : orb_ (orb), agent_ (agent), synchronizer_ (thread_barrier) { } int Agent_Thread::svc (void) { try { CORBA::Object_var poa_object = this->orb_->resolve_initial_references ("RootPOA"); if (CORBA::is_nil (poa_object.in ())) ACE_ERROR_RETURN ((LM_ERROR, " (%P|%t) Unable to initialize the POA.\n"), 1); PortableServer::POA_var root_poa = PortableServer::POA::_narrow (poa_object.in ()); PortableServer::POAManager_var poa_manager = root_poa->the_POAManager (); /* Agent_var temp = this->agent_->_this (); CORBA::String_var ior = this->orb_->object_to_string (temp.in ()); */ poa_manager->activate (); /* FILE *output_file= ACE_OS::fopen (agent_ior_file, "w"); if (output_file == 0) { ACE_ERROR_RETURN ((LM_ERROR, "Cannot open output file <%s> for writing " "IOR: %s", ior.in ()), 1); } ACE_OS::fprintf (output_file, "%s", ior.in ()); ACE_OS::fclose (output_file); */ /* CORBA::Object_var naming_obj = this->orb_->resolve_initial_references ("NameService"); if (CORBA::is_nil (naming_obj.in ())) ACE_ERROR_RETURN ((LM_ERROR, " (%P|%t) Unable to get the Naming Service.\n"), 1); CosNaming::NamingContext_var naming_context = CosNaming::NamingContext::_narrow (naming_obj.in ()); CosNaming::Name name (1); name.length (1); name[0].id = CORBA::string_dup ("ReplicationManager"); CORBA::Object_var rm_obj = naming_context->resolve (name); */ CORBA::Object_var tmp = this->orb_->string_to_object(rm_ior); ReplicationManager_var rm = ReplicationManager::_narrow (tmp.in ()); agent_->initialize (rm.in ()); //ACE_DEBUG ((LM_DEBUG, "calling register agent\n")); //rm->register_agent (temp.in ()); this->synchronizer_->wait (); } catch (const CORBA::Exception& ex) { ex._tao_print_exception ("Exception caught:"); return 1; } return 0; } struct Synchronizers { Synchronizers (void) : worker_lock_ (), workers_ (1), workers_ready_ (0), number_of_workers_ (0) { } ACE_SYNCH_MUTEX worker_lock_; ACE_Event workers_; CORBA::ULong workers_ready_; CORBA::ULong number_of_workers_; }; int parse_args (int argc, char *argv[]) { ACE_Get_Opt get_opts (argc, argv, "c:e:g:hi:k:m:p:q:r:t:u:v:w:x:y:z:a:" //client options "b:f:hl:n:o:s:" // server options ); int c; while ((c = get_opts ()) != -1) switch (c) { case 'c': continuous_workers = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'e': count_missed_end_deadlines = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'g': do_dump_history = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'i': individual_continuous_worker_stats = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'k': ior = get_opts.opt_arg (); break; case 'm': print_missed_invocations = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'p': invocation_priorities_file = get_opts.opt_arg (); break; case 'q': prime_number = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'r': rates_file = get_opts.opt_arg (); break; case 't': time_for_test = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'u': continuous_worker_priority = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'v': priority_setting = Priority_Setting (ACE_OS::atoi (get_opts.opt_arg ())); break; case 'w': work = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'x': shutdown_server = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'y': set_priority = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'z': max_throughput_timeout = ACE_OS::atoi (get_opts.opt_arg ()); break; case 'a': history_file_name = get_opts.opt_arg(); break; case 'b': case 'f': case 'l': case 'n': case 'o': case 's': // server options: ignored. break; case 'h': case '?': default: ACE_ERROR_RETURN ((LM_ERROR, "usage: %s\n" "\t-c (defaults to %d)\n" "\t-e (defaults to %d)\n" "\t-g (defaults to %d)\n" "\t-h \n" "\t-i (defaults to %d)\n" "\t-k (defaults to %s)\n" "\t-m (defaults to %d)\n" "\t-p (defaults to %s)\n" "\t-q (defaults to %d)\n" "\t-r (defaults to %s)\n" "\t-t