int Task::svc (void) { Synchronizers synchronizers; gsf = ACE_High_Res_Timer::global_scale_factor (); try { CORBA::Object_var object = this->orb_->string_to_object (ior); test_var test = test::_narrow (object.in ()); object = this->orb_->resolve_initial_references ("RTCurrent"); RTCORBA::Current_var current = RTCORBA::Current::_narrow (object.in ()); object = this->orb_->resolve_initial_references ("PriorityMappingManager"); RTCORBA::PriorityMappingManager_var mapping_manager = RTCORBA::PriorityMappingManager::_narrow (object.in ()); RTCORBA::PriorityMapping &priority_mapping = *mapping_manager->mapping (); ULong_Array rates; int result = get_values ("client", rates_file, "rates", rates, 1); if (result != 0) return result; ULong_Array invocation_priorities; result = get_values ("client", invocation_priorities_file, "invocation priorities", invocation_priorities, 1); if (result != 0) return result; if (invocation_priorities.size () != 0 && invocation_priorities.size () != rates.size ()) ACE_ERROR_RETURN ((LM_ERROR, "Number of invocation priorities (%d) != Number of rates (%d)\n", invocation_priorities.size (), rates.size ()), -1); synchronizers.number_of_workers_ = rates.size () + continuous_workers; CORBA::ULong max_rate = 0; result = max_throughput (test.in (), current.in (), priority_mapping, max_rate); if (result != 0) return result; CORBA::Short priority_range = RTCORBA::maxPriority - RTCORBA::minPriority; ACE_Thread_Manager paced_workers_manager; CORBA::ULong i = 0; Paced_Worker **paced_workers = new Paced_Worker *[rates.size ()]; for (i = 0; i < rates.size (); ++i) { CORBA::Short priority = 0; if (invocation_priorities.size () == 0) priority = CORBA::Short ((priority_range / double (rates.size ())) * (i + 1)); else priority = invocation_priorities[i]; paced_workers[i] = new Paced_Worker (paced_workers_manager, test.in (), rates[i], time_for_test * rates[i], priority, current.in (), priority_mapping, synchronizers); } ACE_Thread_Manager continuous_workers_manager; Continuous_Worker continuous_worker (continuous_workers_manager, test.in (), max_rate * time_for_test, current.in (), priority_mapping, synchronizers); long flags = THR_NEW_LWP | THR_JOINABLE | this->orb_->orb_core ()->orb_params ()->thread_creation_flags (); CORBA::Short CORBA_priority = continuous_worker_priority; CORBA::Short native_priority; CORBA::Boolean convert_result = priority_mapping.to_native (CORBA_priority, native_priority); if (!convert_result) ACE_ERROR_RETURN ((LM_ERROR, "Error in converting CORBA priority %d to native priority\n", CORBA_priority), -1); int force_active = 0; if (priority_setting == AT_THREAD_CREATION) { result = continuous_worker.activate (flags, continuous_workers, force_active, native_priority); if (result != 0) ACE_ERROR_RETURN ((LM_ERROR, "Continuous_Worker::activate failed\n"), result); } else { result = continuous_worker.activate (flags, continuous_workers); if (result != 0) ACE_ERROR_RETURN ((LM_ERROR, "Continuous_Worker::activate failed\n"), result); } flags = THR_NEW_LWP | THR_JOINABLE | this->orb_->orb_core ()->orb_params ()->thread_creation_flags (); for (i = 0; i < rates.size (); ++i) { if (priority_setting == AT_THREAD_CREATION) { if (set_priority) { CORBA_priority = paced_workers[i]->priority_; convert_result = priority_mapping.to_native (CORBA_priority, native_priority); if (!convert_result) ACE_ERROR_RETURN ((LM_ERROR, "Error in converting CORBA priority %d to native priority\n", CORBA_priority), -1); } result = paced_workers[i]->activate (flags, 1, force_active, native_priority); if (result != 0) ACE_ERROR_RETURN ((LM_ERROR, "Paced_Worker::activate failed\n"), result); } else { result = paced_workers[i]->activate (flags); if (result != 0) ACE_ERROR_RETURN ((LM_ERROR, "Paced_Worker::activate failed\n"), result); } } if (rates.size () != 0) { paced_workers_manager.wait (); } continuous_workers_manager.wait (); continuous_worker.print_collective_stats (); for (i = 0; i < rates.size (); ++i) { delete paced_workers[i]; } delete[] paced_workers; if (shutdown_server) { test->shutdown (); } } catch (const CORBA::Exception& ex) { ex._tao_print_exception ("Exception caught:"); return -1; } return 0; }
void Client::priority_invocations (int debug) { ULong_Array priorities; int result = get_values ("client", invocation_priorities_file, "invocation priorities", priorities, debug); if (result != 0) { ACE_ERROR ((LM_ERROR, "Error in parsing invocation priorities data file: %s\n", invocation_priorities_file)); return; } u_long i = 0; Worker_Thread **workers = 0; ACE_NEW_THROW_EX (workers, Worker_Thread *[priorities.size ()], CORBA::NO_MEMORY ()); ACE_Thread_Manager thread_manager; for (i = 0; i < priorities.size (); ++i) { ACE_NEW_THROW_EX (workers[i], Worker_Thread (thread_manager, *this, this->test_.in (), this->current_.in (), priorities[i]), CORBA::NO_MEMORY ()); long flags = THR_NEW_LWP | THR_JOINABLE | this->orb_->orb_core ()->orb_params ()->thread_creation_flags (); result = workers[i]->activate (flags); if (result != 0) { ACE_ERROR ((LM_ERROR, "Cannot activate thread\n")); return; } } thread_manager.wait (); for (i = 0; i < priorities.size (); ++i) { delete workers[i]; } delete[] workers; }