diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp new file mode 100644 index 00000000000..7c20f6e0c66 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.cpp @@ -0,0 +1,210 @@ +// $Id$ + +#include "orbsvcs/Event/EC_Kokyu_Dispatching.h" +#include "orbsvcs/Event/EC_Event_Channel_Base.h" +#include "orbsvcs/Event/EC_ProxySupplier.h" +#include "orbsvcs/Event/EC_QOS_Info.h" + +#include "orbsvcs/Event_Service_Constants.h" +#include "orbsvcs/RtecSchedulerC.h" +#include "tao/ORB_Constants.h" + +#include "ace/Sched_Params.h" +#include "ace/Malloc_Allocator.h" + +#include "Kokyu/Kokyu.h" + +#if ! defined (__ACE_INLINE__) +#include "orbsvcs/Event/EC_Kokyu_Dispatching.inl" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID (Event, + EC_Kokyu_Dispatching, + "$Id$") + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +TAO_EC_Kokyu_Dispatching::TAO_EC_Kokyu_Dispatching (TAO_EC_Event_Channel_Base *ec, int sched_policy, int sched_scope) + :allocator_ (0), + dispatcher_ (0), + lanes_setup_ (0), + disp_sched_policy_ (sched_policy), + disp_sched_scope_ (sched_scope) +{ + CORBA::Object_var tmp = ec->scheduler (); + this->scheduler_ = RtecScheduler::Scheduler::_narrow (tmp.in ()); + + //@@VS - need to revisit this - should be some other allocator + if (this->allocator_ == 0) + { + this->allocator_ = ACE_Allocator::instance (); + } +} + +void +TAO_EC_Kokyu_Dispatching::activate (void) +{ + if (!lanes_setup_) + setup_lanes (); + + this->dispatcher_->activate (); + + //ACE_DEBUG ((LM_DEBUG, "Kokyu dispatcher activated\n")); +} + +void +TAO_EC_Kokyu_Dispatching::setup_lanes (void) +{ + ACE_DECLARE_NEW_CORBA_ENV; + // Query the scheduler togetConfig_Infos + RtecScheduler::Config_Info_Set_var configs; + ACE_TRY + { + this->scheduler_->get_config_infos(configs.out()); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + // Ignore exceptions.. + } + ACE_ENDTRY; + + //might be no Config_Infos in the set (if none passed to scheduler_) + + // Convert RtecScheduler::Config_Info_Set to Kokyu::ConfigInfoSet + // OK to assume exact correspondence betwen Config_Info and ConfigInfo? + Kokyu::ConfigInfoSet kconfigs(configs->length()); + for(CORBA::ULong i=0; i<configs->length(); ++i) { + kconfigs[i].preemption_priority_ = configs[i].preemption_priority; + kconfigs[i].thread_priority_ = configs[i].thread_priority; + switch (configs[i].dispatching_type) { + case RtecScheduler::STATIC_DISPATCHING: + kconfigs[i].dispatching_type_ = Kokyu::FIFO_DISPATCHING; + break; + case RtecScheduler::DEADLINE_DISPATCHING: + kconfigs[i].dispatching_type_ = Kokyu::DEADLINE_DISPATCHING; + break; + case RtecScheduler::LAXITY_DISPATCHING: + kconfigs[i].dispatching_type_ = Kokyu::LAXITY_DISPATCHING; + break; + } + } + + Kokyu::Dispatcher_Attributes attrs; + attrs.config_info_set_ = kconfigs; + attrs.sched_policy (disp_sched_policy_); + attrs.sched_scope (disp_sched_scope_); + + // Create Kokyu::Dispatcher using factory + Kokyu::Dispatcher_Auto_Ptr + tmp(Kokyu::Dispatcher_Factory::create_dispatcher(attrs)); + this->dispatcher_ = tmp; + this->lanes_setup_ = 1; + + //ACE_DEBUG ((LM_DEBUG, "Kokyu dispatcher setup\n")); +} + +void +TAO_EC_Kokyu_Dispatching::shutdown (void) +{ + this->dispatcher_->shutdown(); +} + +void +TAO_EC_Kokyu_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy, + RtecEventComm::PushConsumer_ptr consumer, + const RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + RtecEventComm::EventSet event_copy = event; + this->push_nocopy (proxy, consumer, event_copy, qos_info ACE_ENV_ARG_PARAMETER); +} + +void +TAO_EC_Kokyu_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy, + RtecEventComm::PushConsumer_ptr consumer, + RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + if (this->dispatcher_.get () == 0) + this->setup_lanes (); + + void* buf = + this->allocator_->malloc (sizeof (TAO_EC_Kokyu_Push_Command )); + + if (buf == 0) + ACE_THROW (CORBA::NO_MEMORY (TAO::VMCID, + CORBA::COMPLETED_NO)); + + // Create Dispatch_Command + TAO_EC_Kokyu_Push_Command *cmd = + new (buf) TAO_EC_Kokyu_Push_Command (proxy, + consumer, + event, this->allocator_); + + /* + TAO_EC_Kokyu_Push_Command *cmd = + new TAO_EC_Kokyu_Push_Command (proxy, + consumer, + event, 0); + */ + + // Convert TAO_EC_QOS_Info to QoSDescriptor + RtecScheduler::RT_Info *rt_info = + this->scheduler_->get(qos_info.rt_info); + + Kokyu::QoSDescriptor qosd; + qosd.preemption_priority_ = rt_info->preemption_priority; + qosd.deadline_ = rt_info->period; + ORBSVCS_Time::TimeT_to_Time_Value (qosd.execution_time_, + rt_info->worst_case_execution_time); + + this->dispatcher_->dispatch(cmd,qosd); +} + +// **************************************************************** + +TAO_EC_Kokyu_Shutdown_Command::~TAO_EC_Kokyu_Shutdown_Command(void) +{ +} + +int +TAO_EC_Kokyu_Shutdown_Command::execute(void) +{ + return -1; +} + +// **************************************************************** + +TAO_EC_Kokyu_Push_Command::~TAO_EC_Kokyu_Push_Command(void) +{ + this->proxy_->_decr_refcnt (); +} + +int +TAO_EC_Kokyu_Push_Command::execute () +{ + ACE_DECLARE_NEW_CORBA_ENV; + + ACE_TRY + { + //ACE_DEBUG ((LM_DEBUG, + // "(%t) Command object executed.\n")); + + this->proxy_->push_to_consumer (this->consumer_.in (), + this->event_ + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + return -1; + } + ACE_ENDTRY; + + return 0; +} + +TAO_END_VERSIONED_NAMESPACE_DECL |