diff options
author | thrall <thrall@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-04-11 20:44:50 +0000 |
---|---|---|
committer | thrall <thrall@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-04-11 20:44:50 +0000 |
commit | e6757188ab2ee7b42c8af0d2224186b018761ecb (patch) | |
tree | e80e4d549152471b1e5455bca3223595b1171dac | |
parent | 1bbdc27d6730396a2466fad5f81ae0bc6f1b8619 (diff) | |
download | ATCD-e6757188ab2ee7b42c8af0d2224186b018761ecb.tar.gz |
Initial commit; some testing left to do
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h | 130 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i | 35 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp | 236 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h | 72 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i | 7 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp | 285 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h | 130 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.i | 1 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp | 362 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h | 85 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i | 8 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp | 96 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h | 74 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i | 8 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsp | 231 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsw | 290 |
16 files changed, 2050 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h new file mode 100644 index 00000000000..67efb7ce4b0 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h @@ -0,0 +1,130 @@ +/* -*- C++ -*- */ +/** + * @file EC_Kokyu_Dispatching.h + * + * $Id$ + * + * @author Bryan Thrall (thrall@cs.wustl.edu) + * + * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and + * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group. + * More details can be found in: + * + * http://doc.ece.uci.edu/~coryan/EC/index.html + */ + +#ifndef TAO_EC_KOKYU_DISPATCHING_H +#define TAO_EC_KOKYU_DISPATCHING_H +#include "ace/pre.h" + +#include "EC_Dispatching.h" +#include "EC_ProxySupplier.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "orbsvcs/RtecSchedulerC.h" +#include "rtkokyu_event_export.h" + +#include "ace/Thread_Manager.h" + +#include "Kokyu/Kokyu.h" + +class TAO_EC_Event_Channel; + +/** + * @class TAO_EC_Kokyu_Dispatching + * + * @brief Dispatching strategy that minimizes priority inversion. + * + * This strategy uses multiple queues, each serviced by a thread + * at different priority. This minimizes priority inversion + * because the consumers at higher priority are serviced before + * consumers at lower priority. + * It is more flexible than using the supplier thread to dispatch + * because it allows high-priority suppliers to push events to + * low-priority consumers (and vice-versa). + * It also isolates the supplier threads from the time spent on + * upcalls to the consumer objects, making the system easier to + * analyze and schedule. + */ +class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Dispatching : public TAO_EC_Dispatching +{ +public: + /// The scheduler is used to find the range of priorities and similar + /// info. + TAO_EC_Kokyu_Dispatching (TAO_EC_Event_Channel* ec); + + // = The EC_Dispatching methods. + virtual void activate (void); + virtual void shutdown (void); + virtual void push (TAO_EC_ProxyPushSupplier* proxy, + RtecEventComm::PushConsumer_ptr consumer, + const RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + virtual void push_nocopy (TAO_EC_ProxyPushSupplier* proxy, + RtecEventComm::PushConsumer_ptr consumer, + RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + +private: + /// The dispatcher + Kokyu::Dispatcher* dispatcher_; + + /// The scheduler + RtecScheduler::Scheduler_var scheduler_; +}; + +// **************************************************************** + +class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Shutdown_Command : public Kokyu::Dispatch_Command +{ +public: + /// Constructor + TAO_EC_Kokyu_Shutdown_Command (void); + + /// Command callback + virtual int execute (void); + +protected: + //Protected so can't be put on stack; must be dynamically allocated + virtual ~TAO_EC_Kokyu_Shutdown_Command (void); +}; + +// **************************************************************** + +class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Push_Command : public Kokyu::Dispatch_Command +{ +public: + /// Constructor + TAO_EC_Kokyu_Push_Command (TAO_EC_ProxyPushSupplier* proxy, + RtecEventComm::PushConsumer_ptr consumer, + RtecEventComm::EventSet& event); + + /// Command callback + virtual int execute (void); + +protected: + //Protected so can't be put on stack; must be dynamically allocated + virtual ~TAO_EC_Kokyu_Push_Command (void); + +private: + /// The proxy + TAO_EC_ProxyPushSupplier* proxy_; + + /// The consumer connected to the proxy when the event was pushed. + RtecEventComm::PushConsumer_var consumer_; + + /// The event + RtecEventComm::EventSet event_; +}; + +#if defined (__ACE_INLINE__) +#include "EC_Kokyu_Dispatching.i" +#endif /* __ACE_INLINE__ */ + +#include "ace/post.h" +#endif /* TAO_EC_KOKYU_DISPATCHING_H */ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i new file mode 100644 index 00000000000..c8a0f3cc6be --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i @@ -0,0 +1,35 @@ +// $Id$ +// **************************************************************** + +ACE_INLINE +TAO_EC_Kokyu_Shutdown_Command:: + TAO_EC_Kokyu_Shutdown_Command (void) + : Kokyu::Dispatch_Command () +{ +} + +// **************************************************************** + +ACE_INLINE +TAO_EC_Kokyu_Push_Command::TAO_EC_Kokyu_Push_Command ( + TAO_EC_ProxyPushSupplier* proxy, + RtecEventComm::PushConsumer_ptr consumer, + RtecEventComm::EventSet& event) + : Kokyu::Dispatch_Command (), + proxy_ (proxy), + consumer_ (RtecEventComm::PushConsumer::_duplicate (consumer)) + +{ + // + // Efficient copy, steal the buffer from <event> + // We cannot do this on the initialization because get_buffer() + // could get called first, effectively setting maximum() and + // length() to 0! + // + CORBA::ULong maximum = event.maximum (); + CORBA::ULong length = event.length (); + RtecEventComm::Event* buffer = event.get_buffer (1); + event_.replace (maximum, length, buffer, 1); + + this->proxy_->_incr_refcnt (); +} diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp new file mode 100644 index 00000000000..b023967030e --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp @@ -0,0 +1,236 @@ +// $Id$ + +#include "EC_Kokyu_Factory.h" +#include "EC_Kokyu_Dispatching.h" +#include "EC_Kokyu_Scheduling.h" +#include "EC_Kokyu_Filter_Builder.h" +#include "EC_Event_Channel.h" +#include "orbsvcs/RtecSchedulerC.h" + +#include "ace/Arg_Shifter.h" +#include "ace/Sched_Params.h" + +#if ! defined (__ACE_INLINE__) +#include "EC_Kokyu_Factory.i" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID(Event, EC_Kokyu_Factory, "$Id$") + +TAO_EC_Kokyu_Factory::~TAO_EC_Kokyu_Factory (void) +{ +} + +int +TAO_EC_Kokyu_Factory::init_svcs (void) +{ + return ACE_Service_Config::static_svcs ()-> + insert (&ace_svc_desc_TAO_EC_Kokyu_Factory); +} + +int +TAO_EC_Kokyu_Factory::init (int argc, ACE_TCHAR* argv[]) +{ + ACE_Arg_Shifter arg_shifter (argc, argv); + + while (arg_shifter.is_anything_left ()) + { + const ACE_TCHAR* arg = arg_shifter.get_current (); + + if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-ECDispatching")) == 0) + { + arg_shifter.consume_arg (); + + if (arg_shifter.is_parameter_next ()) + { + const ACE_TCHAR* opt = arg_shifter.get_current (); + if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("reactive")) == 0) + { + this->dispatching_ = 0; + } + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("mt")) == 0) + { + this->dispatching_ = 1; + } + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("kokyu")) == 0) + { + this->dispatching_ = 2; + } + else + { + ACE_ERROR ((LM_ERROR, + ACE_LIB_TEXT("EC_Kokyu_Factory - ") + ACE_LIB_TEXT("unsupported dispatching <%s>\n"), + opt)); + } + arg_shifter.consume_arg (); + } + } + + else if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-ECFiltering")) == 0) + { + arg_shifter.consume_arg (); + + if (arg_shifter.is_parameter_next ()) + { + const ACE_TCHAR* opt = arg_shifter.get_current (); + if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("null")) == 0) + { + this->filtering_ = 0; + } + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("basic")) == 0) + { + this->filtering_ = 1; + } + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("prefix")) == 0) + { + this->filtering_ = 2; + } + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("kokyu")) == 0) + { + this->filtering_ = 3; + } + else + { + ACE_ERROR ((LM_ERROR, + ACE_LIB_TEXT("EC_Kokyu_Factory - ") + ACE_LIB_TEXT("unsupported filtering <%s>\n"), + opt)); + } + arg_shifter.consume_arg (); + } + } + + else if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-ECTimeout")) == 0) + { + arg_shifter.consume_arg (); + + if (arg_shifter.is_parameter_next ()) + { + const ACE_TCHAR* opt = arg_shifter.get_current (); + if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("reactive")) == 0) + { + this->timeout_ = 0; + } +#if 0 + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("kokyu")) == 0) + { + this->timeout_ = 1; + } +#endif /* 0 */ + else + { + ACE_ERROR ((LM_ERROR, + ACE_LIB_TEXT("EC_Kokyu_Factory - ") + ACE_LIB_TEXT("unsupported timeout <%s>\n"), + opt)); + } + arg_shifter.consume_arg (); + } + } + + else if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-ECScheduling")) == 0) + { + arg_shifter.consume_arg (); + + if (arg_shifter.is_parameter_next ()) + { + const ACE_TCHAR* opt = arg_shifter.get_current (); + if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("null")) == 0) + { + this->scheduling_ = 0; + } + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("group")) == 0) + { + this->scheduling_ = 1; + } + else if (ACE_OS::strcasecmp (opt, ACE_LIB_TEXT("kokyu")) == 0) + { + this->scheduling_ = 2; + } + else + { + ACE_ERROR ((LM_ERROR, + ACE_LIB_TEXT("EC_Kokyu_Factory - ") + ACE_LIB_TEXT("unsupported scheduling <%s>\n"), + opt)); + } + arg_shifter.consume_arg (); + } + } + + else + { + arg_shifter.ignore_arg (); + } + } + return this->TAO_EC_Default_Factory::init (argc, argv); +} + +int +TAO_EC_Kokyu_Factory::fini (void) +{ + return 0; +} + +// **************************************************************** + +TAO_EC_Dispatching* +TAO_EC_Kokyu_Factory::create_dispatching (TAO_EC_Event_Channel *ec) +{ + if (this->dispatching_ == 2) + return new TAO_EC_Kokyu_Dispatching (ec); + return this->TAO_EC_Default_Factory::create_dispatching (ec); +} + +TAO_EC_Filter_Builder* +TAO_EC_Kokyu_Factory::create_filter_builder (TAO_EC_Event_Channel *ec) +{ + if (this->filtering_ == 3) + return new TAO_EC_Kokyu_Filter_Builder (ec); + + return this->TAO_EC_Default_Factory::create_filter_builder (ec); +} + + +TAO_EC_Timeout_Generator* +TAO_EC_Kokyu_Factory::create_timeout_generator (TAO_EC_Event_Channel *ec) +{ +#if 0 + if (this->timeout_ == 1) + { + //Kokyu timeout generator? + } +#endif + return this->TAO_EC_Default_Factory::create_timeout_generator (ec); +} + +TAO_EC_Scheduling_Strategy* +TAO_EC_Kokyu_Factory::create_scheduling_strategy (TAO_EC_Event_Channel* ec) +{ + if (this->scheduling_ == 2) + { + CORBA::Object_var tmp = ec->scheduler (); + RtecScheduler::Scheduler_var scheduler = + RtecScheduler::Scheduler::_narrow (tmp.in ()); + return new TAO_EC_Kokyu_Scheduling (scheduler.in ()); + } + return this->TAO_EC_Default_Factory::create_scheduling_strategy (ec); +} + +// **************************************************************** + +ACE_STATIC_SVC_DEFINE (TAO_EC_Kokyu_Factory, + ACE_TEXT ("EC_Factory"), + ACE_SVC_OBJ_T, + &ACE_SVC_NAME (TAO_EC_Kokyu_Factory), + ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ, + 0) +ACE_FACTORY_DEFINE (TAO_RTKokyuEvent, TAO_EC_Kokyu_Factory) + +// **************************************************************** + +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) + +#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) + +#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h new file mode 100644 index 00000000000..9eb866f7898 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h @@ -0,0 +1,72 @@ +/* -*- C++ -*- */ +/** + * @file EC_Kokyu_Factory.h + * + * $Id$ + * + * @author Bryan Thrall (thrall@cs.wustl.edu) + * + * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and + * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group. + * More details can be found in: + * + * http://doc.ece.uci.edu/~coryan/EC/index.html + */ + +#ifndef TAO_EC_KOKYU_FACTORY_H +#define TAO_EC_KOKYU_FACTORY_H +#include "ace/pre.h" + +#include "EC_Default_Factory.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "rtkokyu_event_export.h" + +/** + * @class TAO_EC_Kokyu_Factory + * + * @brief Extend the default factory to support scheduling + * + */ +class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Factory : public TAO_EC_Default_Factory +{ +public: + /// Constructor + TAO_EC_Kokyu_Factory (void); + + /// Helper function to register the Kokyu factory into the service + /// configurator. + static int init_svcs (void); + + /// destructor... + virtual ~TAO_EC_Kokyu_Factory (void); + + // = The Service_Object entry points + virtual int init (int argc, ACE_TCHAR* argv[]); + virtual int fini (void); + + // = The EC_Factory methods + virtual TAO_EC_Dispatching* + create_dispatching (TAO_EC_Event_Channel*); + virtual TAO_EC_Filter_Builder* + create_filter_builder (TAO_EC_Event_Channel*); + virtual TAO_EC_Timeout_Generator* + create_timeout_generator (TAO_EC_Event_Channel*); + virtual TAO_EC_Scheduling_Strategy* + create_scheduling_strategy (TAO_EC_Event_Channel*); + +private: +}; + +#if defined (__ACE_INLINE__) +#include "EC_Kokyu_Factory.i" +#endif /* __ACE_INLINE__ */ + +ACE_STATIC_SVC_DECLARE (TAO_EC_Kokyu_Factory) +ACE_FACTORY_DECLARE (TAO_RTKokyuEvent, TAO_EC_Kokyu_Factory) + +#include "ace/post.h" +#endif /* TAO_EC_KOKYU_FACTORY_H */ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i new file mode 100644 index 00000000000..818dcde9254 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i @@ -0,0 +1,7 @@ +// $Id$ + +ACE_INLINE +TAO_EC_Kokyu_Factory::TAO_EC_Kokyu_Factory (void) + : TAO_EC_Default_Factory () +{ +} diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp new file mode 100644 index 00000000000..96df4ee0ba8 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp @@ -0,0 +1,285 @@ +// $Id$ + +#include "EC_Kokyu_Filter.h" +#include "EC_QOS_Info.h" + +#if ! defined (__ACE_INLINE__) +#include "EC_Kokyu_Filter.i" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID(Event, EC_Kokyu_Filter, "$Id$") + +TAO_EC_Kokyu_Filter:: + TAO_EC_Kokyu_Filter (const char* name, + RtecScheduler::handle_t rt_info, + RtecScheduler::Scheduler_ptr scheduler, + TAO_EC_Filter* body, + RtecScheduler::handle_t body_info, + RtecScheduler::handle_t parent_info, + RtecScheduler::Info_Type_t info_type) + + : rt_info_ (rt_info), + rt_info_computed_ (0), + name_ (name), + scheduler_ (RtecScheduler::Scheduler::_duplicate (scheduler)), + body_ (body), + body_info_ (body_info), + parent_info_ (parent_info), + info_type_ (info_type) +{ + this->adopt_child (this->body_); +} + +TAO_EC_Kokyu_Filter::~TAO_EC_Kokyu_Filter (void) +{ + delete this->body_; +} + +TAO_EC_Filter::ChildrenIterator +TAO_EC_Kokyu_Filter::begin (void) const +{ + return this->body_->begin (); +} + +TAO_EC_Filter::ChildrenIterator +TAO_EC_Kokyu_Filter::end (void) const +{ + return this->body_->end (); +} + +int +TAO_EC_Kokyu_Filter::size (void) const +{ + return this->body_->size (); +} + +int +TAO_EC_Kokyu_Filter::filter (const RtecEventComm::EventSet &event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + return this->body_->filter (event, qos_info ACE_ENV_ARG_PARAMETER); +} + +int +TAO_EC_Kokyu_Filter::filter_nocopy (RtecEventComm::EventSet &event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + return this->body_->filter_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER); +} + +// This is private, so we can make it inline in the .cpp file... +void +TAO_EC_Kokyu_Filter::compute_qos_info (TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + qos_info.rt_info = this->rt_info_; + switch (this->info_type_) + { + default: + case RtecScheduler::DISJUNCTION: + break; + + case RtecScheduler::CONJUNCTION: + case RtecScheduler::OPERATION: + { + RtecScheduler::OS_Priority os_priority; + RtecScheduler::Preemption_Subpriority_t p_subpriority; + RtecScheduler::Preemption_Priority_t p_priority; + this->scheduler_->priority (this->rt_info_, + os_priority, + p_subpriority, + p_priority + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + qos_info.preemption_priority = p_priority; + } + } +} + +void +TAO_EC_Kokyu_Filter::push (const RtecEventComm::EventSet &event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + if (this->parent () != 0) + { + this->compute_qos_info (qos_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + this->parent ()->push (event, qos_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } +} + +void +TAO_EC_Kokyu_Filter::push_nocopy (RtecEventComm::EventSet &event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + if (this->parent () != 0) + { + this->compute_qos_info (qos_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + this->parent ()->push_nocopy (event, qos_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } +} + +void +TAO_EC_Kokyu_Filter::clear (void) +{ + this->body_->clear (); +} + +CORBA::ULong +TAO_EC_Kokyu_Filter::max_event_size (void) const +{ + return this->body_->max_event_size (); +} + +int +TAO_EC_Kokyu_Filter::can_match (const RtecEventComm::EventHeader& header) const +{ + return this->body_->can_match (header); +} + +int +TAO_EC_Kokyu_Filter::add_dependencies (const RtecEventComm::EventHeader& header, + const TAO_EC_QOS_Info &qos_info + ACE_ENV_ARG_DECL) +{ + this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + int matches = this->body_->add_dependencies (header, + qos_info + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + if (matches != 0) + { + this->scheduler_->add_dependency (this->rt_info_, qos_info.rt_info, 1, + RtecBase::TWO_WAY_CALL + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + RtecScheduler::RT_Info_var info = + this->scheduler_->get (qos_info.rt_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", + this->name_.c_str (), + info->entry_point.in ())); + } + + ChildrenIterator end = this->end (); + for (ChildrenIterator i = this->begin (); i != end; ++i) + { + (*i)->add_dependencies (header, qos_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + return 0; +} + +void +TAO_EC_Kokyu_Filter::get_qos_info (TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL) +{ + this->init_rt_info (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + qos_info.rt_info = this->rt_info_; +} + +void +TAO_EC_Kokyu_Filter::init_rt_info (ACE_ENV_SINGLE_ARG_DECL) +{ + if (this->rt_info_computed_) + return; + +#if 0 //ifdef'ed by VS + + // Provide dummy values the scheduler will compute them based on the + // dependencies and the fact that this is a DISJUNCTION. + this->scheduler_->set (this->rt_info_, + RtecScheduler::VERY_LOW_CRITICALITY, + 0, // worst_cast_execution_time + 0, // typical_cast_execution_time + 0, // cached_cast_execution_time + 0, // period + RtecScheduler::VERY_LOW_IMPORTANCE, + 0, // quantum + 0, // threads + this->info_type_ + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; +#endif //ifdef'ed by VS + +#if 0 + ChildrenIterator end = this->end (); + for (ChildrenIterator i = this->begin (); i != end; ++i) + { + TAO_EC_Filter* filter = *i; + + TAO_EC_QOS_Info child; + filter->get_qos_info (child ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + this->scheduler_->add_dependency (this->rt_info_, + child.rt_info, 1, + RtecBase::TWO_WAY_CALL + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + RtecScheduler::RT_Info_var info = + this->scheduler_->get (child.rt_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", + info->entry_point.in (), + this->name_.c_str ())); + + } +#endif /* 0 */ + +#if 0 //ifdef changed from 1 to 0 by VS + if (this->body_info_ != this->rt_info_) + { + this->scheduler_->add_dependency (this->rt_info_, + this->body_info_, + 1, + RtecBase::TWO_WAY_CALL + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + RtecScheduler::RT_Info_var info = + this->scheduler_->get (this->body_info_ ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", + info->entry_point.in (), + this->name_.c_str ())); + } +#endif /* 0 */ + +#if 0 //ifdef changed from 1 to 0 by VS + this->scheduler_->add_dependency (this->parent_info_, + this->rt_info_, + 1, + RtecBase::TWO_WAY_CALL + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + RtecScheduler::RT_Info_var info = + this->scheduler_->get (this->parent_info_ ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + ACE_DEBUG ((LM_DEBUG, "[%s] ----> [%s]\n", + this->name_.c_str (), + info->entry_point.in ())); +#endif /* 0 */ + + this->rt_info_computed_ = 1; +} diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h new file mode 100644 index 00000000000..f0f6d931ba3 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h @@ -0,0 +1,130 @@ +/* -*- C++ -*- */ +/** + * @file EC_Kokyu_Filter.h + * + * $Id$ + * + * @author Carlos O'Ryan (coryan@cs.wustl.edu) + * + * Based on previous work by Tim Harrison (harrison@cs.wustl.edu) and + * other members of the DOC group. More details can be found in: + * + * http://doc.ece.uci.edu/~coryan/EC/index.html + */ + +#ifndef TAO_EC_KOKYU_FILTER_H +#define TAO_EC_KOKYU_FILTER_H +#include "ace/pre.h" + +#include "EC_Filter.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "orbsvcs/RtecSchedulerC.h" +#include "rtkokyu_event_export.h" + +/** + * @class TAO_EC_Kokyu_Filter + * + * @brief Decorate a filter with scheduling information + * + * This filter decorates a regular filter with scheduling + * information. It creates a new RT_Info entry for the filter and + * it adds the dependencies between the filter and any childrens + * it may have. + * + * <H2>Memory Management</H2> + * It assumes ownership of the children. + */ +class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Filter : public TAO_EC_Filter +{ +public: + /** + * Constructor. + * It assumes ownership of the <body>, makes a copy of the other + * parameters + */ + TAO_EC_Kokyu_Filter (const char* name, + RtecScheduler::handle_t rt_info, + RtecScheduler::Scheduler_ptr scheduler, + TAO_EC_Filter* body, + RtecScheduler::handle_t body_info, + RtecScheduler::handle_t parent_info, + RtecScheduler::Info_Type_t info_type); + + /// Destructor + virtual ~TAO_EC_Kokyu_Filter (void); + + // = The TAO_EC_Filter methods, please check the documentation in + // TAO_EC_Filter. + virtual ChildrenIterator begin (void) const; + virtual ChildrenIterator end (void) const; + virtual int size (void) const; + virtual int filter (const RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + virtual int filter_nocopy (RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + virtual void push (const RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + virtual void push_nocopy (RtecEventComm::EventSet& event, + TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + virtual void clear (void); + virtual CORBA::ULong max_event_size (void) const; + virtual int can_match (const RtecEventComm::EventHeader& header) const; + virtual int add_dependencies (const RtecEventComm::EventHeader& header, + const TAO_EC_QOS_Info &qos_info + ACE_ENV_ARG_DECL); + virtual void get_qos_info (TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + +private: + ACE_UNIMPLEMENTED_FUNC (TAO_EC_Kokyu_Filter + (const TAO_EC_Kokyu_Filter&)) + ACE_UNIMPLEMENTED_FUNC (TAO_EC_Kokyu_Filter& operator= + (const TAO_EC_Kokyu_Filter&)) + + /// Initialize our RT_Info handle and dependencies + void init_rt_info (ACE_ENV_SINGLE_ARG_DECL); + + /// Compute a new qos_info to push up. + void compute_qos_info (TAO_EC_QOS_Info& qos_info + ACE_ENV_ARG_DECL); + +private: + /// The RT_Info handle for this object + RtecScheduler::handle_t rt_info_; + + /// Has the Scheduler been updated? + int rt_info_computed_; + + /// Our operation name + ACE_CString name_; + + /// The scheduler we are going to use + RtecScheduler::Scheduler_var scheduler_; + + /// The implementation + TAO_EC_Filter* body_; + + /// The RT_Info handle for the body + RtecScheduler::handle_t body_info_; + + /// The RT_Info handle for the parent + RtecScheduler::handle_t parent_info_; + + /// Required for the scheduling service + RtecScheduler::Info_Type_t info_type_; +}; + +#if defined (__ACE_INLINE__) +#include "EC_Kokyu_Filter.i" +#endif /* __ACE_INLINE__ */ + +#include "ace/post.h" +#endif /* TAO_EC_KOKYU_FILTER_H */ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.i new file mode 100644 index 00000000000..cfa1da318d3 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.i @@ -0,0 +1 @@ +// $Id$ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp new file mode 100644 index 00000000000..397f39b57e0 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp @@ -0,0 +1,362 @@ +// $Id$ + +#include "EC_Kokyu_Filter.h" +#include "orbsvcs/Event_Service_Constants.h" +#include "EC_Kokyu_Filter_Builder.h" +#include "EC_Type_Filter.h" +#include "EC_Conjunction_Filter.h" +#include "EC_Disjunction_Filter.h" +#include "EC_Timeout_Filter.h" +#include "EC_Event_Channel.h" + +#if ! defined (__ACE_INLINE__) +#include "EC_Kokyu_Filter_Builder.i" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID(Event, EC_Kokyu_Filter_Builder, "$Id$") + +TAO_EC_Kokyu_Filter_Builder::~TAO_EC_Kokyu_Filter_Builder (void) +{ +} + +TAO_EC_Filter* +TAO_EC_Kokyu_Filter_Builder::build ( + TAO_EC_ProxyPushSupplier *supplier, + RtecEventChannelAdmin::ConsumerQOS& qos + ACE_ENV_ARG_DECL) const +{ + CORBA::ULong pos = 0; + CORBA::Object_var tmp = + this->event_channel_->scheduler (); + + RtecScheduler::Scheduler_var scheduler = + RtecScheduler::Scheduler::_narrow (tmp.in () ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + +#if 0 //by VS + // @@ How do we figure out which parent??? + RtecScheduler::handle_t parent_info = + scheduler->lookup ("Dispatching_Task-250000.us" ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); +#endif + + return this->recursive_build (supplier, qos, pos, + scheduler.in (), + 0 //parent_info + ACE_ENV_ARG_PARAMETER); +} + +TAO_EC_Filter* +TAO_EC_Kokyu_Filter_Builder::recursive_build ( + TAO_EC_ProxyPushSupplier *supplier, + RtecEventChannelAdmin::ConsumerQOS& qos, + CORBA::ULong& pos, + RtecScheduler::Scheduler_ptr scheduler, + RtecScheduler::handle_t parent_info + ACE_ENV_ARG_DECL) const +{ + const RtecEventComm::Event& e = qos.dependencies[pos].event; + + if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR) + { + CORBA::ULong npos = pos; + ACE_CString name; + this->recursive_name (qos, npos, + scheduler, name + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + RtecScheduler::handle_t rt_info = + scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + pos++; // Consume the designator + CORBA::ULong n = this->count_children (qos, pos); + + TAO_EC_Filter** children; + ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0); + for (CORBA::ULong i = 0; i != n; ++i) + { + children[i] = this->recursive_build (supplier, qos, pos, + scheduler, + rt_info + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + + TAO_EC_Kokyu_Filter *filter; + ACE_NEW_RETURN (filter, + TAO_EC_Kokyu_Filter (name.c_str (), + rt_info, + scheduler, + new TAO_EC_Conjunction_Filter(children, + n), + rt_info, + parent_info, + RtecScheduler::CONJUNCTION), + 0); + TAO_EC_QOS_Info qos_info; + filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER); + // @@ + ACE_CHECK_RETURN (0); + return filter; + } + + else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR) + { + CORBA::ULong npos = pos; + ACE_CString name; + this->recursive_name (qos, npos, + scheduler, name + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + RtecScheduler::handle_t rt_info = + scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + pos++; // Consume the designator + CORBA::ULong n = this->count_children (qos, pos); + + TAO_EC_Filter** children; + ACE_NEW_RETURN (children, TAO_EC_Filter*[n], 0); + for (CORBA::ULong i = 0; i != n; ++i) + { + children[i] = this->recursive_build (supplier, qos, pos, + scheduler, + rt_info + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + TAO_EC_Kokyu_Filter *filter; + ACE_NEW_RETURN (filter, + TAO_EC_Kokyu_Filter (name.c_str (), + rt_info, + scheduler, + new TAO_EC_Disjunction_Filter (children, + n), + rt_info, + parent_info, + RtecScheduler::DISJUNCTION), + 0); + + TAO_EC_QOS_Info qos_info; + filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER); + // @@ + ACE_CHECK_RETURN (0); + return filter; + } +#if 1 //added by VS + else if (e.header.type == ACE_ES_GLOBAL_DESIGNATOR) + { + CORBA::ULong npos = pos+1; + const RtecEventComm::Event& e = qos.dependencies[npos].event; + + RtecScheduler::handle_t body_info = qos.dependencies[npos].rt_info; + + RtecScheduler::RT_Info_var info = + scheduler->get (body_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + ACE_CString name = info->entry_point.in (); + + TAO_EC_Kokyu_Filter *filter; + ACE_NEW_RETURN (filter, + TAO_EC_Kokyu_Filter (name.c_str (), + body_info, + scheduler, + new TAO_EC_Type_Filter (e.header), + body_info, + 0, + RtecScheduler::OPERATION), + 0); + + return filter; + } +#endif + + else if (e.header.type == ACE_ES_EVENT_TIMEOUT + || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT + || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT) + { + pos++; + + // @@ We need a unique name for each timeout, assigned by the + // application? + char buf[64]; + ACE_OS::sprintf (buf, "TIMEOUT:%u", + ACE_static_cast (u_int, + (e.header.creation_time / 10000))); + ACE_CString name = buf; + + TAO_EC_QOS_Info qos_info; + qos_info.rt_info = + scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + // Convert the time to the proper units.... + RtecScheduler::Period_t period = + ACE_static_cast (RtecScheduler::Period_t, + e.header.creation_time / 10); + + scheduler->set (qos_info.rt_info, + RtecScheduler::VERY_LOW_CRITICALITY, + 0, // worst_cast_execution_time + 0, // typical_cast_execution_time + 0, // cached_cast_execution_time + period, + RtecScheduler::VERY_LOW_IMPORTANCE, + 0, // quantum + 1, // threads + RtecScheduler::OPERATION + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + scheduler->add_dependency (qos_info.rt_info, + parent_info, + 1, + RtecBase::TWO_WAY_CALL + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return new TAO_EC_Timeout_Filter (this->event_channel_, + supplier, + qos_info, + e.header.type, + e.header.creation_time); + } + + RtecScheduler::handle_t body_info = qos.dependencies[pos].rt_info; + + RtecScheduler::RT_Info_var info = + scheduler->get (body_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + ACE_CString name = info->entry_point.in (); + name += "#rep"; + + RtecScheduler::handle_t rt_info = + scheduler->create (name.c_str () ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + pos++; + TAO_EC_Kokyu_Filter *filter; + ACE_NEW_RETURN (filter, + TAO_EC_Kokyu_Filter (name.c_str (), + rt_info, + scheduler, + new TAO_EC_Type_Filter (e.header), + body_info, + parent_info, + RtecScheduler::OPERATION), + 0); + + TAO_EC_QOS_Info qos_info; + filter->get_qos_info (qos_info ACE_ENV_ARG_PARAMETER); + // @@ + ACE_CHECK_RETURN (0); + return filter; +} + +void +TAO_EC_Kokyu_Filter_Builder:: recursive_name ( + RtecEventChannelAdmin::ConsumerQOS& qos, + CORBA::ULong& pos, + RtecScheduler::Scheduler_ptr scheduler, + ACE_CString& name + ACE_ENV_ARG_DECL) const +{ + const RtecEventComm::Event& e = qos.dependencies[pos].event; + + if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR) + { + pos++; // Consume the designator + CORBA::ULong n = this->count_children (qos, pos); + + for (CORBA::ULong i = 0; i != n; ++i) + { + ACE_CString child_name; + this->recursive_name (qos, pos, + scheduler, + child_name + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + if (i == 0) + name += "("; + else + name += "&&"; + name += child_name; + } + name += ")"; + return; + } + + else if (e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR) + { + pos++; // Consume the designator + CORBA::ULong n = this->count_children (qos, pos); + + for (CORBA::ULong i = 0; i != n; ++i) + { + ACE_CString child_name; + + this->recursive_name (qos, pos, + scheduler, + child_name + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + if (i == 0) + name += "("; + else + name += "||"; + name += child_name; + } + name += ")"; + return; + } + + else if (e.header.type == ACE_ES_EVENT_TIMEOUT + || e.header.type == ACE_ES_EVENT_INTERVAL_TIMEOUT + || e.header.type == ACE_ES_EVENT_DEADLINE_TIMEOUT) + { + pos++; + + char buf[64]; + ACE_OS::sprintf (buf, "TIMEOUT:%u", + ACE_static_cast (u_int, + (e.header.creation_time / 10000))); + name = buf; + + return; + } + + RtecScheduler::handle_t body_info = qos.dependencies[pos].rt_info; + + RtecScheduler::RT_Info_var info = + scheduler->get (body_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + name = info->entry_point.in (); + name += "#rep"; + + pos++; +} + +CORBA::ULong +TAO_EC_Kokyu_Filter_Builder:: + count_children (RtecEventChannelAdmin::ConsumerQOS& qos, + CORBA::ULong pos) const +{ + CORBA::ULong l = qos.dependencies.length (); + CORBA::ULong i; + for (i = pos; i != l; ++i) + { + const RtecEventComm::Event& e = qos.dependencies[i].event; + if (e.header.type == ACE_ES_CONJUNCTION_DESIGNATOR + || e.header.type == ACE_ES_DISJUNCTION_DESIGNATOR) + break; + } + return i - 1; +} diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h new file mode 100644 index 00000000000..662a0f584d3 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h @@ -0,0 +1,85 @@ +/* -*- C++ -*- */ +/** + * @file EC_Kokyu_Filter_Builder.h + * + * $Id$ + * + * @author Bryan Thrall (thrall@cs.wustl.edu) + * + * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and + * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group. + * More details can be found in: + * + * http://doc.ece.uci.edu/~coryan/EC/index.html + */ + +#ifndef TAO_EC_KOKYU_FILTER_BUILDER_H +#define TAO_EC_KOKYU_FILTER_BUILDER_H +#include "ace/pre.h" + +#include "EC_Filter_Builder.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "rtkokyu_event_export.h" + +class TAO_EC_Filter; +class TAO_EC_Event_Channel; + +/** + * @class TAO_EC_Kokyu_Filter_Builder + * + * @brief Implement a builder for the fundamental filters. + * + * The sched filtering mechanisms in the Event channel + * (source/type based filtering + disjunctions and conjunctions) + * are constructed using this class. + */ +class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Filter_Builder : public TAO_EC_Filter_Builder +{ +public: + /// constructor. + TAO_EC_Kokyu_Filter_Builder (TAO_EC_Event_Channel* ec); + + /// destructor... + virtual ~TAO_EC_Kokyu_Filter_Builder (void); + + // = The TAO_EC_Filter_Builder methods... + TAO_EC_Filter* build (TAO_EC_ProxyPushSupplier *supplier, + RtecEventChannelAdmin::ConsumerQOS& qos + ACE_ENV_ARG_DECL) const; + +private: + /// Recursively build the filter tree. + TAO_EC_Filter* recursive_build (TAO_EC_ProxyPushSupplier *supplier, + RtecEventChannelAdmin::ConsumerQOS& qos, + CORBA::ULong& pos, + RtecScheduler::Scheduler_ptr scheduler, + RtecScheduler::handle_t parent_info + ACE_ENV_ARG_DECL) const; + + /// Build the name recursively... + void recursive_name (RtecEventChannelAdmin::ConsumerQOS& qos, + CORBA::ULong& pos, + RtecScheduler::Scheduler_ptr scheduler, + ACE_CString &name + ACE_ENV_ARG_DECL) const; + + /// Count the number of children of the current node, i.e. until a + /// conjunction or disjunction starts. + CORBA::ULong count_children (RtecEventChannelAdmin::ConsumerQOS& qos, + CORBA::ULong pos) const; + +private: + /// The event channel. + TAO_EC_Event_Channel* event_channel_; +}; + +#if defined (__ACE_INLINE__) +#include "EC_Kokyu_Filter_Builder.i" +#endif /* __ACE_INLINE__ */ + +#include "ace/post.h" +#endif /* TAO_EC_KOKYU_FILTER_BUILDER_H */ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i new file mode 100644 index 00000000000..3d0bc98e6d9 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i @@ -0,0 +1,8 @@ +// $Id$ + +ACE_INLINE +TAO_EC_Kokyu_Filter_Builder:: + TAO_EC_Kokyu_Filter_Builder (TAO_EC_Event_Channel *ec) + : event_channel_ (ec) +{ +} diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp new file mode 100644 index 00000000000..bd1d0dd9f46 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp @@ -0,0 +1,96 @@ +// $Id$ + +#include "EC_Kokyu_Scheduling.h" +#include "EC_QOS_Info.h" +#include "EC_ProxyConsumer.h" +#include "EC_ProxySupplier.h" +#include "EC_Supplier_Filter.h" + +#if ! defined (__ACE_INLINE__) +#include "EC_Kokyu_Scheduling.i" +#endif /* __ACE_INLINE__ */ + +ACE_RCSID(Event, EC_Kokyu_Scheduling, "$Id$") + +TAO_EC_Kokyu_Scheduling::~TAO_EC_Kokyu_Scheduling (void) +{ +} + +void +TAO_EC_Kokyu_Scheduling::add_proxy_supplier_dependencies ( + TAO_EC_ProxyPushSupplier *supplier, + TAO_EC_ProxyPushConsumer *consumer + ACE_ENV_ARG_DECL) +{ + ACE_DEBUG ((LM_DEBUG, "add_proxy_supplier_dependencies - %x %x\n", + supplier, consumer)); + const RtecEventChannelAdmin::SupplierQOS& qos = + consumer->publications (); + for (CORBA::ULong i = 0; i < qos.publications.length (); ++i) + { + const RtecEventComm::EventHeader &header = + qos.publications[i].event.header; + TAO_EC_QOS_Info qos_info; + qos_info.rt_info = qos.publications[i].dependency_info.rt_info; + + RtecScheduler::OS_Priority os_priority; + RtecScheduler::Preemption_Subpriority_t p_subpriority; + RtecScheduler::Preemption_Priority_t p_priority; + this->scheduler_->priority (qos_info.rt_info, + os_priority, + p_subpriority, + p_priority + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + qos_info.preemption_priority = p_priority; + + supplier->add_dependencies (header, qos_info ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } +} + +void +TAO_EC_Kokyu_Scheduling::schedule_event (const RtecEventComm::EventSet &event, + TAO_EC_ProxyPushConsumer *consumer, + TAO_EC_Supplier_Filter *filter + ACE_ENV_ARG_DECL) +{ + RtecEventChannelAdmin::SupplierQOS qos = + consumer->publications (); + + for (CORBA::ULong j = 0; j != event.length (); ++j) + { + const RtecEventComm::Event& e = event[j]; + RtecEventComm::Event* buffer = + ACE_const_cast(RtecEventComm::Event*, &e); + RtecEventComm::EventSet single_event (1, 1, buffer, 0); + + TAO_EC_QOS_Info qos_info; + + for (CORBA::ULong i = 0; i != qos.publications.length (); ++i) + { + const RtecEventComm::EventHeader &qos_header = + qos.publications[i].event.header; + + if (TAO_EC_Filter::matches (e.header, qos_header) == 0) + continue; + + qos_info.rt_info = qos.publications[i].dependency_info.rt_info; + + RtecScheduler::OS_Priority os_priority; + RtecScheduler::Preemption_Subpriority_t p_subpriority; + RtecScheduler::Preemption_Priority_t p_priority; + this->scheduler_->priority (qos_info.rt_info, + os_priority, + p_subpriority, + p_priority + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + qos_info.preemption_priority = p_priority; + } + + filter->push_scheduled_event (single_event, qos_info + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } +} diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h new file mode 100644 index 00000000000..12ce012c36c --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h @@ -0,0 +1,74 @@ +/* -*- C++ -*- */ +/** + * @file EC_Kokyu_Scheduling.h + * + * $Id$ + * + * @author Bryan Thrall (thrall@cs.wustl.edu) + * + * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and + * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group. + * More details can be found in: + * + * http://doc.ece.uci.edu/~coryan/EC/index.html + */ + +#ifndef TAO_EC_KOKYU_SCHEDULING_H +#define TAO_EC_KOKYU_SCHEDULING_H +#include "ace/pre.h" + +#include "EC_Scheduling_Strategy.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "orbsvcs/RtecSchedulerC.h" +#include "rtkokyu_event_export.h" + +/** + * @class TAO_EC_Kokyu_Scheduling + * + * @brief A scheduling strategy that uses TAO's real-time scheduler + * + * This implementation of the Scheduling_Strategy uses TAO's + * real-time scheduler. + */ +class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Scheduling : public TAO_EC_Scheduling_Strategy +{ +public: + /// Constructor. + TAO_EC_Kokyu_Scheduling (RtecScheduler::Scheduler_ptr scheduler); + + /// Destructor + virtual ~TAO_EC_Kokyu_Scheduling (void); + + virtual void add_proxy_supplier_dependencies ( + TAO_EC_ProxyPushSupplier *supplier, + TAO_EC_ProxyPushConsumer *consumer + ACE_ENV_ARG_DECL); + virtual void schedule_event (const RtecEventComm::EventSet &event, + TAO_EC_ProxyPushConsumer *consumer, + TAO_EC_Supplier_Filter *filter + ACE_ENV_ARG_DECL); + +private: + ACE_UNIMPLEMENTED_FUNC (TAO_EC_Kokyu_Scheduling + (const TAO_EC_Kokyu_Scheduling&)) + ACE_UNIMPLEMENTED_FUNC (TAO_EC_Kokyu_Scheduling& operator= + (const TAO_EC_Kokyu_Scheduling&)) + + /// Initialize our RT_Info handle and dependencies + void init_rt_info (ACE_ENV_SINGLE_ARG_DECL); + +private: + /// The scheduler we are going to use + RtecScheduler::Scheduler_var scheduler_; +}; + +#if defined (__ACE_INLINE__) +#include "EC_Kokyu_Scheduling.i" +#endif /* __ACE_INLINE__ */ + +#include "ace/post.h" +#endif /* TAO_EC_KOKYU_SCHEDULING_H */ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i new file mode 100644 index 00000000000..b9dbd7d9dfc --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i @@ -0,0 +1,8 @@ +// $Id$ + +ACE_INLINE +TAO_EC_Kokyu_Scheduling::TAO_EC_Kokyu_Scheduling ( + RtecScheduler::Scheduler_ptr scheduler) + : scheduler_ (RtecScheduler::Scheduler::_duplicate (scheduler)) +{ +} diff --git a/TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsp b/TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsp new file mode 100644 index 00000000000..70c6108985f --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsp @@ -0,0 +1,231 @@ +# Microsoft Developer Studio Project File - Name="RTKokyuEventEvent" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=RTKokyuEvent - Win32 MFC Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "RTKokyuEvent.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "RTKokyuEvent.mak" CFG="RTKokyuEvent - Win32 MFC Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "RTKokyuEvent - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "RTKokyuEvent - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "RTKokyuEvent - Win32 MFC Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "RTKokyuEvent - Win32 MFC Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "RTKokyuEvent - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Release\RTKokyuEvent"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RTKokyuEvent_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../" /I "../../" /I "../../../" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_RTKokyuEvent_BUILD_DLL" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 TAO_Svc_Utils.lib TAO_RTSched.lib TAO_RTEvent.lib ace.lib TAO.lib TAO_PortableServer.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\TAO_RTKokyuEvent.dll" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+
+!ELSEIF "$(CFG)" == "RTKokyuEvent - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Debug\RTKokyuEvent"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RTKokyuEvent_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../" /I "../../" /I "../../../" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_RTKokyuEvent_BUILD_DLL" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 TAO_Svc_Utilsd.lib TAO_RTSchedd.lib TAO_RTEventd.lib TAOd.lib aced.lib TAO_PortableServerd.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\TAO_RTKokyuEventd.dll" /pdbtype:sept /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+
+!ELSEIF "$(CFG)" == "RTKokyuEvent - Win32 MFC Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "RTKokyuEvent___Win32_MFC_Debug"
+# PROP BASE Intermediate_Dir "RTKokyuEvent___Win32_MFC_Debug"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Debug\RTKokyuEventMFC"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../" /I "../../" /I "../../../" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_RTKokyuEvent_BUILD_DLL" /FD /c
+# SUBTRACT BASE CPP /YX
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../" /I "../../" /I "../../../" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_RTKokyuEvent_BUILD_DLL" /D ACE_HAS_MFC=1 /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 TAOd.lib aced.lib TAO_Svc_Utilsd.lib TAO_RTSchedd.lib TAO_RTEventd.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\TAO_RTKokyuEventd.dll" /pdbtype:sept /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+# ADD LINK32 TAOmfcd.lib acemfcd.lib TAO_Svc_Utilsmfcd.lib TAO_RTSchedmfcd.lib TAO_RTEventmfcd.lib TAO_PortableServermfcd.lib /nologo /dll /debug /machine:I386 /out:"..\..\..\bin\TAO_RTKokyuEventmfcd.dll" /pdbtype:sept /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+
+!ELSEIF "$(CFG)" == "RTKokyuEvent - Win32 MFC Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "RTKokyuEvent___Win32_MFC_Release"
+# PROP BASE Intermediate_Dir "RTKokyuEvent___Win32_MFC_Release"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "DLL\Release\RTKokyuEventMFC"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "../" /I "../../" /I "../../../" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_RTKokyuEvent_BUILD_DLL" /FD /c
+# SUBTRACT BASE CPP /YX
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "../" /I "../../" /I "../../../" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "TAO_RTKokyuEvent_BUILD_DLL" /D ACE_HAS_MFC=1 /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 ace.lib TAO.lib TAO_Svc_Utils.lib TAO_RTSched.lib TAO_RTEvent.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\TAO_RTKokyuEvent.dll" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+# ADD LINK32 acemfc.lib TAOmfc.lib TAO_Svc_Utilsmfc.lib TAO_RTSchedmfc.lib TAO_RTEventmfc.lib TAO_PortableServermfc.lib /nologo /dll /machine:I386 /out:"..\..\..\bin\TAO_RTKokyuEventmfc.dll" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao" /libpath:"..\..\..\ace"
+
+!ENDIF
+
+# Begin Target
+
+# Name "RTKokyuEvent - Win32 Release"
+# Name "RTKokyuEvent - Win32 Debug"
+# Name "RTKokyuEvent - Win32 MFC Debug"
+# Name "RTKokyuEvent - Win32 MFC Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Dispatching.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Factory.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Filter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Filter_Builder.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Scheduling.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Dispatching.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Factory.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Filter.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Filter_Builder.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Scheduling.h
+# End Source File
+# End Group
+# Begin Group "Inline Files"
+
+# PROP Default_Filter ".i"
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Dispatching.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Factory.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Filter.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Filter_Builder.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\Event\EC_Kokyu_Scheduling.i
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "rc"
+# End Group
+# End Target
+# End Project
diff --git a/TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsw b/TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsw new file mode 100644 index 00000000000..8c05e95b0ea --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsw @@ -0,0 +1,290 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "ACE DLL"=..\..\..\ace\ace_dll.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "CosNaming"=.\CosNaming.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name IORTable
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name PortableServer
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Svc Utils
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "IORTable"=..\..\tao\IORTable\TAO_IORTable.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name TAO DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "Kokyu_DLL"=..\..\..\Kokyu\Kokyu_DLL.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "Messaging"=..\..\tao\Messaging\TAO_Messaging.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name TAO DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "PortableServer"=..\..\tao\PortableServer\TAO_PortableServer.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name TAO DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "RTEvent"=.\RTEvent.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name RTSched
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO DLL
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO_IDL Compiler
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name CosNaming
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Messaging
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Svc Utils
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "RTKokyuEvent"=.\RTKokyuEvent.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name RTEvent
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name RTSched
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO DLL
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO_IDL Compiler
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Kokyu_DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "RTSched"=.\RTSched.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name CosNaming
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name Svc Utils
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO DLL
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO_IDL Compiler
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "Svc Utils"=.\Svc_Utils.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name PortableServer
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO DLL
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO_IDL Compiler
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "TAO DLL"=..\..\tao\TAO.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name ACE DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "TAO_IDL Compiler"=..\..\TAO_IDL\tao_idl.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name TAO_IDL_BE_DLL
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name TAO_IDL_FE_DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "TAO_IDL_BE_DLL"=..\..\TAO_IDL\TAO_IDL_BE_DLL.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name TAO_IDL_FE_DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "TAO_IDL_FE_DLL"=..\..\TAO_IDL\TAO_IDL_FE_DLL.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name ACE DLL
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name gperf
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "gperf"=..\..\..\apps\gperf\src\gperf.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name ACE DLL
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
|