summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthrall <thrall@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-11 20:44:50 +0000
committerthrall <thrall@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-11 20:44:50 +0000
commite6757188ab2ee7b42c8af0d2224186b018761ecb (patch)
treee80e4d549152471b1e5455bca3223595b1171dac
parent1bbdc27d6730396a2466fad5f81ae0bc6f1b8619 (diff)
downloadATCD-e6757188ab2ee7b42c8af0d2224186b018761ecb.tar.gz
Initial commit; some testing left to do
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h130
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.i35
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.cpp236
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.h72
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Factory.i7
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.cpp285
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.h130
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter.i1
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.cpp362
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.h85
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Filter_Builder.i8
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.cpp96
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.h74
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Scheduling.i8
-rw-r--r--TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsp231
-rw-r--r--TAO/orbsvcs/orbsvcs/RTKokyuEvent.dsw290
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>
+{{{
+}}}
+
+###############################################################################
+