diff options
author | Chris Cleeland <chris.cleeland@gmail.com> | 2005-08-25 16:08:55 +0000 |
---|---|---|
committer | Chris Cleeland <chris.cleeland@gmail.com> | 2005-08-25 16:08:55 +0000 |
commit | 532573fb2ac84cfcfc5330f32bfe9b4bacd876cd (patch) | |
tree | 8950566ebeafea59d4e7c49b898eb9f147eb373d | |
parent | 770f2877f8eda2bb427548a1b4509fcd9736f797 (diff) | |
download | ATCD-532573fb2ac84cfcfc5330f32bfe9b4bacd876cd.tar.gz |
Thu Aug 25 11:00:47 2005 Chris Cleeland <cleeland_c@ociweb.com>
Added RTEC TPC and Queue-Full action.
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 } } + |