// $Id$ #include "Kokyu_dsrt.h" #include "ace/Dynamic_Service.h" #include "DSRT_Direct_Dispatcher_Impl_T.h" #include "DSRT_CV_Dispatcher_Impl_T.h" #if ! defined (__ACE_INLINE__) #include "Kokyu_dsrt.i" #endif /* __ACE_INLINE__ */ ACE_RCSID(Kokyu, Kokyu, "$Id$") namespace Kokyu { template void DSRT_Dispatcher::implementation (DSRT_Dispatcher_Impl* impl) { auto_ptr > tmp_impl (impl); dispatcher_impl_ = tmp_impl; } template int DSRT_Dispatcher::schedule (Guid_t guid, const DSRT_QoSDescriptor& qos) { return dispatcher_impl_->schedule (guid, qos); } template int DSRT_Dispatcher::update_schedule (Guid_t guid, const DSRT_QoSDescriptor& qos) { return dispatcher_impl_->update_schedule (guid, qos); } template int DSRT_Dispatcher::update_schedule (Guid_t guid, Kokyu::Block_Flag_t flag) { return dispatcher_impl_->update_schedule (guid, flag); } template int DSRT_Dispatcher::cancel_schedule (Guid_t guid) { return dispatcher_impl_->cancel_schedule (guid); } template int DSRT_Dispatcher::shutdown () { return dispatcher_impl_->shutdown (); } template typename DSRT_Dispatcher_Factory::DSRT_Dispatcher_Auto_Ptr DSRT_Dispatcher_Factory:: create_DSRT_dispatcher (const DSRT_ConfigInfo& config_info) { ACE_UNUSED_ARG ((config_info)); DSRT_Dispatcher_Impl* tmp; DSRT_Dispatcher* disp; DSRT_Dispatcher_Auto_Ptr nil_ptr((DSRT_Dispatcher*)0); //DSRT_Dispatcher_Impl::init_svcs (); //ACE_Service_Config::open ("Kokyu", ACE_DEFAULT_LOGGER_KEY, 0); //tmp = // ACE_Dynamic_Service::instance ("DSRT_Dispatcher_Impl"); switch (config_info.impl_type_) { case DSRT_OS_BASED: ACE_NEW_RETURN (tmp, DSRT_Direct_Dispatcher_Impl ( config_info.sched_policy_, config_info.sched_scope_), nil_ptr); break; case DSRT_CV_BASED: default: ACE_NEW_RETURN (tmp, DSRT_CV_Dispatcher_Impl( config_info.sched_policy_, config_info.sched_scope_), nil_ptr); break; } ACE_ASSERT (tmp != 0); ACE_NEW_RETURN (disp, DSRT_Dispatcher, nil_ptr); DSRT_Dispatcher_Auto_Ptr disp_auto_ptr(disp); disp->implementation (tmp); tmp->init (config_info); return disp_auto_ptr; } template int MUF_Comparator:: operator ()(const QoSDescriptor_t& qos1, const QoSDescriptor_t& qos2) { if (qos1.criticality_ > qos2.criticality_) { return 1; } else if (qos2.criticality_ > qos1.criticality_) { return -1; } typename QoSDescriptor_t::Now now_functor; Time_t now = now_functor (); Time_t exec_time1 = qos1.exec_time_; Time_t deadline1 = qos1.deadline_; Time_t laxity1 = deadline1 - now - exec_time1; Time_t exec_time2 = qos2.exec_time_; Time_t deadline2 = qos2.deadline_; Time_t laxity2 = deadline2 - now - exec_time2; if (laxity1 < laxity2) { return 1; } else if (laxity1 == laxity2) { return 0; } else { return -1; } } template int MIF_Comparator:: operator ()(const QoSDescriptor& qos1, const QoSDescriptor& qos2) { #ifdef KOKYU_DSRT_LOGGING ACE_DEBUG ((LM_DEBUG, "(%t|%T):qos1.importance = %d, qos2.importance = %d\n", qos1.importance_, qos2.importance_)); #endif if (qos1.importance_ > qos2.importance_) { return 1; } else if (qos1.importance_ == qos2.importance_) { return 0; } else { return -1; } } template int Fixed_Priority_Comparator:: operator ()(const QoSDescriptor& qos1, const QoSDescriptor& qos2) { if (qos1.priority_ > qos2.priority_) { return 1; } else if (qos1.priority_ == qos2.priority_) { return 0; } else { return -1; } } }