summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Cleeland <chris.cleeland@gmail.com>2005-08-25 16:08:55 +0000
committerChris Cleeland <chris.cleeland@gmail.com>2005-08-25 16:08:55 +0000
commit532573fb2ac84cfcfc5330f32bfe9b4bacd876cd (patch)
tree8950566ebeafea59d4e7c49b898eb9f147eb373d
parent770f2877f8eda2bb427548a1b4509fcd9736f797 (diff)
downloadATCD-532573fb2ac84cfcfc5330f32bfe9b4bacd876cd.tar.gz
Thu Aug 25 11:00:47 2005 Chris Cleeland <cleeland_c@ociweb.com>
Added RTEC TPC and Queue-Full action.
-rw-r--r--TAO/ChangeLog926
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp567
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h5
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i1
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h4
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp86
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h53
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i15
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp9
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h6
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp206
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h83
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.i1
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp20
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h29
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp125
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h67
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.i2
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp43
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h45
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp66
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h60
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i12
-rw-r--r--TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc6
24 files changed, 2016 insertions, 421 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog
index ae652d98dfa..da5f5c3a076 100644
--- a/TAO/ChangeLog
+++ b/TAO/ChangeLog
@@ -1,3 +1,109 @@
+Thu Aug 25 11:00:47 2005 Chris Cleeland <cleeland_c@ociweb.com>
+
+ This does two things in the Real Time Event Service:
+
+ 1. Added a new dispatching strategy--Thread Per Consumer. This
+ strategy is similar to the MT dispatching strategy in that it
+ separates the thread that receives the push() from a supplier
+ from the thread that does the eventual push() to the
+ consumer(s), but it differs from MT in that MT has a pool of
+ threads pulling from a single queue and ultimately potentially
+ servicing every consumer, whereas TPC has a queue for *each*
+ consumer and, thus, a single thread dedicated to pushing to that
+ consumer. This insures that a badly-behaved consumer CANNOT
+ have an adverse effect on the channel or supplier.
+
+ 2. It adds a means by which an application can specify what the
+ RTEC should do if the TAO_EC_Queue fills up. This behavior is
+ encapsulated in a derivation of an ACE_Service_Object, called
+ TAO_EC_Queue_Full_Service_Object. The RTEC looks for a service
+ object of a particular name (default in macro
+ TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME)
+
+ * orbsvcs/orbsvcs/RTEvent_Serv.mpc:
+
+ Updated to build new files that are part of the TPC strategy.
+
+ * orbsvcs/orbsvcs/Event/EC_Default_Factory.h:
+
+ Added new data member to hold the name of the service object
+ used for queue full behavior.
+
+ * orbsvcs/orbsvcs/Event/EC_Default_Factory.i:
+ * orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp:
+
+ Added new option, -ECQueueFullServiceObject, that can be used to
+ specify the name/tag in the svc.conf file through which the RTEC
+ should look for a queue full service object.
+
+ * orbsvcs/orbsvcs/Event/EC_Defaults.h:
+
+ Added default service object name/tag,
+ TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME.
+
+ * orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h:
+ * orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i:
+ * orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp:
+
+ Added the TAO_EC_Simple_Queue_Full_Action service object
+ implementation into here, since only the TAO_EC_Dispatching_Task
+ needs to know about it. This default implementation has only
+ two choices of behavior: "wait" for not-full condition (the default) or
+ "discard" silently. Specification of the desired behavior is by
+ putting the word "wait" or "discard" as the first argument in this
+ object's svc.conf arg vector.
+
+ * orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i:
+
+ Created new macros, TAO_EC_QUEUE_LWM and TAO_EC_QUEUE_HWM, that
+ can be used to specify the low-water and high-water marks for
+ the TAO_EC_Queue. Previously, these were hard-coded values.
+
+ * orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h:
+ * orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp:
+
+ Modifications to CTORs to allow passing of a service object
+ pointer from the factory down through the dispatching strategy
+ down to the dispatching task itself.
+
+ * orbsvcs/orbsvcs/Event/EC_TPC_Factory.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp:
+
+ Minor modifications to pass the service object to the
+ dispatching strategy.
+
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.i:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Factory.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Factory.i:
+ * orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp:
+ * orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp:
+ * orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h:
+ * orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i:
+ * orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp:
+
+ Rather than cluttering the EC_Default_Factory with yet another
+ dispatch strategy, this derives from the EC_Default_Factory and
+ replaces certain behaviors with its own. Thus, in order to use
+ this new strategy you will have to replace the call in your code
+ for TAO_EC_Default_Factory::init_svcs() with
+ TAO_EC_TPC_Factory::init_svcs().
+
+ * orbsvcs/orbsvcs/Event/EC_ProxySupplier.h: Moved event_channel_,
+ consumer_, and refcount_ into "protected" section so subclasses
+ can have access.
+
+ * orbsvcs/orbsvcs/Event/EC_ProxyConsumer.h: Moved event_channel_
+ into "protected" section so subclasses can have access.
+
Thu Aug 25 07:11:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl>
* TAO_IDL/be/be_visitor_operation/ami_exception_holder_operation_cs.cpp:
@@ -87,68 +193,68 @@ Wed Aug 24 09:13:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl>
Tue Aug 23 18:09:07 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/tests/Bug_1395_Regression/Makefile.am:
- * orbsvcs/tests/Bug_1630_Regression/Makefile.am:
- * orbsvcs/tests/Event/Mcast/Common/Makefile.am:
+ * orbsvcs/tests/Bug_1395_Regression/Makefile.am:
+ * orbsvcs/tests/Bug_1630_Regression/Makefile.am:
+ * orbsvcs/tests/Event/Mcast/Common/Makefile.am:
- Regenerated.
+ Regenerated.
- * orbsvcs/tests/Event/Mcast/Common/ECMcastTests_lib.mpc:
+ * orbsvcs/tests/Event/Mcast/Common/ECMcastTests_lib.mpc:
- Removed nonexistant ectest_export.h file from Header_Files
- section.
+ Removed nonexistant ectest_export.h file from Header_Files
+ section.
Tue Aug 23 15:54:52 2005 Ossama Othman <ossama@dre.vanderbilt.edu>
- * TAO_IDL/be/be_codegen.cpp (gen_stub_hdr_includes):
+ * TAO_IDL/be/be_codegen.cpp (gen_stub_hdr_includes):
- Another round of generated include directive reording to address
- template related order of parsing issues in g++ 3.4.x or better.
+ Another round of generated include directive reording to address
+ template related order of parsing issues in g++ 3.4.x or better.
- * tao/Any_Insert_Policy_T.h (any_insert):
+ * tao/Any_Insert_Policy_T.h (any_insert):
- Made these methods non-virtual. All binding is done at
- compile-time so there is no need make them virtual. Also
- addresses "class with virtual funtions but no virtual
- destructor" g++ 4.0 warnings.
+ Made these methods non-virtual. All binding is done at
+ compile-time so there is no need make them virtual. Also
+ addresses "class with virtual funtions but no virtual
+ destructor" g++ 4.0 warnings.
- * tao/IFR_Client/IFR_ComponentsC.h:
- * orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.h:
+ * tao/IFR_Client/IFR_ComponentsC.h:
+ * orbsvcs/orbsvcs/IFRService/IFR_Service_Utils.h:
- More g++ 3.4.x or better order of parsing related template
- error fixes.
+ More g++ 3.4.x or better order of parsing related template
+ error fixes.
Tue Aug 23 10:43:07 2005 Ossama Othman <ossama@dre.vanderbilt.edu>
- * tao/IORInterceptor/IORInterceptor_Adapter_Factory_Impl.cpp:
- * tao/IORInterceptor/IORInterceptor_Adapter_Factory_Impl.h:
- * tao/IORInterceptor/IORInterceptor_Adapter_Impl.h:
- * tao/IORManipulation/IORA.cpp:
- * tao/ImR_Client/ImplRepoA.cpp:
- * tao/ImR_Client/ImplRepoS.cpp:
- * tao/ImR_Client/ServerObjectA.cpp:
- * tao/ImR_Client/ServerObjectS.cpp:
- * tao/ObjRefTemplate/Default_ORTA.cpp:
- * tao/ObjRefTemplate/ObjectReferenceTemplateA.cpp:
- * tao/RTCORBA/RTCORBAA.cpp:
- * tao/RTCORBA/RT_ORBInitializer.h:
- * tao/RTCORBA/rtcorba_export.h:
- * tao/RTCORBA/rtcorba_typedefs.h:
- * tao/RTPortableServer/RTPortableServerA.cpp:
- * tao/RTScheduling/RTSchedulerC.h:
- * tao/Strategies/sciop_endpointsC.cpp:
- * tao/Strategies/uiop_endpointsC.cpp:
- * tao/TypeCodeFactory/TypeCodeFactoryA.cpp:
- * tao/TypeCodeFactory/TypeCodeFactoryC.h:
- * tao/TypeCodeFactory/TypeCodeFactory_Adapter_Impl.cpp:
- * tao/TypeCodeFactory/TypeCodeFactory_i.cpp:
- * tao/Utils/RIR_Narrow.h:
-
- Reordered include directives to make sure all necessary
- non-dependent names are parsed before the templates that use
- them. In the case of the "*A.h" files, this is a temporary
- work-around until TAO_IDL is updated. Addresses g++ 3.4.x or
- better compile-time errors.
+ * tao/IORInterceptor/IORInterceptor_Adapter_Factory_Impl.cpp:
+ * tao/IORInterceptor/IORInterceptor_Adapter_Factory_Impl.h:
+ * tao/IORInterceptor/IORInterceptor_Adapter_Impl.h:
+ * tao/IORManipulation/IORA.cpp:
+ * tao/ImR_Client/ImplRepoA.cpp:
+ * tao/ImR_Client/ImplRepoS.cpp:
+ * tao/ImR_Client/ServerObjectA.cpp:
+ * tao/ImR_Client/ServerObjectS.cpp:
+ * tao/ObjRefTemplate/Default_ORTA.cpp:
+ * tao/ObjRefTemplate/ObjectReferenceTemplateA.cpp:
+ * tao/RTCORBA/RTCORBAA.cpp:
+ * tao/RTCORBA/RT_ORBInitializer.h:
+ * tao/RTCORBA/rtcorba_export.h:
+ * tao/RTCORBA/rtcorba_typedefs.h:
+ * tao/RTPortableServer/RTPortableServerA.cpp:
+ * tao/RTScheduling/RTSchedulerC.h:
+ * tao/Strategies/sciop_endpointsC.cpp:
+ * tao/Strategies/uiop_endpointsC.cpp:
+ * tao/TypeCodeFactory/TypeCodeFactoryA.cpp:
+ * tao/TypeCodeFactory/TypeCodeFactoryC.h:
+ * tao/TypeCodeFactory/TypeCodeFactory_Adapter_Impl.cpp:
+ * tao/TypeCodeFactory/TypeCodeFactory_i.cpp:
+ * tao/Utils/RIR_Narrow.h:
+
+ Reordered include directives to make sure all necessary
+ non-dependent names are parsed before the templates that use
+ them. In the case of the "*A.h" files, this is a temporary
+ work-around until TAO_IDL is updated. Addresses g++ 3.4.x or
+ better compile-time errors.
Tue Aug 23 14:03:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl>
@@ -210,253 +316,253 @@ Tue Aug 23 07:29:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl>
Mon Aug 22 23:03:02 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/Logging_Service/Event_Logging_Service/Event_Logging_Service.cpp:
- * orbsvcs/Logging_Service/Event_Logging_Service/Event_Logging_Service.h:
+ * orbsvcs/Logging_Service/Event_Logging_Service/Event_Logging_Service.cpp:
+ * orbsvcs/Logging_Service/Event_Logging_Service/Event_Logging_Service.h:
- Changed the event_log_factory_ member variable from a
- TAO_EventLogFactory_i to a pointer to a TAO_EventLogFactory_i.
- This delays execution of the constructor, which avoids the ORB
- being constructed implicitly, which in turn allows any -ORB...
- command line arguments to be parsed and removed from the argc/
- argv vector in Event_Logging_Service::init_ORB().
+ Changed the event_log_factory_ member variable from a
+ TAO_EventLogFactory_i to a pointer to a TAO_EventLogFactory_i.
+ This delays execution of the constructor, which avoids the ORB
+ being constructed implicitly, which in turn allows any -ORB...
+ command line arguments to be parsed and removed from the argc/
+ argv vector in Event_Logging_Service::init_ORB().
Mon Aug 22 21:33:37 2005 Ossama Othman <ossama@dre.vanderbilt.edu>
- * TAO_IDL/be/be_codegen.cpp:
-
- Another round of generated include directive reording to address
- template related order of parsing issues in g++ 3.4.x or better.
-
- * tao/Typecode_typesC.h:
- * tao/ParameterModeC.h
-
- Removed unnecessary include directives. They were causing
- headers to be included that prematurely caused some templates to
- be parsed before all non-dependent names were parsed. Addresses
- g++ 3.4.x or better compile-time errors.
-
- * tao/AnyTypeCode/BooleanSeqA.h:
- * tao/AnyTypeCode/BoundsA.h:
- * tao/AnyTypeCode/CONV_FRAMEA.h:
- * tao/AnyTypeCode/CharSeqA.h:
- * tao/AnyTypeCode/CurrentA.h:
- * tao/AnyTypeCode/DomainA.h:
- * tao/AnyTypeCode/DoubleSeqA.h:
- * tao/AnyTypeCode/DynamicC.h:
- * tao/AnyTypeCode/Dynamic_ParameterC.h:
- * tao/AnyTypeCode/FloatSeqA.h:
- * tao/AnyTypeCode/GIOPA.h:
- * tao/AnyTypeCode/IIOPA.h:
- * tao/AnyTypeCode/IIOP_EndpointsA.h:
- * tao/AnyTypeCode/IOPA.h:
- * tao/AnyTypeCode/IOP_IORA.h:
- * tao/AnyTypeCode/LongDoubleSeqA.h:
- * tao/AnyTypeCode/LongLongSeqA.h:
- * tao/AnyTypeCode/LongSeqA.h:
- * tao/AnyTypeCode/Messaging_PolicyValueA.h:
- * tao/AnyTypeCode/NVList.h:
- * tao/AnyTypeCode/ObjectIdListA.h:
- * tao/AnyTypeCode/OctetSeqA.h:
- * tao/AnyTypeCode/PI_ForwardA.h:
- * tao/AnyTypeCode/ParameterModeA.h:
- * tao/AnyTypeCode/PolicyA.h:
- * tao/AnyTypeCode/Policy_ForwardA.h:
- * tao/AnyTypeCode/PortableInterceptorA.h:
- * tao/AnyTypeCode/ServicesA.h:
- * tao/AnyTypeCode/ShortSeqA.h:
- * tao/AnyTypeCode/StringSeqA.h:
- * tao/AnyTypeCode/SystemExceptionA.h:
- * tao/AnyTypeCode/TAOA.h:
- * tao/AnyTypeCode/TimeBaseA.h:
- * tao/AnyTypeCode/TypeCode_CDR_Extraction.cpp:
- * tao/AnyTypeCode/ULongLongSeqA.h:
- * tao/AnyTypeCode/ULongSeqA.h:
- * tao/AnyTypeCode/UShortSeqA.h:
- * tao/AnyTypeCode/ValueModifierA.h:
- * tao/AnyTypeCode/VisibilityA.h:
- * tao/AnyTypeCode/WCharSeqA.h:
- * tao/AnyTypeCode/WStringSeqA.h:
- * tao/AnyTypeCode/WrongTransactionA.h:
- * tao/AnyTypeCode/orb_typesA.h
- * tao/BiDir_GIOP/BiDirGIOP.cpp:
- * tao/CodecFactory/CDR_Encaps_Codec.cpp:
- * tao/CodecFactory/CDR_Encaps_Codec.h:
- * tao/CodecFactory/CodecFactory.h:
- * tao/CodecFactory/CodecFactory_impl.cpp:
- * tao/CodecFactory/CodecFactory_impl.h:
- * tao/CodecFactory/IOP_CodecC.h:
- * tao/CodecFactory/IOP_Codec_includeC.h:
- * tao/Domain/DomainS.h:
- * tao/DynamicAny/DynamicAny.h:
- * tao/DynamicAny/DynamicAnyC.h:
- * tao/DynamicInterface/Context.h:
- * tao/DynamicInterface/DII_Arguments.cpp:
- * tao/DynamicInterface/DII_Invocation.cpp:
- * tao/DynamicInterface/ExceptionList.h:
- * tao/IFR_Client/IFR_BaseC.h:
- * tao/IFR_Client/IFR_BasicC.h:
- * tao/IFR_Client/IFR_Client_Adapter_Impl.cpp:
- * tao/IFR_Client/IFR_ComponentsC.cpp:
- * tao/IFR_Client/IFR_ExtendedC.cpp:
- * tao/IFR_Client/IFR_ExtendedC.h:
- * tao/Messaging/MessagingA.cpp:
- * tao/Messaging/MessagingS.cpp:
- * tao/Messaging/Messaging_No_ImplA.cpp:
- * tao/Messaging/Messaging_RT_PolicyA.cpp:
- * tao/Messaging/Messaging_SyncScope_PolicyA.cpp:
- * tao/Messaging/PollableC.cpp:
- * tao/Messaging/TAO_ExtA.cpp:
- * tao/PI/ClientRequestInfo.h:
- * tao/PI/ClientRequestInfoC.h:
- * tao/PI/ClientRequestInterceptorA.cpp:
- * tao/PI/ClientRequestInterceptor_Adapter_Impl.h:
- * tao/PI/InterceptorA.cpp:
- * tao/PI/Interceptor_List_T.cpp:
- * tao/PI/InvalidSlotA.cpp:
- * tao/PI/ORBInitInfoC.h:
- * tao/PI/ORBInitializerA.cpp:
- * tao/PI/ORBInitializer_Registry_Impl.h:
- * tao/PI/PI.h:
- * tao/PI/PICurrent.h:
- * tao/PI/PICurrentA.cpp:
- * tao/PI/PICurrent_Impl.h:
- * tao/PI/PIForwardRequestA.cpp:
- * tao/PI/PolicyFactoryC.h:
- * tao/PI/RequestInfoC.h:
- * tao/PI_Server/ServerInterceptorAdapter.h:
- * tao/PI_Server/ServerRequestInfoC.h:
- * tao/PI_Server/ServerRequestInterceptorC.h:
- * tao/PortableServer/AdapterActivatorA.cpp:
- * tao/PortableServer/ForwardRequestA.cpp:
- * tao/PortableServer/IdAssignmentPolicyA.cpp:
- * tao/PortableServer/IdUniquenessPolicyA.cpp:
- * tao/PortableServer/ImplicitActivationPolicyA.cpp:
- * tao/PortableServer/LifespanPolicyA.cpp:
- * tao/PortableServer/POAManagerC.cpp:
- * tao/PortableServer/PS_CurrentA.cpp:
- * tao/PortableServer/PS_ForwardA.cpp:
- * tao/PortableServer/PolicyS.cpp:
- * tao/PortableServer/PortableServerA.cpp:
- * tao/PortableServer/RequestProcessingPolicyA.cpp:
- * tao/PortableServer/ServantActivatorA.cpp:
- * tao/PortableServer/ServantLocatorA.cpp:
- * tao/PortableServer/ServantManagerA.cpp:
- * tao/PortableServer/ServantRetentionPolicyA.cpp:
- * tao/PortableServer/ThreadPolicyA.cpp:
- * tao/Valuetype/StringValueC.cpp:
- * tao/Valuetype/ValueBase.cpp:
-
- Reordered include directives to make sure all necessary
- non-dependent names are parsed before the templates that use
- them. In the case of the "*A.h" files, this is a temporary
- work-around until TAO_IDL is updated. Addresses g++ 3.4.x or
- better compile-time errors.
+ * TAO_IDL/be/be_codegen.cpp:
+
+ Another round of generated include directive reording to address
+ template related order of parsing issues in g++ 3.4.x or better.
+
+ * tao/Typecode_typesC.h:
+ * tao/ParameterModeC.h
+
+ Removed unnecessary include directives. They were causing
+ headers to be included that prematurely caused some templates to
+ be parsed before all non-dependent names were parsed. Addresses
+ g++ 3.4.x or better compile-time errors.
+
+ * tao/AnyTypeCode/BooleanSeqA.h:
+ * tao/AnyTypeCode/BoundsA.h:
+ * tao/AnyTypeCode/CONV_FRAMEA.h:
+ * tao/AnyTypeCode/CharSeqA.h:
+ * tao/AnyTypeCode/CurrentA.h:
+ * tao/AnyTypeCode/DomainA.h:
+ * tao/AnyTypeCode/DoubleSeqA.h:
+ * tao/AnyTypeCode/DynamicC.h:
+ * tao/AnyTypeCode/Dynamic_ParameterC.h:
+ * tao/AnyTypeCode/FloatSeqA.h:
+ * tao/AnyTypeCode/GIOPA.h:
+ * tao/AnyTypeCode/IIOPA.h:
+ * tao/AnyTypeCode/IIOP_EndpointsA.h:
+ * tao/AnyTypeCode/IOPA.h:
+ * tao/AnyTypeCode/IOP_IORA.h:
+ * tao/AnyTypeCode/LongDoubleSeqA.h:
+ * tao/AnyTypeCode/LongLongSeqA.h:
+ * tao/AnyTypeCode/LongSeqA.h:
+ * tao/AnyTypeCode/Messaging_PolicyValueA.h:
+ * tao/AnyTypeCode/NVList.h:
+ * tao/AnyTypeCode/ObjectIdListA.h:
+ * tao/AnyTypeCode/OctetSeqA.h:
+ * tao/AnyTypeCode/PI_ForwardA.h:
+ * tao/AnyTypeCode/ParameterModeA.h:
+ * tao/AnyTypeCode/PolicyA.h:
+ * tao/AnyTypeCode/Policy_ForwardA.h:
+ * tao/AnyTypeCode/PortableInterceptorA.h:
+ * tao/AnyTypeCode/ServicesA.h:
+ * tao/AnyTypeCode/ShortSeqA.h:
+ * tao/AnyTypeCode/StringSeqA.h:
+ * tao/AnyTypeCode/SystemExceptionA.h:
+ * tao/AnyTypeCode/TAOA.h:
+ * tao/AnyTypeCode/TimeBaseA.h:
+ * tao/AnyTypeCode/TypeCode_CDR_Extraction.cpp:
+ * tao/AnyTypeCode/ULongLongSeqA.h:
+ * tao/AnyTypeCode/ULongSeqA.h:
+ * tao/AnyTypeCode/UShortSeqA.h:
+ * tao/AnyTypeCode/ValueModifierA.h:
+ * tao/AnyTypeCode/VisibilityA.h:
+ * tao/AnyTypeCode/WCharSeqA.h:
+ * tao/AnyTypeCode/WStringSeqA.h:
+ * tao/AnyTypeCode/WrongTransactionA.h:
+ * tao/AnyTypeCode/orb_typesA.h
+ * tao/BiDir_GIOP/BiDirGIOP.cpp:
+ * tao/CodecFactory/CDR_Encaps_Codec.cpp:
+ * tao/CodecFactory/CDR_Encaps_Codec.h:
+ * tao/CodecFactory/CodecFactory.h:
+ * tao/CodecFactory/CodecFactory_impl.cpp:
+ * tao/CodecFactory/CodecFactory_impl.h:
+ * tao/CodecFactory/IOP_CodecC.h:
+ * tao/CodecFactory/IOP_Codec_includeC.h:
+ * tao/Domain/DomainS.h:
+ * tao/DynamicAny/DynamicAny.h:
+ * tao/DynamicAny/DynamicAnyC.h:
+ * tao/DynamicInterface/Context.h:
+ * tao/DynamicInterface/DII_Arguments.cpp:
+ * tao/DynamicInterface/DII_Invocation.cpp:
+ * tao/DynamicInterface/ExceptionList.h:
+ * tao/IFR_Client/IFR_BaseC.h:
+ * tao/IFR_Client/IFR_BasicC.h:
+ * tao/IFR_Client/IFR_Client_Adapter_Impl.cpp:
+ * tao/IFR_Client/IFR_ComponentsC.cpp:
+ * tao/IFR_Client/IFR_ExtendedC.cpp:
+ * tao/IFR_Client/IFR_ExtendedC.h:
+ * tao/Messaging/MessagingA.cpp:
+ * tao/Messaging/MessagingS.cpp:
+ * tao/Messaging/Messaging_No_ImplA.cpp:
+ * tao/Messaging/Messaging_RT_PolicyA.cpp:
+ * tao/Messaging/Messaging_SyncScope_PolicyA.cpp:
+ * tao/Messaging/PollableC.cpp:
+ * tao/Messaging/TAO_ExtA.cpp:
+ * tao/PI/ClientRequestInfo.h:
+ * tao/PI/ClientRequestInfoC.h:
+ * tao/PI/ClientRequestInterceptorA.cpp:
+ * tao/PI/ClientRequestInterceptor_Adapter_Impl.h:
+ * tao/PI/InterceptorA.cpp:
+ * tao/PI/Interceptor_List_T.cpp:
+ * tao/PI/InvalidSlotA.cpp:
+ * tao/PI/ORBInitInfoC.h:
+ * tao/PI/ORBInitializerA.cpp:
+ * tao/PI/ORBInitializer_Registry_Impl.h:
+ * tao/PI/PI.h:
+ * tao/PI/PICurrent.h:
+ * tao/PI/PICurrentA.cpp:
+ * tao/PI/PICurrent_Impl.h:
+ * tao/PI/PIForwardRequestA.cpp:
+ * tao/PI/PolicyFactoryC.h:
+ * tao/PI/RequestInfoC.h:
+ * tao/PI_Server/ServerInterceptorAdapter.h:
+ * tao/PI_Server/ServerRequestInfoC.h:
+ * tao/PI_Server/ServerRequestInterceptorC.h:
+ * tao/PortableServer/AdapterActivatorA.cpp:
+ * tao/PortableServer/ForwardRequestA.cpp:
+ * tao/PortableServer/IdAssignmentPolicyA.cpp:
+ * tao/PortableServer/IdUniquenessPolicyA.cpp:
+ * tao/PortableServer/ImplicitActivationPolicyA.cpp:
+ * tao/PortableServer/LifespanPolicyA.cpp:
+ * tao/PortableServer/POAManagerC.cpp:
+ * tao/PortableServer/PS_CurrentA.cpp:
+ * tao/PortableServer/PS_ForwardA.cpp:
+ * tao/PortableServer/PolicyS.cpp:
+ * tao/PortableServer/PortableServerA.cpp:
+ * tao/PortableServer/RequestProcessingPolicyA.cpp:
+ * tao/PortableServer/ServantActivatorA.cpp:
+ * tao/PortableServer/ServantLocatorA.cpp:
+ * tao/PortableServer/ServantManagerA.cpp:
+ * tao/PortableServer/ServantRetentionPolicyA.cpp:
+ * tao/PortableServer/ThreadPolicyA.cpp:
+ * tao/Valuetype/StringValueC.cpp:
+ * tao/Valuetype/ValueBase.cpp:
+
+ Reordered include directives to make sure all necessary
+ non-dependent names are parsed before the templates that use
+ them. In the case of the "*A.h" files, this is a temporary
+ work-around until TAO_IDL is updated. Addresses g++ 3.4.x or
+ better compile-time errors.
Mon Aug 22 21:05:36 2005 Ossama Othman <ossama@dre.vanderbilt.edu>
- * TAO_IDL/be/be_codegen.cpp (gen_stub_hdr_includes):
+ * TAO_IDL/be/be_codegen.cpp (gen_stub_hdr_includes):
- Reordered generated include directives so that Any/TypeCode
- include directives are placed before ones from the ORB core to
- make sure some things are parsed before some templates
- (e.g. TAO_Pseudo_{Var,Out}_T). Addresses issues with compilers
- that require all necessary non-dependent names be parsed prior
- to parsing templates that may use them (e.g. GNU g++ 3.4.x or
- better).
+ Reordered generated include directives so that Any/TypeCode
+ include directives are placed before ones from the ORB core to
+ make sure some things are parsed before some templates
+ (e.g. TAO_Pseudo_{Var,Out}_T). Addresses issues with compilers
+ that require all necessary non-dependent names be parsed prior
+ to parsing templates that may use them (e.g. GNU g++ 3.4.x or
+ better).
- Removed duplicate "TypeCode.h" include directive generation.
+ Removed duplicate "TypeCode.h" include directive generation.
- * tao/AnyTypeCode/AnySeqC.h:
- * tao/AnyTypeCode/Any_Unknown_IDL_Type.cpp:
- * tao/AnyTypeCode/BooleanSeqA.h:
- * tao/AnyTypeCode/TypeCode.h:
- * tao/AnyTypeCode/append.cpp:
+ * tao/AnyTypeCode/AnySeqC.h:
+ * tao/AnyTypeCode/Any_Unknown_IDL_Type.cpp:
+ * tao/AnyTypeCode/BooleanSeqA.h:
+ * tao/AnyTypeCode/TypeCode.h:
+ * tao/AnyTypeCode/append.cpp:
- Reordered include directives to force non-dependent names used
- as template arguments to be parsed before the templates in
- question. Addresses issues with compilers that require all
- necessary non-dependent names be parsed prior to parsing
- templates that may use them (e.g. GNU g++ 3.4.x or better).
+ Reordered include directives to force non-dependent names used
+ as template arguments to be parsed before the templates in
+ question. Addresses issues with compilers that require all
+ necessary non-dependent names be parsed prior to parsing
+ templates that may use them (e.g. GNU g++ 3.4.x or better).
- * tao/AnyTypeCode/Any_Impl.h:
+ * tao/AnyTypeCode/Any_Impl.h:
- Removed unnecessary "Any.h" include directive.
+ Removed unnecessary "Any.h" include directive.
Mon Aug 22 15:46:29 2005 Ossama Othman <ossama@dre.vanderbilt.edu>
- * tao/ORB.h:
+ * tao/ORB.h:
- Reordered include directives to work around g++ 4.0.x internal
- compiler error.
+ Reordered include directives to work around g++ 4.0.x internal
+ compiler error.
Mon Aug 22 12:58:11 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/Concurrency_Service/Makefile.am:
- * orbsvcs/CosEvent_Service/Makefile.am:
- * orbsvcs/Dump_Schedule/Makefile.am:
- * orbsvcs/FTRT_Event_Service/Makefile.am:
- * orbsvcs/FTRT_Event_Service/Event_Service/Makefile.am:
- * orbsvcs/FTRT_Event_Service/Factory_Service/Makefile.am:
- * orbsvcs/FTRT_Event_Service/Gateway_Service/Makefile.am:
- * orbsvcs/FT_ReplicationManager/Makefile.am:
- * orbsvcs/Fault_Detector/Makefile.am:
- * orbsvcs/Fault_Notifier/Makefile.am:
- * orbsvcs/IFR_Service/Makefile.am:
- * orbsvcs/ImplRepo_Service/Makefile.am:
- * orbsvcs/LifeCycle_Service/Makefile.am:
- * orbsvcs/LoadBalancer/Makefile.am:
- * orbsvcs/Logging_Service/Basic_Logging_Service/Makefile.am:
- * orbsvcs/Logging_Service/Event_Logging_Service/Makefile.am:
- * orbsvcs/Logging_Service/Notify_Logging_Service/Makefile.am:
- * orbsvcs/Logging_Service/RTEvent_Logging_Service/Makefile.am:
- * orbsvcs/Naming_Service/Makefile.am:
- * orbsvcs/Notify_Service/Makefile.am:
- * orbsvcs/Scheduling_Service/Makefile.am:
- * orbsvcs/Time_Service/Makefile.am:
- * orbsvcs/Trading_Service/Makefile.am:
-
- Regenerated.
+ * orbsvcs/Concurrency_Service/Makefile.am:
+ * orbsvcs/CosEvent_Service/Makefile.am:
+ * orbsvcs/Dump_Schedule/Makefile.am:
+ * orbsvcs/FTRT_Event_Service/Makefile.am:
+ * orbsvcs/FTRT_Event_Service/Event_Service/Makefile.am:
+ * orbsvcs/FTRT_Event_Service/Factory_Service/Makefile.am:
+ * orbsvcs/FTRT_Event_Service/Gateway_Service/Makefile.am:
+ * orbsvcs/FT_ReplicationManager/Makefile.am:
+ * orbsvcs/Fault_Detector/Makefile.am:
+ * orbsvcs/Fault_Notifier/Makefile.am:
+ * orbsvcs/IFR_Service/Makefile.am:
+ * orbsvcs/ImplRepo_Service/Makefile.am:
+ * orbsvcs/LifeCycle_Service/Makefile.am:
+ * orbsvcs/LoadBalancer/Makefile.am:
+ * orbsvcs/Logging_Service/Basic_Logging_Service/Makefile.am:
+ * orbsvcs/Logging_Service/Event_Logging_Service/Makefile.am:
+ * orbsvcs/Logging_Service/Notify_Logging_Service/Makefile.am:
+ * orbsvcs/Logging_Service/RTEvent_Logging_Service/Makefile.am:
+ * orbsvcs/Naming_Service/Makefile.am:
+ * orbsvcs/Notify_Service/Makefile.am:
+ * orbsvcs/Scheduling_Service/Makefile.am:
+ * orbsvcs/Time_Service/Makefile.am:
+ * orbsvcs/Trading_Service/Makefile.am:
+
+ Regenerated.
Mon Aug 22 12:32:42 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/tests/AVStreams/Asynch_Three_Stage/Makefile.am:
- * orbsvcs/tests/AVStreams/Bidirectional_Flows/Makefile.am:
- * orbsvcs/tests/AVStreams/Component_Switching/Makefile.am:
- * orbsvcs/tests/AVStreams/Full_Profile/Makefile.am:
- * orbsvcs/tests/AVStreams/Latency/Makefile.am:
- * orbsvcs/tests/AVStreams/Modify_QoS/Makefile.am:
- * orbsvcs/tests/AVStreams/Multicast/Makefile.am:
- * orbsvcs/tests/AVStreams/Multicast_Full_Profile/Makefile.am:
- * orbsvcs/tests/AVStreams/Multiple_Flows/Makefile.am:
- * orbsvcs/tests/AVStreams/Pluggable/Makefile.am:
- * orbsvcs/tests/AVStreams/Pluggable_Flow_Protocol/Makefile.am:
- * orbsvcs/tests/AVStreams/Simple_Three_Stage/Makefile.am:
- * orbsvcs/tests/AVStreams/Simple_Two_Stage/Makefile.am:
- * orbsvcs/tests/AVStreams/Simple_Two_Stage_With_QoS/Makefile.am:
- * orbsvcs/tests/BiDir_CORBALOC/Makefile.am:
- * orbsvcs/tests/Bug_1334_Regression/Makefile.am:
- * orbsvcs/tests/Bug_1393_Regression/Makefile.am:
- * orbsvcs/tests/Bug_1395_Regression/Makefile.am:
- * orbsvcs/tests/Bug_1630_Regression/Makefile.am:
- * orbsvcs/tests/Concurrency/Makefile.am:
- * orbsvcs/tests/CosEvent/Basic/Makefile.am:
- * orbsvcs/tests/CosEvent/lib/Makefile.am:
- * orbsvcs/tests/EC_Custom_Marshal/Makefile.am:
- * orbsvcs/tests/EC_MT_Mcast/Makefile.am:
- * orbsvcs/tests/EC_Mcast/Makefile.am:
- * orbsvcs/tests/EC_Multiple/Makefile.am:
- * orbsvcs/tests/EC_Throughput/Makefile.am:
- * orbsvcs/tests/Event/Basic/Makefile.am:
- * orbsvcs/tests/Event/Mcast/Common/Makefile.am:
- * orbsvcs/tests/Event/Mcast/Complex/Makefile.am:
- * orbsvcs/tests/Event/Mcast/Simple/Makefile.am:
- * orbsvcs/tests/Event/Mcast/Two_Way/Makefile.am:
- * orbsvcs/tests/Event/Performance/Makefile.am:
- * orbsvcs/tests/Event/lib/Makefile.am:
-
- Regenerated.
-
- * orbsvcs/tests/EC_Custom_Marshal/EC_Custom_Marshal.mpc:
+ * orbsvcs/tests/AVStreams/Asynch_Three_Stage/Makefile.am:
+ * orbsvcs/tests/AVStreams/Bidirectional_Flows/Makefile.am:
+ * orbsvcs/tests/AVStreams/Component_Switching/Makefile.am:
+ * orbsvcs/tests/AVStreams/Full_Profile/Makefile.am:
+ * orbsvcs/tests/AVStreams/Latency/Makefile.am:
+ * orbsvcs/tests/AVStreams/Modify_QoS/Makefile.am:
+ * orbsvcs/tests/AVStreams/Multicast/Makefile.am:
+ * orbsvcs/tests/AVStreams/Multicast_Full_Profile/Makefile.am:
+ * orbsvcs/tests/AVStreams/Multiple_Flows/Makefile.am:
+ * orbsvcs/tests/AVStreams/Pluggable/Makefile.am:
+ * orbsvcs/tests/AVStreams/Pluggable_Flow_Protocol/Makefile.am:
+ * orbsvcs/tests/AVStreams/Simple_Three_Stage/Makefile.am:
+ * orbsvcs/tests/AVStreams/Simple_Two_Stage/Makefile.am:
+ * orbsvcs/tests/AVStreams/Simple_Two_Stage_With_QoS/Makefile.am:
+ * orbsvcs/tests/BiDir_CORBALOC/Makefile.am:
+ * orbsvcs/tests/Bug_1334_Regression/Makefile.am:
+ * orbsvcs/tests/Bug_1393_Regression/Makefile.am:
+ * orbsvcs/tests/Bug_1395_Regression/Makefile.am:
+ * orbsvcs/tests/Bug_1630_Regression/Makefile.am:
+ * orbsvcs/tests/Concurrency/Makefile.am:
+ * orbsvcs/tests/CosEvent/Basic/Makefile.am:
+ * orbsvcs/tests/CosEvent/lib/Makefile.am:
+ * orbsvcs/tests/EC_Custom_Marshal/Makefile.am:
+ * orbsvcs/tests/EC_MT_Mcast/Makefile.am:
+ * orbsvcs/tests/EC_Mcast/Makefile.am:
+ * orbsvcs/tests/EC_Multiple/Makefile.am:
+ * orbsvcs/tests/EC_Throughput/Makefile.am:
+ * orbsvcs/tests/Event/Basic/Makefile.am:
+ * orbsvcs/tests/Event/Mcast/Common/Makefile.am:
+ * orbsvcs/tests/Event/Mcast/Complex/Makefile.am:
+ * orbsvcs/tests/Event/Mcast/Simple/Makefile.am:
+ * orbsvcs/tests/Event/Mcast/Two_Way/Makefile.am:
+ * orbsvcs/tests/Event/Performance/Makefile.am:
+ * orbsvcs/tests/Event/lib/Makefile.am:
+
+ Regenerated.
+
+ * orbsvcs/tests/EC_Custom_Marshal/EC_Custom_Marshal.mpc:
Add *_IDL projects for compiling *.idl files. This eliminates
duplicate rules that would otherwise result when Makefile.am's
@@ -478,47 +584,47 @@ Mon Aug 22 18:12:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl>
Mon Aug 22 10:43:11 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * TAO_IDL/Makefile.am:
- * orbsvcs/orbsvcs/Makefile.am:
- * tao/Makefile.am:
-
- Regenerated.
+ * TAO_IDL/Makefile.am:
+ * orbsvcs/orbsvcs/Makefile.am:
+ * tao/Makefile.am:
- * tao/AnyTypeCode.mpc:
+ Regenerated.
- Changed AnyTypecode to AnyTypeCode so generated project
- files work with case sensitive filesystems.
+ * tao/AnyTypeCode.mpc:
- * tao/tao.mpc:
+ Changed AnyTypecode to AnyTypeCode so generated project
+ files work with case sensitive filesystems.
- Removed a few more headers that have been moved to the
- AnyTypeCode library.
+ * tao/tao.mpc:
- * tao/BiDir_GIOP/TAO_BiDirGIOP.pc.in:
- * tao/CodecFactory/TAO_CodecFactory.pc.in:
- * tao/Domain/TAO_Domain.pc.in:
- * tao/DynamicAny/TAO_DynamicAny.pc.in:
- * tao/DynamicInterface/TAO_DynamicInterface.pc.in:
- * tao/IFR_Client/TAO_IFR_Client.pc.in:
- * tao/IORInterceptor/TAO_IORInterceptor.pc.in:
- * tao/IORManipulation/TAO_IORManip.pc.in:
- * tao/ImR_Client/TAO_ImR_Client.pc.in:
- * tao/Messaging/TAO_Messaging.pc.in:
- * tao/ObjRefTemplate/TAO_ObjRefTemplate.pc.in:
- * tao/PI/TAO_PI.pc.in:
- * tao/PI_Server/TAO_PI_Server.pc.in:
- * tao/PortableServer/TAO_PortableServer.pc.in:
- * tao/RTCORBA/TAO_RTCORBA.pc.in:
- * tao/RTPortableServer/TAO_RTPortableServer.pc.in:
- * tao/RTScheduling/TAO_RTScheduler.pc.in:
- * tao/Strategies/TAO_Strategies.pc.in:
- * tao/TypeCodeFactory/TAO_TypeCodeFactory.pc.in:
- * tao/Valuetype/TAO_Valuetype.pc.in:
- * tao/TAO_Utils.pc.in
+ Removed a few more headers that have been moved to the
+ AnyTypeCode library.
+
+ * tao/BiDir_GIOP/TAO_BiDirGIOP.pc.in:
+ * tao/CodecFactory/TAO_CodecFactory.pc.in:
+ * tao/Domain/TAO_Domain.pc.in:
+ * tao/DynamicAny/TAO_DynamicAny.pc.in:
+ * tao/DynamicInterface/TAO_DynamicInterface.pc.in:
+ * tao/IFR_Client/TAO_IFR_Client.pc.in:
+ * tao/IORInterceptor/TAO_IORInterceptor.pc.in:
+ * tao/IORManipulation/TAO_IORManip.pc.in:
+ * tao/ImR_Client/TAO_ImR_Client.pc.in:
+ * tao/Messaging/TAO_Messaging.pc.in:
+ * tao/ObjRefTemplate/TAO_ObjRefTemplate.pc.in:
+ * tao/PI/TAO_PI.pc.in:
+ * tao/PI_Server/TAO_PI_Server.pc.in:
+ * tao/PortableServer/TAO_PortableServer.pc.in:
+ * tao/RTCORBA/TAO_RTCORBA.pc.in:
+ * tao/RTPortableServer/TAO_RTPortableServer.pc.in:
+ * tao/RTScheduling/TAO_RTScheduler.pc.in:
+ * tao/Strategies/TAO_Strategies.pc.in:
+ * tao/TypeCodeFactory/TAO_TypeCodeFactory.pc.in:
+ * tao/Valuetype/TAO_Valuetype.pc.in:
+ * tao/TAO_Utils.pc.in
- Update to add TAO_AnyTypeCode to "Requires:" as needed.
+ Update to add TAO_AnyTypeCode to "Requires:" as needed.
- * tao/AnyTypeCode/TAO_AnyTypeCode.pc.in:
+ * tao/AnyTypeCode/TAO_AnyTypeCode.pc.in:
New file, pkg-config *.pc template for TAO_AnyTypeCode library.
@@ -3328,28 +3434,28 @@ Fri Aug 19 07:56:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl>
Thu Aug 18 13:59:52 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/orbsvcs/Log/LogActivator.cpp:
+ * orbsvcs/orbsvcs/Log/LogActivator.cpp:
- Fixed emulated exception build failures.
+ Fixed emulated exception build failures.
Thu Aug 18 13:46:38 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/orbsvcs/Log/LogActivator.cpp:
+ * orbsvcs/orbsvcs/Log/LogActivator.cpp:
- Changed to omit identifier name for unused parameters.
+ Changed to omit identifier name for unused parameters.
- * orbsvcs/orbsvcs/Log/LogMgr_i.cpp:
+ * orbsvcs/orbsvcs/Log/LogMgr_i.cpp:
- Changed to use CORBA::RepositoryId_var for the return value of
- create_log_repositoryid() so results will be freed on exit.
+ Changed to use CORBA::RepositoryId_var for the return value of
+ create_log_repositoryid() so results will be freed on exit.
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
- Changed create_log_repositoryid() to duplicate string rather
- than returning a string literal.
+ Changed create_log_repositoryid() to duplicate string rather
+ than returning a string literal.
Thu Aug 18 15:19:40 UTC 2005 Jeff Parsons <j.parsons@vanderbilt.edu>
@@ -3362,43 +3468,43 @@ Thu Aug 18 15:19:40 UTC 2005 Jeff Parsons <j.parsons@vanderbilt.edu>
Wed Aug 17 11:30:37 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp (create_with_id):
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp (create_with_id):
- Fix bug where _nil() was returned instead of new object
- reference.
+ Fix bug where _nil() was returned instead of new object
+ reference.
- * orbsvcs/orbsvcs/Makefile.am:
+ * orbsvcs/orbsvcs/Makefile.am:
- Regenerated.
+ Regenerated.
- * orbsvcs/orbsvcs/DsLogAdmin.mpc:
+ * orbsvcs/orbsvcs/DsLogAdmin.mpc:
- Add LogActivator.cpp to Source_Files in the DsLogAdmin_Serv
- project.
+ Add LogActivator.cpp to Source_Files in the DsLogAdmin_Serv
+ project.
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
- Changed create() and create_with_id() methods to invoke
- create_log_reference() instead of create_log_object(). This is
- not absolutely necessary, since a log is very likely to be used
- after it is created. However, it helps to ensure the servant
- activator code path is exercised so it will work when a dynamic
- logging strategy that needs it is loaded.
+ Changed create() and create_with_id() methods to invoke
+ create_log_reference() instead of create_log_object(). This is
+ not absolutely necessary, since a log is very likely to be used
+ after it is created. However, it helps to ensure the servant
+ activator code path is exercised so it will work when a dynamic
+ logging strategy that needs it is loaded.
- * orbsvcs/orbsvcs/Log/LogMgr_i.cpp
+ * orbsvcs/orbsvcs/Log/LogMgr_i.cpp
- Added USE_SERVANT_MANAGER request processing policy to the
- log POA.
+ Added USE_SERVANT_MANAGER request processing policy to the
+ log POA.
- * orbsvcs/orbsvcs/Log/LogActivator.cpp:
- * orbsvcs/orbsvcs/Log/LogActivator.h:
+ * orbsvcs/orbsvcs/Log/LogActivator.cpp:
+ * orbsvcs/orbsvcs/Log/LogActivator.h:
- New files, servant activator class for creating new logs. This
- is useful for persistent log strategies so that servants can be
- created when they are first accessed instead of at startup.
+ New files, servant activator class for creating new logs. This
+ is useful for persistent log strategies so that servants can be
+ created when they are first accessed instead of at startup.
Wed Aug 17 14:31:12 UTC 2005 Johnny Willemsen <jwillemsen@remedy.nl>
@@ -3416,98 +3522,98 @@ Tue Aug 16 18:19:13 UTC 2005 Jeff Parsons <j.parsons@vanderbilt.edu>
Mon Aug 15 20:28:14 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/LogMgr_i.cpp:
- * orbsvcs/orbsvcs/Log/LogMgr_i.h:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/LogMgr_i.cpp:
+ * orbsvcs/orbsvcs/Log/LogMgr_i.h:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h:
- Refactor separate create_log_reference() implementations from
- the derived factory classes into a single template method in the
- base class.
+ Refactor separate create_log_reference() implementations from
+ the derived factory classes into a single template method in the
+ base class.
- Added new create_repositoryid() virtual method to return
- the repository id for the specific log type.
+ Added new create_repositoryid() virtual method to return
+ the repository id for the specific log type.
Mon Aug 15 16:41:57 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/orbsvcs/DsEventLogAdmin.mpc:
+ * orbsvcs/orbsvcs/DsEventLogAdmin.mpc:
- Add eventlog_serv_export.h to Header_Files section.
+ Add eventlog_serv_export.h to Header_Files section.
- * orbsvcs/orbsvcs/DsLogAdmin.mpc:
+ * orbsvcs/orbsvcs/DsLogAdmin.mpc:
- Add log_serv_export.h to Header_Files section.
+ Add log_serv_export.h to Header_Files section.
- * orbsvcs/orbsvcs/DsNotifyLogAdmin.mpc:
+ * orbsvcs/orbsvcs/DsNotifyLogAdmin.mpc:
- Add notifylog_serv_export.h to Header_Files section.
+ Add notifylog_serv_export.h to Header_Files section.
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/LogMgr_i.cpp:
- * orbsvcs/orbsvcs/Log/LogMgr_i.h:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/LogMgr_i.cpp:
+ * orbsvcs/orbsvcs/Log/LogMgr_i.h:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h:
- Combine identical create_log_objectid() implementations from the
- derived factory classes into a single one in the base class.
+ Combine identical create_log_objectid() implementations from the
+ derived factory classes into a single one in the base class.
- Refactor separate create_log_object() implementations to
- a single template method in the base class.
+ Refactor separate create_log_object() implementations to
+ a single template method in the base class.
Mon Aug 15 15:13:10 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/tests/Concurrency/Makefile.am:
+ * orbsvcs/tests/Concurrency/Makefile.am:
- Remove tmplinst.cpp from list of files.
+ Remove tmplinst.cpp from list of files.
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/BasicLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/EventLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/LogMgr_i.h:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
- * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/BasicLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/EventLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/LogMgr_i.h:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/NotifyLogFactory_i.h:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.cpp:
+ * orbsvcs/orbsvcs/Log/RTEventLogFactory_i.h:
- Create new virtual method create_log_servant() and factor out
- implementation from create_log_object(). This change enables
- making create_log_object() into a template method in the base
- class and using a Servant Activator to avoid creating the log
- servants until they're actually used. I hope to make these
- changes soon.
+ Create new virtual method create_log_servant() and factor out
+ implementation from create_log_object(). This change enables
+ making create_log_object() into a template method in the base
+ class and using a Servant Activator to avoid creating the log
+ servants until they're actually used. I hope to make these
+ changes soon.
Mon Aug 15 10:56:28 2005 J.T. Conklin <jtc@acorntoolworks.com>
- * orbsvcs/Logging_Service/Basic_Logging_Service/Makefile.am:
- * orbsvcs/Logging_Service/Event_Logging_Service/Makefile.am:
- * orbsvcs/Logging_Service/Notify_Logging_Service/Makefile.am:
- * orbsvcs/Logging_Service/RTEvent_Logging_Service/Makefile.am:
- * orbsvcs/orbsvcs/Makefile.am:
+ * orbsvcs/Logging_Service/Basic_Logging_Service/Makefile.am:
+ * orbsvcs/Logging_Service/Event_Logging_Service/Makefile.am:
+ * orbsvcs/Logging_Service/Notify_Logging_Service/Makefile.am:
+ * orbsvcs/Logging_Service/RTEvent_Logging_Service/Makefile.am:
+ * orbsvcs/orbsvcs/Makefile.am:
- Regenerated.
+ Regenerated.
- * orbsvcs/orbsvcs/DsLogAdmin.mpc:
+ * orbsvcs/orbsvcs/DsLogAdmin.mpc:
- Changed to inherit from utils.
+ Changed to inherit from utils.
- * orbsvcs/orbsvcs/Log/LogMgr_i.cpp (init):
+ * orbsvcs/orbsvcs/Log/LogMgr_i.cpp (init):
- Use TAO::Utils::PolicyList_Destroyer instead of plain
- CORBA::PolicyList and an explicit loop to destroy the policies.
- This ensures all policies will be destroyed if an exception is
- thrown.
+ Use TAO::Utils::PolicyList_Destroyer instead of plain
+ CORBA::PolicyList and an explicit loop to destroy the policies.
+ This ensures all policies will be destroyed if an exception is
+ thrown.
Mon Aug 15 16:25:23 UTC 2005 Jeff Parsons <j.parsons@vanderbilt.edu>
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp
index 74adea8576b..af95e004b51 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.cpp
@@ -32,6 +32,7 @@
#include "ace/Arg_Shifter.h"
#include "ace/Sched_Params.h"
#include "ace/OS_NS_strings.h"
+#include "ace/Dynamic_Service.h"
#if ! defined (__ACE_INLINE__)
#include "EC_Default_Factory.i"
@@ -46,6 +47,7 @@ TAO_EC_Default_Factory::~TAO_EC_Default_Factory (void)
int
TAO_EC_Default_Factory::init_svcs (void)
{
+ TAO_EC_Simple_Queue_Full_Action::init_svcs();
return ACE_Service_Config::static_svcs ()->
insert (&ace_svc_desc_TAO_EC_Default_Factory);
}
@@ -439,6 +441,17 @@ TAO_EC_Default_Factory::init (int argc, ACE_TCHAR* argv[])
arg_shifter.consume_arg ();
}
+ else if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-ECQueueFullServiceObject")) == 0)
+ {
+ arg_shifter.consume_arg ();
+ if (arg_shifter.is_parameter_next ())
+ {
+ const char* opt = arg_shifter.get_current ();
+ this->queue_full_service_object_name_.set(opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+
else if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-ECConsumerAdminLock")) == 0)
{
ACE_ERROR ((LM_ERROR,
@@ -483,16 +496,51 @@ TAO_EC_Default_Factory::fini (void)
// ****************************************************************
+TAO_EC_Queue_Full_Service_Object*
+TAO_EC_Default_Factory::find_service_object (const char* wanted,
+ const char* fallback)
+{
+ TAO_EC_Queue_Full_Service_Object* so = 0;
+ so = ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>::instance (wanted);
+ if (so != 0)
+ return so;
+
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) EC_Default_Factory::create_dispatching "
+ "unable to find queue full service object '%s'; "
+ "using '%s' instead\n",
+ wanted,
+ fallback));
+
+ so = ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>::instance (fallback);
+ if (so != 0)
+ return so;
+
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) EC_Default_Factory::create_dispatching "
+ "unable find default queue full service object '%s'; "
+ "aborting.\n",
+ fallback));
+ ACE_OS::abort ();
+ return 0; // superfluous return to de-warn; we should never reach here
+}
+
TAO_EC_Dispatching*
TAO_EC_Default_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
{
if (this->dispatching_ == 0)
return new TAO_EC_Reactive_Dispatching ();
else if (this->dispatching_ == 1)
- return new TAO_EC_MT_Dispatching (this->dispatching_threads_,
- this->dispatching_threads_flags_,
- this->dispatching_threads_priority_,
- this->dispatching_threads_force_active_);
+ {
+ TAO_EC_Queue_Full_Service_Object* so =
+ this->find_service_object (this->queue_full_service_object_name_.fast_rep(),
+ TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME);
+ return new TAO_EC_MT_Dispatching (this->dispatching_threads_,
+ this->dispatching_threads_flags_,
+ this->dispatching_threads_priority_,
+ this->dispatching_threads_force_active_,
+ so);
+ }
return 0;
}
@@ -950,3 +998,514 @@ ACE_STATIC_SVC_DEFINE (TAO_EC_Default_Factory,
0)
ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_EC_Default_Factory)
+// ****************************************************************
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+template class ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>;
+
+template class ACE_Node<ACE_Command_Base*>;
+template class ACE_Unbounded_Queue<ACE_Command_Base*>;
+template class ACE_Unbounded_Queue_Iterator<ACE_Command_Base*>;
+template class ACE_Unbounded_Set<ACE_Static_Svc_Descriptor*>;
+template class ACE_Unbounded_Set_Iterator<ACE_Static_Svc_Descriptor*>;
+template class ACE_Node<ACE_Static_Svc_Descriptor*>;
+
+template class TAO_ESF_Proxy_Collection<TAO_EC_ProxyPushConsumer>;
+template class TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>;
+template class TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>;
+template class ACE_Unbounded_Set<TAO_EC_ProxyPushConsumer *>;
+template class ACE_Node<TAO_EC_ProxyPushConsumer *>;
+template class ACE_Unbounded_Set_Iterator<TAO_EC_ProxyPushConsumer *>;
+template class ACE_RB_Tree<TAO_EC_ProxyPushConsumer *, int, ACE_Less_Than<TAO_EC_ProxyPushConsumer *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Iterator<TAO_EC_ProxyPushConsumer *, int, ACE_Less_Than<TAO_EC_ProxyPushConsumer *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Reverse_Iterator<TAO_EC_ProxyPushConsumer *, int, ACE_Less_Than<TAO_EC_ProxyPushConsumer *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Iterator_Base<TAO_EC_ProxyPushConsumer *, int, ACE_Less_Than<TAO_EC_ProxyPushConsumer *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Node<TAO_EC_ProxyPushConsumer *, int>;
+template class ACE_Less_Than<TAO_EC_ProxyPushConsumer *>;
+template class TAO_ESF_Proxy_RB_Tree_Iterator<TAO_EC_ProxyPushConsumer>;
+
+template class TAO_ESF_Copy_On_Write_Collection<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator >;
+template class TAO_ESF_Copy_On_Write_Collection<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator >;
+template class TAO_ESF_Copy_On_Write_Collection<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator >;
+template class TAO_ESF_Copy_On_Write_Collection<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator >;
+
+template class TAO_ESF_Proxy_Collection<TAO_EC_ProxyPushSupplier>;
+template class TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>;
+template class TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>;
+template class ACE_Unbounded_Set<TAO_EC_ProxyPushSupplier *>;
+template class ACE_Node<TAO_EC_ProxyPushSupplier *>;
+template class ACE_Unbounded_Set_Iterator<TAO_EC_ProxyPushSupplier *>;
+template class ACE_RB_Tree<TAO_EC_ProxyPushSupplier *, int, ACE_Less_Than<TAO_EC_ProxyPushSupplier *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Iterator<TAO_EC_ProxyPushSupplier *, int, ACE_Less_Than<TAO_EC_ProxyPushSupplier *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Iterator_Base<TAO_EC_ProxyPushSupplier *, int, ACE_Less_Than<TAO_EC_ProxyPushSupplier *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Reverse_Iterator<TAO_EC_ProxyPushSupplier *, int, ACE_Less_Than<TAO_EC_ProxyPushSupplier *>, ACE_Null_Mutex>;
+template class ACE_RB_Tree_Node<TAO_EC_ProxyPushSupplier *, int>;
+template class ACE_Less_Than<TAO_EC_ProxyPushSupplier *>;
+template class TAO_ESF_Proxy_RB_Tree_Iterator<TAO_EC_ProxyPushSupplier>;
+
+#if defined (ACE_HAS_THREADS)
+//
+// To avoid duplicate instantiations of templates we must put the MT
+// versions on this #ifdef, otherwise the ACE_SYNCH* macros expand to
+// the ACE_NULL* versions, duplicating the non-MT versions below.
+// We *cannot* use explicit ACE_Synch classes because that will not
+// compile in platforms without threads.
+//
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH> >;
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH> >;
+
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH> >;
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH> >;
+
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ TAO_SYNCH_MUTEX>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_SYNCH>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_SYNCH>;
+
+#endif /* ACE_HAS_THREADS */
+
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH> >;
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushConsumer >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushConsumer,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> >;
+
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH> >;
+template class TAO_ESF_Immediate_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Read<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> >;
+template class ACE_Guard< TAO_ESF_Busy_Lock_Adapter<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> > >;
+template class TAO_ESF_Connected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Reconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Disconnected_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>,TAO_EC_ProxyPushSupplier >;
+template class TAO_ESF_Shutdown_Command<
+ TAO_ESF_Delayed_Changes<TAO_EC_ProxyPushSupplier,
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH> >;
+
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write_Read_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_Null_Mutex>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_List_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_List<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_List_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushConsumer>,
+ TAO_EC_Consumer_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>;
+template class TAO_ESF_Copy_On_Write_Write_Guard<
+ TAO_ESF_Proxy_RB_Tree<TAO_EC_ProxyPushSupplier>,
+ TAO_EC_Supplier_RB_Tree_Iterator,
+ ACE_NULL_SYNCH>;
+
+#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+#pragma instantiate ACE_Dynamic_Service<TAO_EC_Queue_Full_Service_Object>
+// @@ TODO!!!
+
+#if defined (ACE_HAS_THREADS)
+#endif /* ACE_HAS_THREADS */
+
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h
index a5f3e0f5113..406739f25b8 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.h
@@ -29,6 +29,8 @@
#include "ace/SString.h"
#include "ace/Time_Value.h"
+class TAO_EC_Queue_Full_Service_Object;
+
/**
* @class TAO_EC_Default_Factory
*
@@ -158,6 +160,9 @@ protected:
int dispatching_threads_flags_;
int dispatching_threads_priority_;
int dispatching_threads_force_active_;
+ ACE_CString queue_full_service_object_name_;
+ TAO_EC_Queue_Full_Service_Object* find_service_object (const char* wanted,
+ const char* fallback);
/// Use this ORB to locate global resources.
ACE_CString orbid_;
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i
index 08dbae36c08..3ff451b166a 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Default_Factory.i
@@ -16,6 +16,7 @@ TAO_EC_Default_Factory::TAO_EC_Default_Factory (void)
dispatching_threads_flags_ (TAO_EC_DEFAULT_DISPATCHING_THREADS_FLAGS),
dispatching_threads_priority_ (TAO_EC_DEFAULT_DISPATCHING_THREADS_PRIORITY),
dispatching_threads_force_active_ (TAO_EC_DEFAULT_DISPATCHING_THREADS_FORCE_ACTIVE),
+ queue_full_service_object_name_ (TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME),
orbid_ (TAO_EC_DEFAULT_ORB_ID),
consumer_control_ (TAO_EC_DEFAULT_CONSUMER_CONTROL),
supplier_control_ (TAO_EC_DEFAULT_SUPPLIER_CONTROL),
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h b/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
index 63c18e87104..bcabf232a45 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
@@ -123,6 +123,10 @@
# define TAO_EC_DEFAULT_SUPPLIER_CONTROL_PERIOD 5000000 /* usecs */
#endif /* TAO_EC_DEFAULT_SUPPLIER_CONTROL_PERIOD */
+#ifndef TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME
+# define TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME "EC_QueueFullSimpleActions"
+#endif /* TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME */
+
#ifndef TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT
# define TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT 10000 /* usecs */
#endif /* TAO_EC_DEFAULT_CONSUMER_CONTROL_TIMEOUT */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp
index ec794142b7e..20faf6a860c 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.cpp
@@ -2,9 +2,11 @@
#include "EC_Dispatching_Task.h"
#include "EC_ProxySupplier.h"
+#include "EC_Defaults.h"
#include "tao/ORB_Constants.h"
#include "ace/OS_NS_errno.h"
+#include "ace/OS_NS_strings.h"
#if ! defined (__ACE_INLINE__)
#include "EC_Dispatching_Task.i"
@@ -14,6 +16,75 @@ ACE_RCSID (Event,
EC_Dispatching,
"$Id$")
+TAO_EC_Simple_Queue_Full_Action::TAO_EC_Simple_Queue_Full_Action()
+ : queue_full_action_return_value_ (WAIT_TO_EMPTY)
+{
+}
+
+/// Helper function to register the default action into the service
+/// configurator.
+int
+TAO_EC_Simple_Queue_Full_Action::init_svcs (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) Simple_Queue_Full_Action::init_svcs()\n"));
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_EC_Simple_Queue_Full_Action);
+}
+
+int
+TAO_EC_Simple_Queue_Full_Action::init (int argc, char* argv[])
+{
+ // Here we look at the args and set an internal flag indicating whether
+ // the default action should be to wait for the queue to not be full
+ // or whether it should be to silently discard the event.
+
+ // @@ This should use the arg shifter stuff, but let's keep it simple to
+ // start.
+
+ do {
+ if (argc == 0)
+ break;
+
+ if (ACE_OS::strcasecmp ("wait", argv[0]) == 0)
+ this->queue_full_action_return_value_ = WAIT_TO_EMPTY;
+ else if (ACE_OS::strcasecmp ("discard", argv[0]) == 0)
+ this->queue_full_action_return_value_ = SILENTLY_DISCARD;
+#if 0
+ else
+ ;
+ // probably ought to print an error message here
+#endif
+ } while (0);
+
+ return 0;
+}
+
+int
+TAO_EC_Simple_Queue_Full_Action::fini (void)
+{
+ return 0;
+}
+
+int
+TAO_EC_Simple_Queue_Full_Action::queue_full_action (TAO_EC_Dispatching_Task */*task*/,
+ TAO_EC_ProxyPushSupplier */*proxy*/,
+ RtecEventComm::PushConsumer_ptr /*consumer*/,
+ RtecEventComm::EventSet& /*event*/
+ ACE_ENV_ARG_DECL)
+{
+ return this->queue_full_action_return_value_;
+}
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_Simple_Queue_Full_Action,
+ ACE_TEXT (TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_Simple_Queue_Full_Action),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTEvent, TAO_EC_Simple_Queue_Full_Action)
+
+
+
int
TAO_EC_Queue::is_full_i (void)
{
@@ -71,6 +142,17 @@ TAO_EC_Dispatching_Task::push (TAO_EC_ProxyPushSupplier *proxy,
RtecEventComm::EventSet& event
ACE_ENV_ARG_DECL)
{
+ if (this->msg_queue()->is_full ())
+ {
+ int action =
+ this->queue_full_service_object_->queue_full_action (this, proxy,
+ consumer, event
+ ACE_ENV_ARG_PARAMETER);
+ if (action == TAO_EC_Queue_Full_Service_Object::SILENTLY_DISCARD)
+ return;
+ // if action == WAIT_TO_EMPTY then we just go ahead and queue it
+ }
+
if (this->allocator_ == 0)
this->allocator_ = ACE_Allocator::instance ();
@@ -86,7 +168,11 @@ TAO_EC_Dispatching_Task::push (TAO_EC_ProxyPushSupplier *proxy,
event,
this->data_block_.duplicate (),
this->allocator_);
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): task %@ queue size before putq: %d\n",
+ this, this->the_queue_.message_count ()));
this->putq (mb);
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): task %@ queue size after putq: %d\n",
+ this, this->the_queue_.message_count ()));
}
// ****************************************************************
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h
index 5fdaec09763..86869bc6e3c 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.h
@@ -29,6 +29,52 @@
#include "ace/Task.h"
#include "ace/Message_Block.h"
#include "ace/Lock_Adapter_T.h"
+#include "ace/Service_Config.h"
+#include "ace/Global_Macros.h"
+
+// Forward decl
+class TAO_EC_Dispatching_Task;
+
+class TAO_RTEvent_Serv_Export TAO_EC_Queue_Full_Service_Object : public ACE_Service_Object
+{
+public:
+ enum QueueFullActionReturnValue
+ {
+ WAIT_TO_EMPTY = 0,
+ SILENTLY_DISCARD = -1
+ };
+
+ // Called when
+ virtual int queue_full_action (TAO_EC_Dispatching_Task *task,
+ TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL) = 0;
+};
+
+class TAO_RTEvent_Serv_Export TAO_EC_Simple_Queue_Full_Action :
+ public TAO_EC_Queue_Full_Service_Object
+{
+public:
+ TAO_EC_Simple_Queue_Full_Action ();
+
+ /// Helper function to register the default action into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, char* argv[]);
+ virtual int fini (void);
+
+ virtual int queue_full_action (TAO_EC_Dispatching_Task *task,
+ TAO_EC_ProxyPushSupplier *proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event
+ ACE_ENV_ARG_DECL);
+
+protected:
+ int queue_full_action_return_value_;
+};
class TAO_RTEvent_Serv_Export TAO_EC_Queue : public ACE_Message_Queue<ACE_SYNCH>
{
@@ -54,7 +100,7 @@ class TAO_RTEvent_Serv_Export TAO_EC_Dispatching_Task : public ACE_Task<ACE_SYNC
{
public:
/// Constructor
- TAO_EC_Dispatching_Task (ACE_Thread_Manager* thr_manager = 0);
+ TAO_EC_Dispatching_Task (ACE_Thread_Manager* thr_manager = 0, TAO_EC_Queue_Full_Service_Object* queue_full_service_object = 0);
/// Process the events in the queue.
virtual int svc (void);
@@ -73,6 +119,8 @@ private:
/// The queue
TAO_EC_Queue the_queue_;
+
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_;
};
// ****************************************************************
@@ -139,6 +187,9 @@ private:
#include "EC_Dispatching_Task.i"
#endif /* __ACE_INLINE__ */
+ACE_STATIC_SVC_DECLARE (TAO_EC_Simple_Queue_Full_Action)
+ACE_FACTORY_DECLARE (TAO_RTEvent, TAO_EC_Simple_Queue_Full_Action)
+
#include /**/ "ace/post.h"
#endif /* TAO_EC_DISPATCHING_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i
index 59fecf9da0e..12694120844 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Dispatching_Task.i
@@ -13,12 +13,23 @@ TAO_EC_Queue::
/// @todo The high water mark and low water mark shouldn't be
/// hardcoded, check http://deuce.doc.wustl.edu/bugzilla/show_bug.cgi?id=565
+#ifndef TAO_EC_QUEUE_HWM
+#define TAO_EC_QUEUE_HWM 16384
+//#define TAO_EC_QUEUE_HWM 2
+#endif
+
+#ifndef TAO_EC_QUEUE_LWM
+#define TAO_EC_QUEUE_LWM 16
+//#define TAO_EC_QUEUE_LWM 1
+#endif
+
ACE_INLINE
TAO_EC_Dispatching_Task::
-TAO_EC_Dispatching_Task (ACE_Thread_Manager* thr_manager)
+TAO_EC_Dispatching_Task (ACE_Thread_Manager* thr_manager, TAO_EC_Queue_Full_Service_Object* so)
: ACE_Task<ACE_SYNCH> (thr_manager),
allocator_ (0),
- the_queue_ (16384, 16) // @@
+ the_queue_ (TAO_EC_QUEUE_HWM, TAO_EC_QUEUE_LWM),
+ queue_full_service_object_ (so)
{
this->msg_queue (&this->the_queue_);
}
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp
index 5be3be22db3..d243e05c7ab 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.cpp
@@ -7,14 +7,16 @@ ACE_RCSID(Event, EC_MT_Dispatching, "$Id$")
TAO_EC_MT_Dispatching::TAO_EC_MT_Dispatching (int nthreads,
int thread_creation_flags,
int thread_priority,
- int force_activate)
+ int force_activate,
+ TAO_EC_Queue_Full_Service_Object* service_object)
: nthreads_ (nthreads),
thread_creation_flags_ (thread_creation_flags),
thread_priority_ (thread_priority),
force_activate_ (force_activate),
- task_ (&this->thread_manager_),
- active_ (0)
+ active_ (0),
+ queue_full_service_object_ (service_object)
{
+ this->task_.open (&this->thread_manager_);
}
void
@@ -83,3 +85,4 @@ TAO_EC_MT_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
this->task_.push (proxy, consumer, event ACE_ENV_ARG_PARAMETER);
}
+
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h
index 4be04076480..293fce9464b 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_MT_Dispatching.h
@@ -41,7 +41,8 @@ public:
TAO_EC_MT_Dispatching (int nthreads,
int thread_creation_flags,
int thread_priority,
- int force_activate);
+ int force_activate,
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_name);
// = The EC_Dispatching methods.
virtual void activate (void);
@@ -83,6 +84,9 @@ private:
/// Are the threads running?
int active_;
+
+ /// Service Object information
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_;
};
#include /**/ "ace/post.h"
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp
new file mode 100644
index 00000000000..53547dd3bcf
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.cpp
@@ -0,0 +1,206 @@
+// $Id$
+
+extern unsigned long EC_TPC_debug_level;
+
+#include "EC_TPC_Dispatching.h"
+#include "EC_Defaults.h"
+
+#include <ace/Dynamic_Service.h>
+
+#if ! defined (__ACE_INLINE__)
+#include "EC_TPC_Dispatching.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_TPC_Dispatching, "$Id$")
+
+#if !defined(TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE)
+#define TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE 32
+#endif
+
+TAO_EC_TPC_Dispatching::TAO_EC_TPC_Dispatching (TAO_EC_Queue_Full_Service_Object* so)
+ : consumer_task_map_(TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE)
+ , queue_full_service_object_(so)
+{
+ ACE_ASSERT (this->queue_full_service_object_ != 0);
+}
+
+TAO_EC_TPC_Dispatching::~TAO_EC_TPC_Dispatching ()
+{
+ // No other dispatching strategy has a DTOR body. I can only
+ // assume that it's guaranteed that shutdown() is called before
+ // the DTOR, so the tear-down logic needs to go in the shutdown,
+ // and the DTOR need not call shutdown.
+}
+
+int
+TAO_EC_TPC_Dispatching::add_consumer (RtecEventComm::PushConsumer_ptr consumer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ // Duplicate the pointer and hold it safely
+ RtecEventComm::PushConsumer_var pc =
+ RtecEventComm::PushConsumer::_duplicate(consumer);
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) TPC_Dispatching::add_consumer(%@)\n", pc.in()));
+
+ TAO_EC_Dispatching_Task* dtask =
+ new TAO_EC_TPC_Dispatching_Task (&this->thread_manager_, this->queue_full_service_object_);
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) TPC_Dispatching::add_consumer(%@): new task %@\n", pc.in(), dtask));
+
+ if ((dtask->activate (TAO_EC_DEFAULT_DISPATCHING_THREADS_FLAGS,
+ 1, // we only want one thread to dispatch to a consumer
+ 1, // magic number??
+ TAO_EC_DEFAULT_DISPATCHING_THREADS_PRIORITY)) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::add_consumer unable to activate"
+ " dispatching task for consumer (%@)\n",
+ consumer));
+ delete dtask;
+ return -1;
+ }
+
+ int bindresult =
+ this->consumer_task_map_.bind (RtecEventComm::PushConsumer::_duplicate(pc.in()),
+ dtask);
+ const char* explanation = 0;
+ if (bindresult == -1)
+ explanation = "general failure";
+ else if (bindresult == 1)
+ explanation = "entry already exists";
+
+ if (explanation != 0)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::add_consumer failed to bind consumer (%@)"
+ " and dispatch task in map (%s): %p\n",
+ consumer, explanation));
+ dtask->putq (new TAO_EC_Shutdown_Task_Command);
+ dtask->wait ();
+ delete dtask;
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+TAO_EC_TPC_Dispatching::remove_consumer (RtecEventComm::PushConsumer_ptr consumer
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1);
+
+ TAO_EC_Dispatching_Task* dtask = 0;
+
+ if (this->consumer_task_map_.find (consumer, dtask) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::remove_consumer failed to"
+ " find consumer (%@) in map\n", consumer));
+ return -1;
+ }
+
+ // Must have found it...first try to unbind
+ if (this->consumer_task_map_.unbind (consumer) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::remove_consumer failed to"
+ " unbind consumer (%@) and task in map\n", consumer));
+ return -1;
+ }
+
+ dtask->putq (new TAO_EC_Shutdown_Task_Command);
+ CORBA::release (consumer); // This matches the _duplicate in add_consumer
+ return 0;
+}
+
+void
+TAO_EC_TPC_Dispatching::activate (void)
+{
+}
+
+void
+TAO_EC_TPC_Dispatching::shutdown (void)
+{
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ // The MT_Dispatching strategy sends a TAO_EC_Shutdown_Task_Command
+ // to the dispatching task. Is that what we should do here?
+ MAPTYPE::ITERATOR iter = this->consumer_task_map_.begin ();
+ while (! iter.done())
+ {
+ MAPTYPE::ENTRY* entry;
+ if (! iter.next(entry))
+ continue;
+
+ entry->int_id_->putq (new TAO_EC_Shutdown_Task_Command);
+ iter.advance ();
+ }
+
+ this->thread_manager_.wait (); // Wait for the threads to terminate
+
+ // Now iterate again and call CORBA::release on the ext_id;
+ // we don't have to delete int_id_ b/c that happens in its close() method.
+ iter = this->consumer_task_map_.begin ();
+ while (! iter.done())
+ {
+ MAPTYPE::ENTRY* entry;
+ if (! iter.next(entry))
+ continue;
+
+ CORBA::release (entry->ext_id_);
+ iter.advance ();
+ }
+
+ this->consumer_task_map_.unbind_all ();
+}
+
+void
+TAO_EC_TPC_Dispatching::push (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ const RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info& qos_info
+ ACE_ENV_ARG_DECL)
+{
+ RtecEventComm::EventSet event_copy = event;
+ this->push_nocopy (proxy, consumer, event_copy, qos_info ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_EC_TPC_Dispatching::push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
+ RtecEventComm::PushConsumer_ptr consumer,
+ RtecEventComm::EventSet& event,
+ TAO_EC_QOS_Info&
+ ACE_ENV_ARG_DECL)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) TPC_Dispatching::push_nocopy(supplier=%@,consumer=%@)\n", proxy, consumer));
+
+ ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->lock_);
+ TAO_EC_Dispatching_Task* dtask;
+
+ if (this->consumer_task_map_.find (consumer, dtask) == -1)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "EC (%P|%t): TPC_Dispatching::push_nocopy failed to"
+ " find consumer (%@) in map\n", consumer));
+ }
+ else
+ {
+ dtask->push (proxy, consumer, event ACE_ENV_ARG_PARAMETER);
+ }
+}
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_Hash_Map_Manager_Ex<RtecEventComm::PushConsumer*, TAO_EC_Dispatching_Task*, ACE_Pointer_Hash<RtecEventComm::PushConsumer*>, ACE_Equal_To<RtecEventComm::PushConsumer*>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Base_Ex<RtecEventComm::PushConsumer*, TAO_EC_Dispatching_Task*, ACE_Pointer_Hash<RtecEventComm::PushConsumer*>, ACE_Equal_To<RtecEventComm::PushConsumer*>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Ex<RtecEventComm::PushConsumer*,TAO_EC_Dispatching_Task*, ACE_Pointer_Hash<RtecEventComm::PushConsumer*>,ACE_Equal_To<RtecEventComm::PushConsumer*>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Reverse_Iterator_Ex<RtecEventComm::PushConsumer*, TAO_EC_Dispatching_Task*, ACE_Pointer_Hash<RtecEventComm::PushConsumer*>, ACE_Equal_To<RtecEventComm::PushConsumer*>, ACE_Null_Mutex>;
+template class ACE_Equal_To<RtecEventComm::PushConsumer*>;
+template class ACE_Pointer_Hash<RtecEventComm::PushConsumer*>;
+template class ACE_Hash_Map_Entry<RtecEventComm::PushConsumer*, TAO_EC_Dispatching_Task*>;
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h
new file mode 100644
index 00000000000..dbc8cda7061
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.h
@@ -0,0 +1,83 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_TPC_Dispatching.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com>
+ *
+ */
+
+#ifndef TAO_EC_TPC_DISPATCHING_H
+#define TAO_EC_TPC_DISPATCHING_H
+#include "ace/pre.h"
+
+#include "ace/Hash_Map_Manager_T.h"
+
+#include "EC_Dispatching.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "EC_TPC_Dispatching_Task.h"
+
+class TAO_EC_Event_Channel_Base;
+
+/**
+ * @class TAO_EC_TPC_Dispatching
+ *
+ * @brief Dispatching strategy that isolates deliveries to a consumer from any other.
+ *
+ * This strategy uses a thread per consumer, and was specifically designed to
+ * isolate the effects of an ill-behaved consumer from affecting other consumers.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_Dispatching : public TAO_EC_Dispatching
+{
+public:
+ TAO_EC_TPC_Dispatching (TAO_EC_Queue_Full_Service_Object* so);
+ ~TAO_EC_TPC_Dispatching ();
+
+ // = 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);
+
+ int add_consumer (RtecEventComm::PushConsumer_ptr consumer ACE_ENV_ARG_DECL);
+ int remove_consumer (RtecEventComm::PushConsumer_ptr consumer ACE_ENV_ARG_DECL);
+
+private:
+ // Use our own thread manager
+ ACE_Thread_Manager thread_manager_;
+
+ typedef ACE_Hash_Map_Manager_Ex<RtecEventComm::PushConsumer_ptr,TAO_EC_Dispatching_Task*,ACE_Pointer_Hash<RtecEventComm::PushConsumer_ptr>,ACE_Equal_To<RtecEventComm::PushConsumer_ptr>,ACE_Null_Mutex> MAPTYPE;
+
+ // Tweak the default size of this map by #defining
+ // TAO_EC_TPC_DISPATCHING_DEFAULT_MAP_SIZE
+ MAPTYPE consumer_task_map_;
+
+ // Lock for modifying the map. It's not enough to have a lock only
+ // on the map, because we have to hold the map constant while doing
+ // multiple distinct map manipulations, such as in remove_consumer().
+ ACE_SYNCH_MUTEX lock_;
+
+ // Service object information
+ TAO_EC_Queue_Full_Service_Object* queue_full_service_object_; // @@ who will release?
+ // @@ check to see how the factory gets released...
+};
+
+#if defined (__ACE_INLINE__)
+#include "EC_TPC_Dispatching.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* TAO_EC_TPC_DISPATCHING_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.i b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.i
new file mode 100644
index 00000000000..cfa1da318d3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching.i
@@ -0,0 +1 @@
+// $Id$
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp
new file mode 100644
index 00000000000..5de281b24cd
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.cpp
@@ -0,0 +1,20 @@
+// $Id$
+
+#include "EC_TPC_Dispatching_Task.h"
+
+//ACE_RCS_ID(RTEvent, EC_TPC_Dispatching_Task, "$Id$")
+
+TAO_EC_TPC_Dispatching_Task::TAO_EC_TPC_Dispatching_Task
+(ACE_Thread_Manager* thr_mgr,
+ TAO_EC_Queue_Full_Service_Object* so)
+ : TAO_EC_Dispatching_Task (thr_mgr, so)
+{
+}
+
+int
+TAO_EC_TPC_Dispatching_Task::close (u_long flags)
+{
+ ACE_UNUSED_ARG (flags);
+ delete this;
+ return 0;
+}
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h
new file mode 100644
index 00000000000..7223dccfb2d
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Dispatching_Task.h
@@ -0,0 +1,29 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_TPC_Dispatching_Task.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com>
+ */
+
+#ifndef TAO_EC_TPC_DISPATCHING_TASK_H
+#define TAO_EC_TPC_DISPATCHING_TASK_H
+#include "ace/pre.h"
+
+#include "EC_Dispatching_Task.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_Dispatching_Task : public TAO_EC_Dispatching_Task
+{
+public:
+ /// Constructor
+ TAO_EC_TPC_Dispatching_Task (ACE_Thread_Manager* thr_mgr, TAO_EC_Queue_Full_Service_Object* so);
+ virtual int close (u_long flags = 0);
+};
+
+#include "ace/post.h"
+#endif /* TAO_EC_TPC_DISPATCHING_TASK_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp
new file mode 100644
index 00000000000..d350c76c677
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.cpp
@@ -0,0 +1,125 @@
+// $Id$
+
+#include "EC_TPC_Factory.h"
+
+#include "EC_TPC_Dispatching.h"
+#include "EC_TPC_ProxySupplier.h"
+#include "EC_TPC_ProxyConsumer.h"
+
+#include "tao/ORB_Core.h"
+
+#include "ace/Arg_Shifter.h"
+#include "ace/Sched_Params.h"
+#include "ace/OS_NS_strings.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "EC_TPC_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_TPC_Factory, "$Id$")
+
+unsigned long EC_TPC_debug_level;
+
+TAO_EC_TPC_Factory::TAO_EC_TPC_Factory (void)
+{
+ EC_TPC_debug_level = 0;
+}
+
+TAO_EC_TPC_Factory::~TAO_EC_TPC_Factory (void)
+{
+}
+
+int
+TAO_EC_TPC_Factory::init_svcs (void)
+{
+ TAO_EC_Simple_Queue_Full_Action::init_svcs();
+ return ACE_Service_Config::static_svcs ()->
+ insert (&ace_svc_desc_TAO_EC_TPC_Factory);
+}
+
+int
+TAO_EC_TPC_Factory::init (int argc, char* argv[])
+{
+ ACE_Arg_Shifter arg_shifter (argc, argv);
+
+ while (arg_shifter.is_anything_left ())
+ {
+ const char *arg = arg_shifter.get_current ();
+
+ if (ACE_OS::strcasecmp (arg, "-ECDispatching") == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ // Here we print out a message indicating that this
+ // option isn't valid with this factory and that it's
+ // being ignored.
+
+ ACE_DEBUG ((LM_ERROR,
+ "EC_TPC_Factory - "
+ "-ECDispatching not supported with TPC_Factory; ignoring the option and using thread-per-consumer dispatch strategy\n"));
+ arg_shifter.consume_arg ();
+ }
+ }
+ if (ACE_OS::strcasecmp (arg, "-ECTPCDebug") == 0)
+ {
+ arg_shifter.consume_arg ();
+ ++EC_TPC_debug_level;
+ }
+ else
+ {
+ arg_shifter.ignore_arg ();
+ }
+
+ }
+
+ return TAO_EC_Default_Factory::init (argc, argv);
+}
+
+// ****************************************************************
+
+TAO_EC_Dispatching*
+TAO_EC_TPC_Factory::create_dispatching (TAO_EC_Event_Channel_Base *)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) EC_TPC_Factory::create_dispatching\n"));
+
+ TAO_EC_Queue_Full_Service_Object* so =
+ this->find_service_object (this->queue_full_service_object_name_.fast_rep(),
+ TAO_EC_DEFAULT_QUEUE_FULL_SERVICE_OBJECT_NAME);
+
+ return new TAO_EC_TPC_Dispatching (so);
+}
+
+
+TAO_EC_ProxyPushSupplier*
+TAO_EC_TPC_Factory::create_proxy_push_supplier (TAO_EC_Event_Channel_Base *ec)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) EC_TPC_Factory::create_proxy_push_supplier\n"));
+ return new TAO_EC_TPC_ProxyPushSupplier (ec, this->consumer_validate_connection_);
+}
+
+
+TAO_EC_ProxyPushConsumer*
+TAO_EC_TPC_Factory::create_proxy_push_consumer (TAO_EC_Event_Channel_Base *ec)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t) EC_TPC_Factory::create_proxy_push_consumer\n"));
+ return new TAO_EC_TPC_ProxyPushConsumer (ec);
+}
+
+
+// ****************************************************************
+
+ACE_STATIC_SVC_DEFINE (TAO_EC_TPC_Factory,
+ ACE_TEXT ("EC_Factory"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (TAO_EC_TPC_Factory),
+ ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
+ 0)
+ACE_FACTORY_DEFINE (TAO_RTEvent_Serv, TAO_EC_TPC_Factory)
+
+// ****************************************************************
+
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h
new file mode 100644
index 00000000000..3d9455564e5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.h
@@ -0,0 +1,67 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_TPC_Factory.h
+ *
+ * $Id$
+ *
+ */
+
+#ifndef TAO_EC_TPC_FACTORY_H
+#define TAO_EC_TPC_FACTORY_H
+#include "ace/pre.h"
+
+#include "EC_Default_Factory.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/**
+ * @class TAO_EC_TPC_Factory
+ *
+ * @brief A generic factory for EC experimentation.
+ *
+ * This class allows the user to experiment with different EC
+ * configurations. Using a command-line like interface the user
+ * can specify which strategies will this factory generate.
+ * Since the class can be dynamically loaded the strategies can be
+ * set in the service configurator file.
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_Factory : public TAO_EC_Default_Factory
+{
+public:
+ /// Constructor
+ TAO_EC_TPC_Factory (void);
+
+ /// destructor...
+ virtual ~TAO_EC_TPC_Factory (void);
+
+ /// Helper function to register the default factory into the service
+ /// configurator.
+ static int init_svcs (void);
+
+ // = The Service_Object entry points
+ virtual int init (int argc, char* argv[]);
+
+ // = The EC_Factory methods
+ virtual TAO_EC_Dispatching*
+ create_dispatching (TAO_EC_Event_Channel_Base*);
+
+ virtual TAO_EC_ProxyPushSupplier*
+ create_proxy_push_supplier (TAO_EC_Event_Channel_Base*);
+
+ virtual TAO_EC_ProxyPushConsumer*
+ create_proxy_push_consumer (TAO_EC_Event_Channel_Base*);
+};
+
+extern unsigned long EC_TPC_debug_level;
+
+#if defined (__ACE_INLINE__)
+#include "EC_TPC_Factory.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_STATIC_SVC_DECLARE (TAO_EC_TPC_Factory)
+ACE_FACTORY_DECLARE (TAO_RTEvent_Serv, TAO_EC_TPC_Factory)
+
+#include "ace/post.h"
+#endif /* TAO_EC_TPC_FACTORY_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.i b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.i
new file mode 100644
index 00000000000..74e88caa0c5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_Factory.i
@@ -0,0 +1,2 @@
+// $Id$
+
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp
new file mode 100644
index 00000000000..a9179ccae1b
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.cpp
@@ -0,0 +1,43 @@
+// $Id$
+
+#include "EC_TPC_ProxyConsumer.h"
+
+ACE_RCSID(Event, EC_TPC_ProxyConsumer, "$Id$")
+
+#include "EC_Event_Channel_Base.h"
+#include "EC_TPC_Dispatching.h"
+
+extern unsigned long EC_TPC_debug_level;
+
+TAO_EC_TPC_ProxyPushConsumer::TAO_EC_TPC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* ec)
+: TAO_EC_Default_ProxyPushConsumer (ec)
+{
+}
+
+TAO_EC_TPC_Dispatching*
+TAO_EC_TPC_ProxyPushConsumer::tpc_dispatching ()
+{
+ TAO_EC_Dispatching* dispatcher = this->event_channel_->dispatching ();
+ TAO_EC_TPC_Dispatching* tpcdispatcher =
+ ACE_dynamic_cast (TAO_EC_TPC_Dispatching*, dispatcher);
+ return tpcdispatcher;
+}
+
+TAO_EC_TPC_ProxyPushConsumer::~TAO_EC_TPC_ProxyPushConsumer (void)
+{
+ // @@@ Do I need to call the logic to remove the consumer from the
+ // dispatch map in here? I'm not sure... But, if I do, then I need
+ // to fact that "remove" code out of just the
+ // disconnect_push_consumer.
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "RTEC (%P|%t): inside ~TAO_EC_TPC_ProxyPushConsumer (%x)\n", this));
+}
+
+void
+TAO_EC_TPC_ProxyPushConsumer::disconnect_push_consumer (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->tpc_dispatching ()->remove_consumer (this->_this(ACE_ENV_SINGLE_ARG_PARAMETER));
+ BASECLASS::disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h
new file mode 100644
index 00000000000..4189082451e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxyConsumer.h
@@ -0,0 +1,45 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_TPC_ProxyConsumer.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com >
+ *
+ */
+
+#ifndef TAO_EC_TPC_PROXYCONSUMER_H
+#define TAO_EC_TPC_PROXYCONSUMER_H
+#include "ace/pre.h"
+
+#include "EC_Default_ProxyConsumer.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+class TAO_EC_Dispatching;
+class TAO_EC_TPC_Dispatching;
+
+/**
+ * @class TAO_EC_TPC_ProxyPushConsumer
+ *
+ */
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_ProxyPushConsumer :
+ public TAO_EC_Default_ProxyPushConsumer
+{
+public:
+ TAO_EC_TPC_ProxyPushConsumer (TAO_EC_Event_Channel_Base* ec);
+ virtual ~TAO_EC_TPC_ProxyPushConsumer (void);
+
+ virtual void disconnect_push_consumer (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ typedef TAO_EC_Default_ProxyPushConsumer BASECLASS;
+ TAO_EC_TPC_Dispatching* tpc_dispatching ();
+};
+
+#include "ace/post.h"
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp
new file mode 100644
index 00000000000..66495f649b5
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.cpp
@@ -0,0 +1,66 @@
+// $Id$
+
+#include "EC_TPC_ProxySupplier.h"
+
+#if ! defined (__ACE_INLINE__)
+#include "EC_TPC_ProxySupplier.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Event, EC_TPC_ProxySupplier, "$Id$")
+
+#include "EC_Event_Channel_Base.h"
+#include "EC_TPC_Dispatching.h"
+
+extern unsigned long EC_TPC_debug_level;
+
+TAO_EC_TPC_ProxyPushSupplier::~TAO_EC_TPC_ProxyPushSupplier (void)
+{
+
+}
+
+void
+TAO_EC_TPC_ProxyPushSupplier:: disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): enter EC_TPC_ProxySupplier::disconnect_push_supplier (%@): refcount=%u,consumer=%@\n", this, this->refcount_, this->consumer_.in()));
+
+ if (this->is_connected_i ())
+ this->tpc_dispatching ()->remove_consumer (this->consumer_.in());
+ BASECLASS::disconnect_push_supplier ();
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): leave EC_TPC_ProxySupplier::disconnect_push_supplier (%@)\n", this));
+}
+
+TAO_EC_TPC_Dispatching*
+TAO_EC_TPC_ProxyPushSupplier::tpc_dispatching ()
+{
+ TAO_EC_Dispatching* dispatcher = this->event_channel_->dispatching ();
+ TAO_EC_TPC_Dispatching* tpcdispatcher =
+ ACE_dynamic_cast (TAO_EC_TPC_Dispatching*, dispatcher);
+ return tpcdispatcher;
+}
+
+void
+TAO_EC_TPC_ProxyPushSupplier::connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS& qos
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError))
+{
+ BASECLASS::connect_push_consumer (push_consumer, qos ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "EC (%P|%t): EC_ProxySupplier(%@): refcount=%u,consumer=%@\n",
+ this, this->refcount_, this->consumer_.in()));
+
+ TAO_EC_TPC_Dispatching* tpcdispatcher = this->tpc_dispatching ();
+
+ // the new dispatching task gets automatically created
+ tpcdispatcher->add_consumer (push_consumer);
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h
new file mode 100644
index 00000000000..9797eb3c305
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.h
@@ -0,0 +1,60 @@
+/* -*- C++ -*- */
+/**
+ * @file EC_TPC_ProxySupplier.h
+ *
+ * $Id$
+ *
+ * @author Chris Cleeland <cleeland at ociweb.com>
+ *
+ */
+
+#ifndef TAO_EC_TPC_PROXYSUPPLIER_H
+#define TAO_EC_TPC_PROXYSUPPLIER_H
+#include "ace/pre.h"
+
+#include "EC_Default_ProxySupplier.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+class TAO_EC_Dispatching;
+class TAO_EC_TPC_Dispatching;
+
+class TAO_RTEvent_Serv_Export TAO_EC_TPC_ProxyPushSupplier :
+ public TAO_EC_Default_ProxyPushSupplier
+{
+public:
+ /// Constructor
+ TAO_EC_TPC_ProxyPushSupplier (TAO_EC_Event_Channel_Base* event_channel, int validate_connection);
+
+ /// Dtor
+ virtual ~TAO_EC_TPC_ProxyPushSupplier (void);
+
+ /*! These are overriden from the base class in order to maintain the
+ map in the dispatcher class. */
+
+ // = The RtecEventChannelAdmin::ProxyPushSupplier methods...
+ virtual void connect_push_consumer (
+ RtecEventComm::PushConsumer_ptr push_consumer,
+ const RtecEventChannelAdmin::ConsumerQOS &qos
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ RtecEventChannelAdmin::AlreadyConnected,
+ RtecEventChannelAdmin::TypeError));
+
+ virtual void disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+private:
+ typedef TAO_EC_Default_ProxyPushSupplier BASECLASS;
+ TAO_EC_TPC_Dispatching* tpc_dispatching ();
+};
+
+#if defined (__ACE_INLINE__)
+#include "EC_TPC_ProxySupplier.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+
+#endif
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i
new file mode 100644
index 00000000000..7120a4017f2
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_TPC_ProxySupplier.i
@@ -0,0 +1,12 @@
+// $Id$
+
+extern unsigned long EC_TPC_debug_level;
+
+ACE_INLINE
+TAO_EC_TPC_ProxyPushSupplier::TAO_EC_TPC_ProxyPushSupplier (TAO_EC_Event_Channel_Base* ec, int validate_connection)
+: TAO_EC_Default_ProxyPushSupplier (ec, validate_connection)
+{
+ if (EC_TPC_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) EC_TPC_ProxyPushSupplier::CTOR (%@)\n", this));
+}
+
diff --git a/TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc b/TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc
index e6ccf146625..3c19e408e47 100644
--- a/TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc
+++ b/TAO/orbsvcs/orbsvcs/RTEvent_Serv.mpc
@@ -76,6 +76,11 @@ project(RTEvent_Serv) : orbsvcslib, core, rtevent_skel, svc_utils, messaging {
Event/EC_Trivial_Supplier_Filter.cpp
Event/EC_Type_Filter.cpp
Event/EC_UDP_Admin.cpp
+ Event/EC_TPC_Dispatching.cpp
+ Event/EC_TPC_Dispatching_Task.cpp
+ Event/EC_TPC_Factory.cpp
+ Event/EC_TPC_ProxyConsumer.cpp
+ Event/EC_TPC_ProxySupplier.cpp
}
Template_Files {
@@ -88,3 +93,4 @@ project(RTEvent_Serv) : orbsvcslib, core, rtevent_skel, svc_utils, messaging {
RTEvent_Serv.rc
}
}
+