From 81e0a245decc09943832d52cb9f419e3f8f355b7 Mon Sep 17 00:00:00 2001 From: irfan Date: Mon, 7 Jul 2003 23:58:34 +0000 Subject: ChangeLogTag: Mon Jul 07 18:00:38 2003 Irfan Pyarali --- TAO/ChangeLog | 543 ++- TAO/docs/releasenotes/index.html | 79 + TAO/docs/releasenotes/orbcore.html | 30 +- TAO/orbsvcs/orbsvcs/AV/TCP.cpp | 18 +- .../PortableGroup/UIPMC_Connection_Handler.cpp | 54 +- .../PortableGroup/UIPMC_Connection_Handler.h | 6 + .../orbsvcs/PortableGroup/UIPMC_Connector.cpp | 25 +- .../orbsvcs/PortableGroup/UIPMC_Transport.cpp | 36 +- .../orbsvcs/PortableGroup/UIPMC_Transport.h | 22 +- .../orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp | 8 +- TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp | 267 +- TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp | 12 +- TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h | 8 +- .../orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp | 51 +- .../orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h | 6 + TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp | 198 +- TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp | 95 +- TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h | 25 +- TAO/tao/Acceptor_Impl.cpp | 81 +- TAO/tao/Asynch_Reply_Dispatcher_Base.cpp | 2 +- TAO/tao/Asynch_Reply_Dispatcher_Base.i | 6 +- TAO/tao/Cache_Entries.cpp | 15 +- TAO/tao/Connect_Strategy.cpp | 23 - TAO/tao/Connect_Strategy.h | 10 - TAO/tao/Connection_Handler.cpp | 412 +- TAO/tao/Connection_Handler.h | 41 +- TAO/tao/Connection_Handler.inl | 15 +- TAO/tao/Connector_Impl.cpp | 9 +- TAO/tao/IIOP_Connection_Handler.cpp | 60 +- TAO/tao/IIOP_Connection_Handler.h | 8 +- TAO/tao/IIOP_Connector.cpp | 321 +- TAO/tao/IIOP_Transport.cpp | 116 +- TAO/tao/IIOP_Transport.h | 15 +- TAO/tao/Invocation.cpp | 13 +- TAO/tao/LF_CH_Event.cpp | 14 +- TAO/tao/LF_CH_Event.h | 22 +- TAO/tao/LF_Connect_Strategy.cpp | 5 +- TAO/tao/LF_Event.h | 3 - TAO/tao/Makefile.bor | 1 - TAO/tao/Makefile.tao | 293 +- TAO/tao/Notify_Handler.cpp | 116 - TAO/tao/Notify_Handler.h | 99 - TAO/tao/PortableServer/AMH_Response_Handler.cpp | 23 +- TAO/tao/Strategies/DIOP_Acceptor.cpp | 15 +- TAO/tao/Strategies/DIOP_Connection_Handler.cpp | 85 +- TAO/tao/Strategies/DIOP_Connection_Handler.h | 6 + TAO/tao/Strategies/DIOP_Connector.cpp | 24 +- TAO/tao/Strategies/DIOP_Transport.cpp | 199 +- TAO/tao/Strategies/DIOP_Transport.h | 21 +- TAO/tao/Strategies/SCIOP_Connection_Handler.cpp | 51 +- TAO/tao/Strategies/SCIOP_Connection_Handler.h | 11 +- TAO/tao/Strategies/SCIOP_Connector.cpp | 281 +- TAO/tao/Strategies/SCIOP_Transport.cpp | 110 +- TAO/tao/Strategies/SCIOP_Transport.h | 22 +- TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp | 51 +- TAO/tao/Strategies/SHMIOP_Connection_Handler.h | 6 + TAO/tao/Strategies/SHMIOP_Connector.cpp | 116 +- TAO/tao/Strategies/SHMIOP_Transport.cpp | 54 +- TAO/tao/Strategies/SHMIOP_Transport.h | 15 +- TAO/tao/Strategies/UIOP_Connection_Handler.cpp | 57 +- TAO/tao/Strategies/UIOP_Connection_Handler.h | 6 + TAO/tao/Strategies/UIOP_Connector.cpp | 173 +- TAO/tao/Strategies/UIOP_Transport.cpp | 55 +- TAO/tao/Strategies/UIOP_Transport.h | 15 +- TAO/tao/TAO.dsp | 8 - TAO/tao/TAO_Static.dsp | 8 - TAO/tao/Thread_Lane_Resources.cpp | 55 +- TAO/tao/Thread_Per_Connection_Handler.cpp | 6 +- TAO/tao/Transport.cpp | 417 +- TAO/tao/Transport.h | 187 +- TAO/tao/Transport.inl | 25 +- TAO/tao/Transport_Cache_Manager.cpp | 38 +- TAO/tao/Transport_Cache_Manager.h | 22 +- TAO/tao/Transport_Cache_Manager.inl | 5 +- TAO/tao/Wait_On_Read.cpp | 6 +- TAO/tao/tao.mpc | 1 - .../Bug_1361_Regression/Bug_1361_Regression.dsw | 53 + TAO/tests/Bug_1361_Regression/client.dsp | 213 ++ TAO/tests/Bug_1361_Regression/server.dsp | 219 ++ TAO/tests/Bug_1361_Regression/shutdown.dsp | 193 + .../Connection_Failure/Connection_Failure.dsw | 29 + .../Connection_Failure/Connection_Failure.mpc | 9 + TAO/tests/Connection_Failure/Makefile | 700 ++++ TAO/tests/Connection_Failure/Makefile.bor | 7 + TAO/tests/Connection_Failure/README | 8 + TAO/tests/Connection_Failure/client.bor | 35 + TAO/tests/Connection_Failure/client.cpp | 45 + TAO/tests/Connection_Failure/client.dsp | 202 + TAO/tests/Connection_Failure/run_test.pl | 22 + TAO/tests/Connection_Failure/test.idl | 7 + TAO/tests/Connection_Timeout/client.cpp | 3 - TAO/tests/Connection_Timeout/client.dsp | 22 +- TAO/tests/MProfile_Connection_Timeout/client.dsp | 22 +- TAO/tests/MProfile_Connection_Timeout/server.dsp | 22 +- TAO/tests/MT_BiDir/client.dsp | 26 +- TAO/tests/MT_BiDir/server.dsp | 26 +- TAO/tests/Makefile | 1 + TAO/tests/Makefile.bor | 1 + TAO/tests/ORB_shutdown/server.dsp | 22 +- TAO/tests/README | 5 + TAO/tests/TAO_Tests.dsw | 4006 +++++++++++--------- 101 files changed, 6506 insertions(+), 4749 deletions(-) delete mode 100644 TAO/tao/Notify_Handler.cpp delete mode 100644 TAO/tao/Notify_Handler.h create mode 100644 TAO/tests/Bug_1361_Regression/Bug_1361_Regression.dsw create mode 100644 TAO/tests/Bug_1361_Regression/client.dsp create mode 100644 TAO/tests/Bug_1361_Regression/server.dsp create mode 100644 TAO/tests/Bug_1361_Regression/shutdown.dsp create mode 100644 TAO/tests/Connection_Failure/Connection_Failure.dsw create mode 100644 TAO/tests/Connection_Failure/Connection_Failure.mpc create mode 100644 TAO/tests/Connection_Failure/Makefile create mode 100644 TAO/tests/Connection_Failure/Makefile.bor create mode 100644 TAO/tests/Connection_Failure/README create mode 100644 TAO/tests/Connection_Failure/client.bor create mode 100644 TAO/tests/Connection_Failure/client.cpp create mode 100644 TAO/tests/Connection_Failure/client.dsp create mode 100755 TAO/tests/Connection_Failure/run_test.pl create mode 100644 TAO/tests/Connection_Failure/test.idl (limited to 'TAO') diff --git a/TAO/ChangeLog b/TAO/ChangeLog index 268faf6ee67..de88531b413 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,14 +1,543 @@ -Mon Jul 7 11:14:02 2003 Jeff Parsons +Mon Jul 07 18:00:38 2003 Irfan Pyarali - * TAO_IDL/be/be_visitor_structure/any_op_cs.cpp (visit_enum): + * The following changes utilize the new memory management mechanisms + of Event Handlers. Previously, both the connection handlers and + the transports had their own reference counting mechanism and + independent lifetimes. The reference counting was inadequate + since it was not originated at the Reactor and the independent + lifetimes unnecessarily completed protocol specific transport + code. - Fixed a cut and paste error that was causing the code generation - for the any operators in the stub source file to be skipped. Thanks - to for reporting the bug. + These changes couple the lifetime of the connection handler with + that of the transport and utilizes the reference count in the + base ACE_Event_Handler class. This allowed us to remove several + hacks throughout TAO code which were designed to prevent (or + delay) crashes. Several extra checks and unnecessary locks were + also removed. - * TAO_IDL/be/be_visitor_enum/any_op_cs.cpp: + All of the following protocols were updated: - Fixed cut and paste error in the explicit template instantiation. + - DIOP + - IIOP + - SCIOP + - SHMIOP + - SSLIOP + - UIOP + - UIPMC + + Fri Jun 20 19:45:07 2003 Irfan Pyarali + + * tao\Connection_Handler: + + - Removed the incr_refcount() and decr_refcount() methods and + the related and members. + Also removed any explicit reference counting since now the + Reactor framework will handle this correctly. + + - Removed all asserts for a valid since now the + lifetime of the handler and the transport are the same. + + - Removed connection_close_wait() since this state is no longer + needed. + + - handle_close_eh() is no longer required since we no longer + rely on the Reactor calling handle_close(). + + - Moved the call to release_os_resources() from decr_refcount() + to the destructor. + + - Mega-simplified transport() method since the transport will + only be set once. + + - Call to Transport::send_connection_closed_notifications() was + moved to Connection_Handler::close_connection_eh() to ensure it + gets called in all cases when the handler is closed. + + - close_connection_eh() was also super-simplified. Now it + simply purges the handler from the connection cache and removes + the handler from the Reactor. + + - Made the destructor public since this class is no longer + (directly) reference counted. + + - is_finalized() was renamed to is_closed(). + + - is_open() and is_connecting() were added to check the status + of the connection handler. + + * tao\IIOP_Connection_Handler: + + - Added close() method that will be called by the Acceptor or + Connector when connection establishment fails. + + - No need to reference count the transport. Handlers and + transports now have the same lifespan. Transport in created in + the constructor and deleted in the destructor. + + - handle_input() and handle_output() intercept any errors from + handle_input_eh() and handle_output_eh() respectively and call + close_connection(). We no longer rely on handle_close(). + + - Assert that handle_close() no longer gets called. + + - Added handle_timeout(). We don't use this upcall for I/O. + This is only used by the Connector to indicate that the + connection timedout. Therefore, we should call close(). + + - The unused constructor should assert(0). + + * tao\Transport: + + - The Transport class no longer needs to inherit from + TAO_Synch_Refcountable. The reference counting is provided by + the Event_Handler class. + + - Replaced the _duplicate() and release() methods with + add_reference() and remove_reference() methods. This matches + the signature of the reference counting methods on the base + Event_Handler class. + + - Changed provide_handler() to simply provide the related + connection handler. + + - register_handler() was made virtual and register_handler_i() + was removed since there was no locking required. Same was done + for recv() and send(). + + - Removed: + + close_connection_shared() + close_connection_no_purge() + close_connection_i(), + connection_handler_closing() + check_event_handler_i() + invalidate_event_handler_i() + + since they were no longer needed. + + - Renamed handle_input_i() to handle_input(). + + - Made send_connection_closed_notifications() public. + + - No need for: + + send_message_block_chain() + send_message_shared() + schedule_output_i() + drain_queue_helper() + handle_timeout() + check_buffering_constraints_i() + notify_reactor() + + to call check_event_handler_i() since the handler is always + valid. + + - No need for to call send_connection_closed_notifications() in + case of errors since it will get called when the handler is + closed. + + - No need for process_parsed_messages() to do any explicit + reference counting since now the Reactor framework will handle + this correctly. + + - No need for notify_reactor() to create a Notify_Handler. The + Reactor framework already does the proper reference counting for + notifications. + + * tao\IIOP_Transport: + + - invalidate_event_handler_i() no longer needed. + + - Override send() and recv() instead of send_i() and recv_i(). + + - No need for reference counting the connection handler since + the lifespan of the connection handler is tied to the lifespan + of the transport. + + - register_handler_i() no longer needed. + + - No need for: + + send_request() + send_message_shared() + tear_listen_point_list() + get_listen_point() + + to call check_event_handler_i() since the handler is always + valid. + + * tao\Acceptor_Impl.cpp (activate_svc_handler): + + Made several changes to this method. Now the sequence is: + + - At the start of the method, the service handler has been + created and the new connection has been accepted. #REFCOUNT# is + one at this point. + + - Cache handler: If successful, #REFCOUNT# is two at this + point. If failure, call close on handler. + + - Activate/register handler: If successful, #REFCOUNT# is three + at this point. We can let go of our reference. If failure, + remove handler from cache and call close on handler. + + - Success completion of method: #REFCOUNT# is two at this point. + + * tao\IIOP_Connector.cpp (make_connection): + + Made several changes to this method. Now the sequence is: + + - The connect() method creates the service handler and bumps the + #REFCOUNT# up one extra. There are three possibilities from + calling connect(): (a) connection succeeds immediately - in this + case, the #REFCOUNT# on the handler is two; (b) connection + completion is pending - in this case, the #REFCOUNT# on the + handler is also two; (c) connection fails immediately - in this + case, the #REFCOUNT# on the handler is one since close() gets + called on the handler. + + - The extra reference count in + TAO_Connect_Creation_Strategy::make_svc_handler() is needed in + the case when connection completion is pending and we are going + to wait on a variable in the handler to change, signifying + success or failure. Note, that this increment cannot be done + once the connect() returns since this might be too late if + another thread picks up the completion and potentially deletes + the handler before we get a chance to increment the reference + count. + + - If there is no immediate result, wait for completion. No need + to specify timeout to wait() since the correct timeout was + passed to the Connector. The Connector will close the handler in + the case of timeouts, so the event will complete (either success + or failure) within timeout. + + - When the wait completes, check if the handler has been closed. + Irrespective of success or failure, remove the #REFCOUNT# + added for waiting. + + - There are three possibilities when wait() returns: (a) + connection succeeded; (b) connection failed; (c) wait() failed + because of some other error. It is easy to deal with (a) and + (b). (c) is tricky since the connection is still pending and + may get completed by some other thread. The following deals + with (c). + + * In case of failure and close() has not be called, first + cancel from connector. Then double check to make sure the + handler has not been closed yet. This double check is required + to ensure that the connection handler was not closed yet by some + other thread since it was still registered with the connector. + Once connector.cancel() has been processed, we are assured that + the connector will no longer open/close this handler. + + * If closed, there is nothing to do. + + * If the handler has been opened, some other thread was able to + open the handler even though wait failed for this thread. Reset + to zero. + + * If the handler is still connecting, forcefully close() the + handler. + + - If the connection has be successfully connected, add the + handler to connection cache. + + - Failure in adding to cache, close the handler. + + - If the wait strategy wants us to be registered with the reactor + then we do so. If registeration is required and it succeeds, + #REFCOUNT# becomes two. + + - In case of reactor registration failures, purge from the + connection cache and close the handler. + + - In case of success, handover the transport pointer to the + Invocation class. + + * tao\Connector_Impl.cpp (make_svc_handler): + + We add to the #REFCOUNT# since the Connector needs this. See + Connector::make_connection() for details. + + * tao\Transport_Cache_Manager (close): + + Previously, close() was returning a handle set and a set of + event handlers. This was changed such the only a set of + connection handlers is returned since the previous parameters + are no longer necessary. + + Also in purge(), there is no need to actually purge the handler + since they will be purged when the handlers close. This also + removes the need for Transport::close_connection_no_purge(). + Transport_Cache_Manager no longer needs to be friends with the + Transport. + + * tao\Thread_Lane_Resources.cpp (finalize): + + We now close the transport cache and return the handlers that + were still registered. The cache will decrease the #REFCOUNT# + on the handler when it removes the handler from cache. However, + #REFCOUNT# is increased when the handler is placed in the + handler set. Then we go through the handler set, closing the + connections and removing the references. Finally the connection + is closed. There is also a potential removal from the Reactor. + Finally, the #REFCOUNT# related to the handler set decreases. + + * tao\Notify_Handler: + + These files are no longer required since the Reactor framework + does the correct reference counting for notifications. + + * tao\LF_CH_Event: + * tao\LF_Event: + + Removed the LFS_CONNECTION_CLOSE_WAIT state since it is no + longer needed. + + * tao\Connect_Strategy: + + Removed Connect_Strategy::post_failed_connect() since + *_Connector::make_connection() now does the right thing. + + * tao\Asynch_Reply_Dispatcher_Base.cpp: + * tao\Asynch_Reply_Dispatcher_Base.i: + * tao\Cache_Entries.cpp: + * tao\Invocation.cpp: + * tao\Transport.cpp: + * tao\Notify_Handler.cpp: + * tao\Thread_Per_Connection_Handler.cpp: + * tao\PortableServer\AMH_Response_Handler.cpp: + + Replace calls to Transport::_duplicate() and + Transport::release() with new Transport::add_handler() and + Transport::remove_handler() methods respectively. + + * tests\TAO_Tests.dsw: + + Added several missing tests: + + - AMH_Exceptions_Test + - AMH_Oneway_Test + - Abstract Interface + - Bug_1361_Regression + - Bug_1482_Regression + - Collocation_Test + - Connect_Strategy_Test + - Connection_Timeout + - File_IO + - MProfile_Connection_Timeout + - MT_BiDir + - Manipulation + - Muxed_GIOP_Versions + - Nested_Upcall_Crash + - No_Server_MT_Connect_Test + - ORB_shutdown + - Objref_Sequence_Test + - Oneway_Buffering + - Stack_Recursion + - Strategies + - Two_Objects + + * tao\Makefile.bor: + * tao\Makefile.tao: + * tao\TAO.dsp: + * tao\TAO_Static.dsp: + * tao\tao.mpc: + + Removed Notify_Handler* from project/makefiles. + + * tests\Connection_Timeout\client.dsp: + * tests\MProfile_Connection_Timeout\client.dsp: + * tests\MProfile_Connection_Timeout\server.dsp: + * tests\MT_BiDir\client.dsp: + * tests\MT_BiDir\server.dsp: + * tests\ORB_shutdown\server.dsp: + + Fixed the above project files. + + * tests\Bug_1361_Regression\Bug_1361_Regression.dsw: + * tests\Bug_1361_Regression\client.dsp: + * tests\Bug_1361_Regression\server.dsp: + * tests\Bug_1361_Regression\shutdown.dsp: + + New project files. + + Tue Jun 24 21:46:13 2003 Irfan Pyarali + + * tao\Strategies\DIOP_Connection_Handler: + * tao\Strategies\SCIOP_Connection_Handler: + * tao\Strategies\SHMIOP_Connection_Handler: + * tao\Strategies\UIOP_Connection_Handler: + * orbsvcs\orbsvcs\SSLIOP\SSLIOP_Connection_Handler: + + - Constructor: Removed code to release the transport. Lifetimes + of transports and connection handlers are now coupled. + + - Destructor: Delete the transport. + + - handle_input(), handle_output(): Intercept any errors from + handle_input_eh() and handle_output_eh() respectively and call + close_connection(). We no longer rely on handle_close(). + + - handle_close(): Assert that this method no longer gets called. + + - handle_timeout(): Added this method. We don't use this upcall + for I/O. This is only used by the Connector to indicate that + the connection timedout. Therefore, we should call close(). + + - close(): Added this method that will be called by the Acceptor + or Connector when connection establishment fails. + + - The unused constructor should assert(0). + + * orbsvcs\orbsvcs\SSLIOP\IIOP_SSL_Connection_Handler: + + - Constructor: Replaced the code to release the transport with + explicit deletion. Lifetimes of transports and connection + handlers are now coupled. + + - The unused constructor should assert(0). + + * tao\Strategies\DIOP_Transport: + * tao\Strategies\SCIOP_Transport: + * tao\Strategies\SHMIOP_Transport: + * tao\Strategies\UIOP_Transport: + * orbsvcs\orbsvcs\SSLIOP\SSLIOP_Transport: + + - Constructor: No need to manage reference count on the + connection handler. Lifetimes of transports and connection + handlers are now coupled. + + - Destructor: Removed the assert for the connection handler. + + - send(), recv(): send_i() and recv_i() were renamed send() and + recv() respectively since locks are no longer required while + sending or receiving. + + - handle_input(): handle_input_i() was renamed to + handle_input(). + + - register_handler(): No longer required since the base class + does the right thing. + + - invalidate_event_handler_i(): This is no longer required. + + * orbsvcs\orbsvcs\SSLIOP\SSLIOP_Transport: + + No need for acquiring and calling + check_event_handler_i() in tear_listen_point_list() and + get_listen_point() since is now always + valid for the lifetime of the transport. + + * tao\Strategies\DIOP_Transport: + + - Removed commented out code. + + - Renamed register_handler_i() to register_handler(). + + * tao\Strategies\SCIOP_Transport: + + - send_request(), get_listen_point(), tear_listen_point_list(): + Removed guard and check for valid connection handler. + + - send_message_shared(): Removed check for valid connection + handler. + + * orbsvcs\orbsvcs\SSLIOP\IIOP_SSL_Transport: + + Rename handle_input_i() to handle_input(). + + * tao\Strategies\SCIOP_Connector.cpp (make_connection): + * tao\Strategies\UIOP_Connector.cpp (make_connection): + * orbsvcs\orbsvcs\SSLIOP\IIOP_SSL_Connector.cpp (make_connection): + * orbsvcs\orbsvcs\SSLIOP\SSLIOP_Connector.cpp (ssliop_connect): + + Made this method similar to IIOP_Connector::make_connection(). + + * tao\Strategies\SHMIOP_Connector.cpp (make_connection): + + Made this method similar to IIOP_Connector::make_connection() + except that the connects are always blocking. + + * tao\Strategies\DIOP_Connector.cpp (make_connection): + + - Replaced decr_refcount() with remove_reference() and + duplicate() with add_reference() respectively. + + Wed Jun 25 15:56:14 2003 Irfan Pyarali + + * tao\Strategies\DIOP_Acceptor: + + Revised the management of the connection handler. Replaced the + call to handle_close() with call to remove_reference(). + + Thu Jun 26 19:34:26 2003 Irfan Pyarali + + * tao\Strategies\DIOP_Acceptor.cpp (close): + + Added DONT_CALL mask to the remove_handler() call so that + handle_close() is not called anymore. + + Mon Jun 30 20:46:22 2003 Irfan Pyarali + + * orbsvcs\orbsvcs\PortableGroup\UIPMC_Connection_Handler: + * orbsvcs\orbsvcs\PortableGroup\UIPMC_Connector.cpp: + * orbsvcs\orbsvcs\PortableGroup\UIPMC_Transport: + + DIOP and UIPMC are very similar. Therefore, similar changes + were made. + + * tests\Connection_Failure: + + New test added that checks connection failures by connecting to + a non-existent object. + + The following files were added: + + - tests\Connection_Failure\Connection_Failure.dsw + - tests\Connection_Failure\Connection_Failure.mpc + - tests\Connection_Failure\Makefile + - tests\Connection_Failure\Makefile.bor + - tests\Connection_Failure\README + - tests\Connection_Failure\client.bor + - tests\Connection_Failure\client.cpp + - tests\Connection_Failure\client.dsp + - tests\Connection_Failure\run_test.pl + - tests\Connection_Failure\test.idl + + and the following were modified: + + - tests\Makefile + - tests\Makefile.bor + - tests\TAO_Tests.dsw + - tests\README + - $ACE_ROOT\bin\tao_orb_tests.lst + + Thu May 15 19:46:49 2003 Irfan Pyarali + + * TAO/orbsvcs/orbsvcs/AV/TCP.cpp: + * TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp: + * TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp: + * TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp: + * TAO/tao/IIOP_Connector.cpp: + * TAO/tao/Strategies/DIOP_Connector.cpp: + * TAO/tao/Strategies/SHMIOP_Connector.cpp: + * TAO/tao/Strategies/UIOP_Connector.cpp: + + Fixed Connector related template instantiations. + + Thu May 22 14:13:37 2003 Irfan Pyarali + + * Merged Reactor_RefCount branch with the main truck since all ACE + level changes are now complete. New branch is + Reactor_RefCount_1. + + Tue May 27 19:59:25 2003 Irfan Pyarali + + * Merged Reactor_RefCount_1 branch with the main truck to avail + new changes by Bala to the TAO connection handlers. New branch + is Reactor_RefCount_2. Mon Jul 07 07:46:00 2003 Justin Michel diff --git a/TAO/docs/releasenotes/index.html b/TAO/docs/releasenotes/index.html index 24ae0856c73..f4c6397c5d4 100644 --- a/TAO/docs/releasenotes/index.html +++ b/TAO/docs/releasenotes/index.html @@ -20,6 +20,9 @@ href="http://www.cs.wustl.edu/~schmidt/TAO.html">TAO:
    +
  • +ACE Wrappers
  • +
  • IDL Compiler
  • @@ -156,6 +159,82 @@ A complete list of all modifications to TAO is available in the ACE Wrappers +

    Current status: (As of July 07, 2003.) +

      +
    • + +The following changes are related to improving memory management of +Event Handlers when they interact with Reactors (and Timer Queues). +When a handler is registered with the Reactor, the Reactor increments +the reference count on the handler. The Reactor also increments this +reference count when making upcalls on the handler. The reference +count is decremented when an upcall completes or when the handler is +removed from the Reactor.

      + +This mechanism is similar to what happens between POAs and Servants +and it allows for the safe deletion of handlers. This mechanism is +particularly need for multi-threaded applications that can have +multiple threads executing upcalls on a handler that needs to be +shutdown in a safe manner. The following illustrates an example of +how this mechanism works:

      + +

        +
      • When a handler is created, it reference count is one. + +
      • After the handler is registered with the Reactor, it reference +count becomes two. + +
      • At this point, the handler creator can let go of the handler +reference, bringing down the reference count to one. + +
      • For each thread executing upcalls on the handler, the Reactor +increments the reference count by one. So if three threads were +simultaneously making upcalls on a handler, the reference count would +be four. + +
      • Assuming an external event (and thread) decides to close the +handler. It simply removes the handler from the Reactor. This +decreases the reference count to three. + +
      • As each thread completes their upcall, the reference reduces. + +
      • Once the final thread exits the upcall, the reference reaches +zero, and the handler is finally deleted. + +

      + +This mechanism ensures that the handler is not deleted until the final +upcall thread exits the handler.

      + +Reference counting on handlers is optional and is disabled by default. +To enable reference counting on a handler, reset its reference +counting policy to "ENABLED".

      + +To facilitate reference counting of handlers, an ACE_Event_Handler_var +class was added. This class is akin to the +PortableServer::ServantBase_var class.

      + +Similar reference counting related changes were made to the Timer +Queues so that handlers can be used in a thread safe manner with the +queues.

      + +The Connector implementation was completely revised to utilize the new +memory management mechanisms and remove existing concurrency bugs.

      + +Several new examples/tests were added: +Reference_Counted_Event_Handler_Test, +MT_Reference_Counted_Event_Handler_Test, +MT_Reference_Counted_Notify_Test, Timer_Queue_Reference_Counting_Test, +NonBlocking_Conn_Test, Reactor_Registration_Test, WFMO_Reactor_Test, +Timer_Cancellation_Test + +

    • +
    +
    +
+

IDL Compiler

Point of contact: diff --git a/TAO/docs/releasenotes/orbcore.html b/TAO/docs/releasenotes/orbcore.html index 316de23b0e0..9a5c18c6a37 100644 --- a/TAO/docs/releasenotes/orbcore.html +++ b/TAO/docs/releasenotes/orbcore.html @@ -48,13 +48,6 @@ Point of contact: Balchandran Natarajan perfect. There have been reported interoperability problems.

-

  • There is a known race condition with the TP_Reactor. It - kicks up when a client running multiple threads, sees a remote - server crash or do an abnormal exit . The details of this bug - are documented - here.

  • -
  • The multi-profile parsing code in TAO hasnt been tested well and we have been able to identify some issues with it. The details are documented in our Balchandran Natarajan

    Ongoing Work:

      -
    • Work is on to write a new - reactor framework for TAO which overcomes some of the - problems associated with the new reactor

    • -
    • Support new concurrency models, e.g., Thread-per-Request, etc..

    • @@ -204,6 +192,24 @@ Point of contact: Balchandran Natarajan

      +
    • Several changes were made to utilize the new memory management mechanisms + of Event Handlers in TAO. Previously, both the connection handlers and + the transports had their own reference counting mechanism and + independent lifetimes. The reference counting was inadequate + since it was not originated at the Reactor and the independent + lifetimes unnecessarily completed protocol specific transport + code.

      + + The changes couple the lifetime of the connection handler with + that of the transport and utilizes the reference count in the + base ACE_Event_Handler class. This allowed us to remove several + hacks throughout TAO code which were designed to prevent (or + delay) crashes. Several extra checks and unnecessary locks were + also removed.

      + + All of the following protocols were updated: DIOP, IIOP, + SCIOP, SHMIOP, SSLIOP, UIOP, UIPMC. +

    diff --git a/TAO/orbsvcs/orbsvcs/AV/TCP.cpp b/TAO/orbsvcs/orbsvcs/AV/TCP.cpp index 7aa78c6e87e..885ec2936e6 100644 --- a/TAO/orbsvcs/orbsvcs/AV/TCP.cpp +++ b/TAO/orbsvcs/orbsvcs/AV/TCP.cpp @@ -692,25 +692,11 @@ TAO_AV_TCP_Flow_Handler::handle_timeout (const ACE_Time_Value &tv, #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) template class ACE_Acceptor; template class ACE_Connector; - -template class ACE_Svc_Tuple; -template class ACE_Map_Entry *>; -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator *, TAO_SYNCH_RW_MUTEX>; - +template class ACE_NonBlocking_Connect_Handler; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) #pragma instantiate ACE_Acceptor #pragma instantiate ACE_Connector - -#pragma instantiate ACE_Svc_Tuple -#pragma instantiate ACE_Map_Entry *> -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator *, TAO_SYNCH_RW_MUTEX> - +#pragma instantiate ACE_NonBlocking_Connect_Handler #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ ACE_STATIC_SVC_DEFINE (TAO_AV_TCP_Flow_Factory, diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp index 25b56919781..21e73eb6a08 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.cpp @@ -36,7 +36,7 @@ TAO_UIPMC_Connection_Handler::TAO_UIPMC_Connection_Handler (ACE_Thread_Manager * // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -53,8 +53,7 @@ TAO_UIPMC_Connection_Handler::TAO_UIPMC_Connection_Handler (TAO_ORB_Core *orb_co TAO_UIPMC_Transport(this, orb_core, 0)); // store this pointer (indirectly increment ref count) - this->transport(specific_transport); - TAO_Transport::release (specific_transport); + this->transport (specific_transport); } @@ -68,6 +67,8 @@ TAO_UIPMC_Connection_Handler::~TAO_UIPMC_Connection_Handler (void) } else this->udp_socket_.close (); + + delete this->transport (); } ACE_HANDLE @@ -182,20 +183,57 @@ TAO_UIPMC_Connection_Handler::close_connection (void) int TAO_UIPMC_Connection_Handler::handle_input (ACE_HANDLE h) { - return this->handle_input_eh (h, this); + int result = + this->handle_input_eh (h, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int TAO_UIPMC_Connection_Handler::handle_output (ACE_HANDLE handle) { - return this->handle_output_eh (handle, this); + int result = + this->handle_output_eh (handle, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int -TAO_UIPMC_Connection_Handler::handle_close (ACE_HANDLE handle, - ACE_Reactor_Mask rm) +TAO_UIPMC_Connection_Handler::handle_timeout (const ACE_Time_Value &, + const void *) { - return this->handle_close_eh (handle, rm, this); + // We don't use this upcall for I/O. This is only used by the + // Connector to indicate that the connection timedout. Therefore, + // we should call close(). + return this->close (); +} + +int +TAO_UIPMC_Connection_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) +{ + ACE_ASSERT (0); + return 0; +} + +int +TAO_UIPMC_Connection_Handler::close (u_long) +{ + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); + this->transport ()->remove_reference (); + return 0; } int diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h index 084a612549f..77948dc6ad0 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connection_Handler.h @@ -93,6 +93,10 @@ public: // @@ Frank: Similar to open, but called on server virtual int open_server (void); + /// Close called by the Acceptor or Connector when connection + /// establishment fails. + int close (u_long = 0); + //@{ /** @name Event Handler overloads */ @@ -101,6 +105,8 @@ public: virtual int handle_input (ACE_HANDLE); virtual int handle_output (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + virtual int handle_timeout (const ACE_Time_Value ¤t_time, + const void *act = 0); virtual int open (void *); //@} diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp index af62d549d4e..39aae932f98 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Connector.cpp @@ -19,32 +19,18 @@ ACE_RCSID(tao, UIPMC_Connector, "$Id$") #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) - -template class ACE_Svc_Tuple; -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Entry*>; +template class ACE_NonBlocking_Connect_Handler; template class ACE_Map_Entry; - -template class ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX>; template class ACE_Hash_Map_Iterator_Base_Ex < ACE_INET_Addr, TAO_UIPMC_Connection_Handler *, ACE_Hash < ACE_INET_Addr >, ACE_Equal_To < ACE_INET_Addr >, ACE_Null_Mutex >; template class ACE_Hash_Map_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex>; template class ACE_Hash_Map_Reverse_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex>; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Svc_Tuple -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Entry*> +#pragma instantiate ACE_NonBlocking_Connect_Handler #pragma instantiate ACE_Map_Entry; - -#pragma instantiate ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX> - #pragma instantiate ACE_Hash_Map_Iterator_Base_Ex < ACE_INET_Addr,TAO_UIPMC_Connection_Handler *, ACE_Hash < ACE_INET_Addr >, ACE_Equal_To < ACE_INET_Addr >, ACE_Null_Mutex > #pragma instantiate ACE_Hash_Map_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex> #pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex> @@ -81,8 +67,7 @@ TAO_UIPMC_Connector::close (void) while (!iter.done ()) { - // Delete the connection handler - (*iter).int_id_->decr_refcount(); + (*iter).int_id_->remove_reference (); iter++; } @@ -170,8 +155,8 @@ TAO_UIPMC_Connector::make_connection (TAO_GIOP_Invocation *invocation, } // @@ Michael: We do not use traditional connection management. - - transport = TAO_Transport::_duplicate (svc_handler->transport ()); + svc_handler->add_reference (); + transport = svc_handler->transport (); return 0; } diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp index fdfa070c8a7..9b04d83c7bd 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.cpp @@ -73,14 +73,6 @@ TAO_UIPMC_Transport::TAO_UIPMC_Transport (TAO_UIPMC_Connection_Handler *handler, , connection_handler_ (handler) , messaging_object_ (0) { - if (connection_handler_ != 0) - { - // REFCNT: Matches one of - // TAO_Transport::connection_handler_close() or - // TAO_Transport::close_connection_shared. - this->connection_handler_->incr_refcount(); - } - // Use the normal GIOP object ACE_NEW (this->messaging_object_, TAO_GIOP_Message_Base (orb_core, @@ -274,9 +266,9 @@ TAO_UIPMC_Transport::write_unique_id (TAO_OutputCDR &miop_hdr, unsigned long uni } ssize_t -TAO_UIPMC_Transport::send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *) +TAO_UIPMC_Transport::send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *) { const ACE_INET_Addr &addr = this->connection_handler_->addr (); bytes_transferred = 0; @@ -455,9 +447,9 @@ TAO_UIPMC_Transport::send_i (iovec *iov, int iovcnt, ssize_t -TAO_UIPMC_Transport::recv_i (char *buf, - size_t len, - const ACE_Time_Value * /*max_wait_time*/) +TAO_UIPMC_Transport::recv (char *buf, + size_t len, + const ACE_Time_Value * /*max_wait_time*/) { ACE_INET_Addr from_addr; @@ -558,9 +550,9 @@ TAO_UIPMC_Transport::recv_i (char *buf, } int -TAO_UIPMC_Transport::handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time, - int /*block*/) +TAO_UIPMC_Transport::handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time, + int /*block*/) { // If there are no messages then we can go ahead to read from the // handle for further reading.. @@ -650,7 +642,7 @@ TAO_UIPMC_Transport::handle_input_i (TAO_Resume_Handle &rh, } int -TAO_UIPMC_Transport::register_handler_i (void) +TAO_UIPMC_Transport::register_handler (void) { // We never register register the handler with the reactor // as we never need to be informed about any incoming data, @@ -727,11 +719,3 @@ TAO_UIPMC_Transport::messaging_init (CORBA::Octet major, minor); return 1; } - -TAO_Connection_Handler * -TAO_UIPMC_Transport::invalidate_event_handler_i (void) -{ - TAO_Connection_Handler * eh = this->connection_handler_; - this->connection_handler_ = 0; - return eh; -} diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h index 35edbd6c41e..2678c92d575 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/UIPMC_Transport.h @@ -60,9 +60,9 @@ public: ~TAO_UIPMC_Transport (void); /// Look for the documentation in Transport.h. - virtual int handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time = 0, - int block = 0); + virtual int handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time = 0, + int block = 0); protected: /** @name Overridden Template Methods * @@ -72,22 +72,20 @@ protected: virtual ACE_Event_Handler * event_handler_i (void); virtual TAO_Connection_Handler *connection_handler_i (void); - virtual TAO_Connection_Handler * invalidate_event_handler_i (void); - virtual TAO_Pluggable_Messaging *messaging_object (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *max_wait_time); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time); /// Read len bytes from into buf. - virtual ssize_t recv_i (char *buf, - size_t len, - const ACE_Time_Value *s = 0); + virtual ssize_t recv (char *buf, + size_t len, + const ACE_Time_Value *s = 0); - virtual int register_handler_i (void); + virtual int register_handler (void); public: /// @@TODO: These methods IMHO should have more meaningful diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp index 239be1ba7b8..0ac94b6c5bc 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connection_Handler.cpp @@ -61,7 +61,7 @@ TAO_IIOP_SSL_Connection_Handler (ACE_Thread_Manager *t) // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -85,9 +85,11 @@ TAO_IIOP_SSL_Connection_Handler (TAO_ORB_Core *orb_core, s->ssliop_current.in (), 0)); - // store this pointer (indirectly increment ref count) + // Delete the transport with TAO_IIOP_Connection_Handler. + delete this->transport (); + + // store this pointer this->transport (specific_transport); - TAO_Transport::release (specific_transport); } TAO_IIOP_SSL_Connection_Handler:: diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp index d179fd9c574..f132379e7b5 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Connector.cpp @@ -31,13 +31,7 @@ template class TAO_Connect_Creation_Strategy; template class ACE_Strategy_Connector; template class ACE_Connect_Strategy; template class ACE_Connector; -template class ACE_Svc_Tuple; - -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Entry*>; -template class ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX>; +template class ACE_NonBlocking_Connect_Handler; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) @@ -46,17 +40,7 @@ template class ACE_Map_Reverse_Iterator #pragma instantiate ACE_Connect_Strategy #pragma instantiate ACE_Connector -#pragma instantiate ACE_Svc_Tuple - - -#pragma instantiate ACE_Connector -#pragma instantiate ACE_Creation_Strategy -#pragma instantiate ACE_Svc_Tuple -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Entry*> -#pragma instantiate ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX> +#pragma instantiate ACE_NonBlocking_Connect_Handler #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ @@ -164,25 +148,21 @@ TAO_IIOP_SSL_Connector::make_connection ( TAO_Transport_Descriptor_Interface *desc, ACE_Time_Value *max_wait_time) { - if (TAO_debug_level > 0) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) Connector::connect - ") - ACE_TEXT ("looking for IIOP connection.\n"))); - - - TAO_IIOP_Endpoint *iiop_endpoint = ACE_dynamic_cast (TAO_IIOP_Endpoint *, desc->endpoint ()); + if (iiop_endpoint == 0) + return -1; + + const ACE_INET_Addr &remote_address = + iiop_endpoint->object_addr (); + if (TAO_debug_level > 4) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) IIOP_SSL_Connector::connect ") ACE_TEXT ("making a new connection \n"))); - const ACE_INET_Addr &remote_address = - iiop_endpoint->object_addr (); - // Get the right synch options ACE_Synch_Options synch_options; @@ -191,103 +171,190 @@ TAO_IIOP_SSL_Connector::make_connection ( TAO_IIOP_SSL_Connection_Handler *svc_handler = 0; - // Active connect - int result = this->base_connector_.connect (svc_handler, - remote_address, - synch_options); - - if (result == -1 && errno == EWOULDBLOCK) - { - if (TAO_debug_level) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_SSL_Connector::make_connection(), " - "going to wait for connection completion on local" - "handle [%d]\n", - svc_handler->get_handle ())); - result = - this->active_connect_strategy_->wait (svc_handler, - max_wait_time); - - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_SSL_Connector::make_connection(), " - "wait done for handle[%d], result = %d\n", - svc_handler->get_handle (), result)); - } - } - - int status = - svc_handler->is_finalized (); - - // Reduce the refcount to the svc_handler that we have. The - // increment to the handler is done in make_svc_handler (). Now - // that we dont need the reference to it anymore we can decrement - // the refcount whether the connection is successful ot not. - long refcount = svc_handler->decr_refcount (); - - ACE_ASSERT (refcount >= 0); - ACE_UNUSED_ARG (refcount); - - if (TAO_debug_level > 0) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%P|%t) IIOP_SSL_Connector::connect ") - ACE_TEXT ("The result is <%d> \n"), result)); + // Connect. + int result = + this->base_connector_.connect (svc_handler, + remote_address, + synch_options); + + // The connect() method creates the service handler and bumps the + // #REFCOUNT# up one extra. There are three possibilities from + // calling connect(): (a) connection succeeds immediately - in this + // case, the #REFCOUNT# on the handler is two; (b) connection + // completion is pending - in this case, the #REFCOUNT# on the + // handler is also two; (c) connection fails immediately - in this + // case, the #REFCOUNT# on the handler is one since close() gets + // called on the handler. + // + // The extra reference count in + // TAO_Connect_Creation_Strategy::make_svc_handler() is needed in + // the case when connection completion is pending and we are going + // to wait on a variable in the handler to changes, signifying + // success or failure. Note, that this increment cannot be done + // once the connect() returns since this might be too late if + // another thread pick up the completion and potentially deletes the + // handler before we get a chance to increment the reference count. + + // No immediate result. Wait for completion. + if (result == -1 && errno == EWOULDBLOCK) + { + if (TAO_debug_level) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_SSL_Connector::make_connection(), " + "going to wait for connection completion on local" + "handle [%d]\n", + svc_handler->get_handle ())); + + // Wait for connection completion. No need to specify timeout + // to wait() since the correct timeout was passed to the + // Connector. The Connector will close the handler in the case + // of timeouts, so the event will complete (either success or + // failure) within timeout. + result = + this->active_connect_strategy_->wait (svc_handler, + 0); + + if (TAO_debug_level > 2) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_SSL_Connector::make_connection(), " + "wait done for handle[%d], result = %d\n", + svc_handler->get_handle (), result)); + } + + // There are three possibilities when wait() returns: (a) + // connection succeeded; (b) connection failed; (c) wait() + // failed because of some other error. It is easy to deal with + // (a) and (b). (c) is tricky since the connection is still + // pending and may get completed by some other thread. The + // following code deals with (c). + // Check if the handler has been closed. + int closed = + svc_handler->is_closed (); + + // In case of failures and close() has not be called. + if (result == -1 && + !closed) + { + // First, cancel from connector. + this->base_connector_.cancel (svc_handler); + + // Double check to make sure the handler has not been closed + // yet. This double check is required to ensure that the + // connection handler was not closed yet by some other + // thread since it was still registered with the connector. + // Once connector.cancel() has been processed, we are + // assured that the connector will no longer open/close this + // handler. + closed = + svc_handler->is_closed (); + + // If closed, there is nothing to do here. If not closed, + // it was either opened or is still pending. + if (!closed) + { + // Check if the handler has been opened. + int open = + svc_handler->is_open (); + + // Some other thread was able to open the handler even + // though wait failed for this thread. + if (open) + // Overwrite . + result = 0; + else + { + // Assert that it is still connecting. + ACE_ASSERT (svc_handler->is_connecting ()); + + // Force close the handler now. + svc_handler->close (); + } + } + } + } + + // Irrespective of success or failure, remove the extra #REFCOUNT#. + svc_handler->remove_reference (); + + // In case of errors. if (result == -1) { // Give users a clue to the problem. if (TAO_debug_level) { ACE_DEBUG ((LM_ERROR, - ACE_TEXT ("(%P|%t) %s:%u, connection to ") - ACE_TEXT ("%s:%d failed (%p)\n"), - __FILE__, - __LINE__, - iiop_endpoint->host (), - iiop_endpoint->port (), - ACE_TEXT ("errno"))); + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "connection to <%s:%d> failed (%p)\n", + iiop_endpoint->host (), iiop_endpoint->port (), + "errno")); } - (void) this->active_connect_strategy_->post_failed_connect (svc_handler, - status); - return -1; } - TAO_Transport *base_transport = - TAO_Transport::_duplicate (svc_handler->transport ()); + // At this point, the connection has be successfully connected. + // #REFCOUNT# is one. + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "new connection to <%s:%d> on Transport[%d]\n", + iiop_endpoint->host (), iiop_endpoint->port (), + svc_handler->peer ().get_handle ())); - // Add the handler to Cache. - // - // Note that the IIOP-only transport descriptor is used! + TAO_Transport *transport = + svc_handler->transport (); + + // Add the handler to Cache int retval = this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, - base_transport); + transport); - if (retval != 0 && TAO_debug_level > 0) + // Failure in adding to cache. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%P|%t) IIOP_SSL_Connector::connect ") - ACE_TEXT ("could not add the new connection to ") - ACE_TEXT ("Cache \n"))); + // Close the handler. + svc_handler->close (); + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "could not add the new connection to cache\n")); + } + + return -1; } // If the wait strategy wants us to be registered with the reactor - // then we do so. - retval = base_transport->wait_strategy ()->register_handler (); + // then we do so. If registeration is required and it succeeds, + // #REFCOUNT# becomes two. + retval = transport->wait_strategy ()->register_handler (); - if (retval != 0 && TAO_debug_level > 0) + // Registration failures. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_LIB_TEXT ("(%P|%t) IIOP_Connector::connect ") - ACE_LIB_TEXT ("could not add the new connection to reactor \n"))); + // Purge from the connection cache. + transport->purge_entry (); + + // Close the handler. + svc_handler->close (); + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "could not register the new connection in the reactor\n")); + } + + return -1; } // Handover the transport pointer to the Invocation class. - TAO_Transport *&transport = invocation->transport (); - - transport = base_transport; + TAO_Transport *&invocation_transport = + invocation->transport (); + invocation_transport = transport; return 0; } diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp index 8fbb1976ffa..09ba47f567d 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.cpp @@ -29,9 +29,9 @@ TAO_IIOP_SSL_Transport::~TAO_IIOP_SSL_Transport (void) } int -TAO_IIOP_SSL_Transport::handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time, - int block) +TAO_IIOP_SSL_Transport::handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time, + int block) { int result = 0; @@ -44,7 +44,7 @@ TAO_IIOP_SSL_Transport::handle_input_i (TAO_Resume_Handle &rh, return -1; return - this->TAO_IIOP_Transport::handle_input_i (rh, - max_wait_time, - block); + this->TAO_IIOP_Transport::handle_input (rh, + max_wait_time, + block); } diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h index 46d505776ab..dbc7e1f2356 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/IIOP_SSL_Transport.h @@ -41,7 +41,7 @@ class TAO_Resume_Handle; * sure that SSL session state from a previous connection is not * associated with the non-SSL connection handled by this handler. * - * However, this class overrides the handle_input_i() method to + * However, this class overrides the handle_input() method to * invalidate the current TSS SSL state during a standard IIOP * (insecure) upcall. This prevents SSL session state from a previous * SSL connection from being associated with non-SSL connections @@ -70,9 +70,9 @@ public: * Please check the documentation in "tao/Transport.h" for more * details. */ - virtual int handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time = 0, - int block = 0); + virtual int handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time = 0, + int block = 0); protected: /// Reference to the SSLIOP::Current object (downcast to gain access diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp index 88e147c21e8..80a09319539 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp @@ -38,7 +38,7 @@ TAO_SSLIOP_Connection_Handler::TAO_SSLIOP_Connection_Handler ( // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -63,12 +63,12 @@ TAO_SSLIOP_Connection_Handler::TAO_SSLIOP_Connection_Handler ( // store this pointer (indirectly increment ref count) this->transport (specific_transport); - TAO_Transport::release (specific_transport); } TAO_SSLIOP_Connection_Handler::~TAO_SSLIOP_Connection_Handler (void) { + delete this->transport (); } int @@ -175,20 +175,57 @@ TAO_SSLIOP_Connection_Handler::close_connection (void) int TAO_SSLIOP_Connection_Handler::handle_input (ACE_HANDLE h) { - return this->handle_input_eh (h, this); + int result = + this->handle_input_eh (h, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int TAO_SSLIOP_Connection_Handler::handle_output (ACE_HANDLE handle) { - return this->handle_output_eh (handle, this); + int result = + this->handle_output_eh (handle, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; +} + +int +TAO_SSLIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, + const void *) +{ + // We don't use this upcall for I/O. This is only used by the + // Connector to indicate that the connection timedout. Therefore, + // we should call close(). + return this->close (); } int -TAO_SSLIOP_Connection_Handler::handle_close (ACE_HANDLE handle, - ACE_Reactor_Mask rm) +TAO_SSLIOP_Connection_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) { - return this->handle_close_eh (handle, rm, this); + ACE_ASSERT (0); + return 0; +} + +int +TAO_SSLIOP_Connection_Handler::close (u_long) +{ + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); + this->transport ()->remove_reference (); + return 0; } int diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h index b034528ab69..fa395acbf74 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h @@ -66,6 +66,10 @@ public: virtual int open_handler (void *); //@} + /// Close called by the Acceptor or Connector when connection + /// establishment fails. + int close (u_long = 0); + //@{ /** @name Event Handler overloads */ @@ -74,6 +78,8 @@ public: virtual int handle_input (ACE_HANDLE); virtual int handle_output (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + virtual int handle_timeout (const ACE_Time_Value ¤t_time, + const void *act = 0); virtual int open (void *); //@} diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp index ae62a8ecb47..5a03189d3da 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connector.cpp @@ -31,13 +31,7 @@ template class TAO_Connect_Creation_Strategy; template class ACE_Strategy_Connector; template class ACE_Connect_Strategy; template class ACE_Connector; -template class ACE_Svc_Tuple; - -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Entry*>; -template class ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX>; +template class ACE_NonBlocking_Connect_Handler; template class ACE_Auto_Basic_Ptr; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) @@ -47,15 +41,7 @@ template class ACE_Auto_Basic_Ptr; #pragma instantiate ACE_Strategy_Connector #pragma instantiate ACE_Connect_Strategy #pragma instantiate ACE_Connector - -#pragma instantiate ACE_Creation_Strategy -#pragma instantiate ACE_Svc_Tuple - -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Entry*> -#pragma instantiate ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX> +#pragma instantiate ACE_NonBlocking_Connect_Handler #pragma instantiate ACE_Auto_Basic_Ptr #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ @@ -418,18 +404,18 @@ TAO_SSLIOP_Connector::ssliop_connect (TAO_SSLIOP_Endpoint *ssl_endpoint, int result = 0; TAO_SSLIOP_Connection_Handler *svc_handler = 0; - TAO_Transport *base_transport = 0; + TAO_Transport *transport = 0; // Check the Cache first for connections if (this->orb_core ()->lane_resources ().transport_cache ().find_transport ( desc, - base_transport) == 0) + transport) == 0) { if (TAO_debug_level > 2) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) SSLIOP_Connector::connect ") ACE_TEXT ("got existing transport[%d]\n"), - base_transport->id ())); + transport->id ())); } else { @@ -447,6 +433,17 @@ TAO_SSLIOP_Connector::ssliop_connect (TAO_SSLIOP_Endpoint *ssl_endpoint, // ACE_Strategy_Connector (the "base_connector_"). This is // thread-safe and reentrant, hence no synchronization is // necessary. + // + // The make_svc_handler() method creates the service handler and + // bumps the #REFCOUNT# up one extra. The extra reference count + // in TAO_Connect_Creation_Strategy::make_svc_handler() is + // needed in the case when connection completion is pending and + // we are going to wait on a variable in the handler to changes, + // signifying success or failure. Note, that this increment + // cannot be done once the connect() returns since this might be + // too late if another thread pick up the completion and + // potentially deletes the handler before we get a chance to + // increment the reference count. if (this->base_connector_.creation_strategy ()->make_svc_handler ( svc_handler) != 0) { @@ -520,55 +517,109 @@ TAO_SSLIOP_Connector::ssliop_connect (TAO_SSLIOP_Endpoint *ssl_endpoint, this->active_connect_strategy_->synch_options (max_wait_time, synch_options); - // We obtain the transport in the variable. - // As we know now that the connection is not available in - // Cache we can make a new connection + // We obtain the transport in the variable. As we + // know now that the connection is not available in Cache we can + // make a new connection result = this->base_connector_.connect (svc_handler, remote_address, synch_options); - // base_connector_.connect () will increment the handler's - // reference count once more. This is not needed as we already - // hold a reference to the handler, therefore we discard this - // second reference. - svc_handler->decr_refcount (); + // There are three possibilities from calling connect(): (a) + // connection succeeds immediately - in this case, the + // #REFCOUNT# on the handler is two; (b) connection completion + // is pending - in this case, the #REFCOUNT# on the handler is + // also two; (c) connection fails immediately - in this case, + // the #REFCOUNT# on the handler is one since close() gets + // called on the handler. - // We dont have to wait since we only use a blocked connect - // strategy. + // No immediate result. Wait for completion. if (result == -1 && errno == EWOULDBLOCK) { - if (TAO_debug_level) + if (TAO_debug_level > 2) ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - SSLIOP_Connector::ssliop_connect(), " "going to wait for connection completion on local" "handle [%d]\n", svc_handler->get_handle ())); + // Wait for connection completion. No need to specify timeout + // to wait() since the correct timeout was passed to the + // Connector. The Connector will close the handler in the case + // of timeouts, so the event will complete (either success or + // failure) within timeout. result = this->active_connect_strategy_->wait (svc_handler, - max_wait_time); + 0); if (TAO_debug_level > 2) { ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SSLIOP_Connector::ssliop_connect(), " + "TAO (%P|%t) - IIOP_Connector::make_connection" "wait done for handle[%d], result = %d\n", svc_handler->get_handle (), result)); } - } - int status = - svc_handler->is_finalized (); + // There are three possibilities when wait() returns: (a) + // connection succeeded; (b) connection failed; (c) wait() + // failed because of some other error. It is easy to deal with + // (a) and (b). (c) is tricky since the connection is still + // pending and may get completed by some other thread. The + // following code deals with (c). + + // Check if the handler has been closed. + int closed = + svc_handler->is_closed (); - // Reduce the refcount to the svc_handler that we have. The - // increment to the handler is done in make_svc_handler (). Now - // that we dont need the reference to it anymore we can decrement - // the refcount whether the connection is successful or not. - svc_handler->decr_refcount (); + // In case of failures and close() has not be called. + if (result == -1 && + !closed) + { + // First, cancel from connector. + this->base_connector_.cancel (svc_handler); + + // Double check to make sure the handler has not been closed + // yet. This double check is required to ensure that the + // connection handler was not closed yet by some other + // thread since it was still registered with the connector. + // Once connector.cancel() has been processed, we are + // assured that the connector will no longer open/close this + // handler. + closed = + svc_handler->is_closed (); + + // If closed, there is nothing to do here. If not closed, + // it was either opened or is still pending. + if (!closed) + { + // Check if the handler has been opened. + int open = + svc_handler->is_open (); + + // Some other thread was able to open the handler even + // though wait failed for this thread. + if (open) + // Overwrite . + result = 0; + else + { + // Assert that it is still connecting. + ACE_ASSERT (svc_handler->is_connecting ()); + + // Force close the handler now. + svc_handler->close (); + } + } + } + } + + // Irrespective of success or failure, remove the extra #REFCOUNT#. + svc_handler->remove_reference (); + // In case of errors. if (result == -1) { - if (TAO_debug_level > 0) + // Give users a clue to the problem. + if (TAO_debug_level) { char buffer [MAXHOSTNAMELEN + 6 + 1]; ssl_endpoint->addr_to_string (buffer, @@ -581,11 +632,11 @@ TAO_SSLIOP_Connector::ssliop_connect (TAO_SSLIOP_Endpoint *ssl_endpoint, ACE_TEXT ("errno"))); } - (void) this->active_connect_strategy_->post_failed_connect (svc_handler, - status); return -1; } + // At this point, the connection has be successfully connected. + // #REFCOUNT# is one. if (TAO_debug_level > 2) ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - SSLIOP_Connector::ssliop_connect(): " @@ -593,7 +644,8 @@ TAO_SSLIOP_Connector::ssliop_connect (TAO_SSLIOP_Endpoint *ssl_endpoint, remote_address.get_port_number (), svc_handler->peer ().get_handle ())); - base_transport = TAO_Transport::_duplicate (svc_handler->transport ()); + transport = + svc_handler->transport (); ssl_endpoint->qop (qop); ssl_endpoint->trust (trust); @@ -601,36 +653,54 @@ TAO_SSLIOP_Connector::ssliop_connect (TAO_SSLIOP_Endpoint *ssl_endpoint, // Add the handler to Cache int retval = - this->orb_core ()->lane_resources ().transport_cache ().cache_transport ( - desc, - base_transport); + this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, + transport); - if (retval != 0 && TAO_debug_level > 0) + // Failure in adding to cache. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%P|%t) SSLIOP_Connector::ssliop_connect ") - ACE_TEXT ("could not add the new connection to ") - ACE_TEXT ("cache.\n"))); + // Close the handler. + svc_handler->close (); + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "could not add the new connection to cache\n")); + } + + return -1; } // If the wait strategy wants us to be registered with the reactor - // then we do so. - int ret = base_transport->wait_strategy ()->register_handler (); + // then we do so. If registeration is required and it succeeds, + // #REFCOUNT# becomes two. + retval = transport->wait_strategy ()->register_handler (); - if (ret != 0 && TAO_debug_level > 0) + // Registration failures. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_LIB_TEXT ("(%P|%t) SSLIOP_Connector::connect ") - ACE_LIB_TEXT ("could not add the new connection ") - ACE_LIB_TEXT ("to reactor\n"))); + // Purge from the connection cache. + transport->purge_entry (); + + // Close the handler. + svc_handler->close (); + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "could not register the new connection in the reactor\n")); + } + + return -1; } } - // No need to _duplicate and release since base_transport - // is going out of scope. Transport now has control of - // base_transport. - TAO_Transport *&transport = invocation->transport (); - transport = base_transport; + // Handover the transport pointer to the Invocation class. + TAO_Transport *&invocation_transport = + invocation->transport (); + invocation_transport = transport; return 0; } diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp index 2035aee4208..4b6d332beee 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp @@ -29,23 +29,13 @@ TAO_SSLIOP_Transport::TAO_SSLIOP_Transport ( connection_handler_ (handler), messaging_object_ (0) { - if (connection_handler_ != 0) - { - // REFCNT: Matches one of - // TAO_Transport::connection_handler_close() or - // TAO_Transport::close_connection_shared. - this->connection_handler_->incr_refcount(); - } - // Use the normal GIOP object ACE_NEW (this->messaging_object_, TAO_GIOP_Message_Base (orb_core)); - } TAO_SSLIOP_Transport::~TAO_SSLIOP_Transport (void) { - ACE_ASSERT(this->connection_handler_ == 0); delete this->messaging_object_; } @@ -68,9 +58,9 @@ TAO_SSLIOP_Transport::messaging_object (void) } int -TAO_SSLIOP_Transport::handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time, - int block) +TAO_SSLIOP_Transport::handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time, + int block) { int result = 0; @@ -80,16 +70,16 @@ TAO_SSLIOP_Transport::handle_input_i (TAO_Resume_Handle &rh, if (result == -1) return -1; - return TAO_Transport::handle_input_i (rh, - max_wait_time, - block); + return TAO_Transport::handle_input (rh, + max_wait_time, + block); } ssize_t -TAO_SSLIOP_Transport::send_i (iovec *iov, - int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *max_wait_time) +TAO_SSLIOP_Transport::send (iovec *iov, + int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt, max_wait_time); @@ -101,9 +91,9 @@ TAO_SSLIOP_Transport::send_i (iovec *iov, } ssize_t -TAO_SSLIOP_Transport::recv_i (char *buf, - size_t len, - const ACE_Time_Value *max_wait_time) +TAO_SSLIOP_Transport::recv (char *buf, + size_t len, + const ACE_Time_Value *max_wait_time) { ssize_t n = this->connection_handler_->peer ().recv (buf, len, @@ -138,35 +128,6 @@ TAO_SSLIOP_Transport::recv_i (char *buf, return n; } - - - -int -TAO_SSLIOP_Transport::register_handler_i (void) -{ - if (TAO_debug_level > 4) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SSLIOP_Transport::register_handler %d\n", - this->id ())); - } - - // @@ It seems like this method should go away, the right reactor is - // picked at object creation time. - ACE_Reactor *r = this->orb_core_->reactor (); - - if (r == this->connection_handler_->reactor ()) - return 0; - - // Set the flag in the Connection Handler - this->ws_->is_registered (1); - - // Register the handler with the reactor. - return r->register_handler (this->connection_handler_, - ACE_Event_Handler::READ_MASK); -} - - int TAO_SSLIOP_Transport::send_request (TAO_Stub *stub, TAO_ORB_Core *orb_core, @@ -280,17 +241,6 @@ TAO_SSLIOP_Transport::tear_listen_point_list (TAO_InputCDR &cdr) // 1 this->bidirectional_flag (1); - // Just make sure that the connection handler is sane before we go - // head and do anything with it. - ACE_GUARD_RETURN (ACE_Lock, - ace_mon, - *this->handler_lock_, - -1); - - if (this->check_event_handler_i ("SSLIOP_Transport::tear_listen_point_list") - == -1) - return -1; - return this->connection_handler_->process_listen_point_list (listen_list); } @@ -373,17 +323,6 @@ TAO_SSLIOP_Transport::get_listen_point ( // Get the local address of the connection ACE_INET_Addr local_addr; { - // Just make sure that the connection handler is sane before we go - // head and do anything with it. - ACE_GUARD_RETURN (ACE_Lock, - ace_mon, - *this->handler_lock_, - -1); - - if (this->check_event_handler_i ("SSLIOP_Transport::get_listen_point") - == -1) - return -1; - if (this->connection_handler_->peer ().get_local_addr (local_addr) == -1) { @@ -436,11 +375,3 @@ TAO_SSLIOP_Transport::get_listen_point ( return 1; } - -TAO_Connection_Handler * -TAO_SSLIOP_Transport::invalidate_event_handler_i (void) -{ - TAO_Connection_Handler * eh = this->connection_handler_; - this->connection_handler_ = 0; - return eh; -} diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h index fb979d8798d..5f4c8ad6827 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h @@ -72,13 +72,13 @@ public: #endif - /// Overload of the handle_input_i () in the TAO_Transport + /// Overload of the handle_input () in the TAO_Transport /// class. This is required to set up the state guard. The /// thread-per-connection and wait on RW strategies call this - /// handle_input_i (). - virtual int handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time = 0, - int block = 0); + /// handle_input (). + virtual int handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time = 0, + int block = 0); protected: /** @name Overridden Template Methods * @@ -88,22 +88,19 @@ protected: virtual ACE_Event_Handler * event_handler_i (void); virtual TAO_Connection_Handler *connection_handler_i (void); - virtual TAO_Connection_Handler * invalidate_event_handler_i (void); virtual TAO_Pluggable_Messaging *messaging_object (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout = 0); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0); /// Read len bytes from into buf. - virtual ssize_t recv_i (char *buf, - size_t len, - const ACE_Time_Value *s = 0); - - virtual int register_handler_i (void); + virtual ssize_t recv (char *buf, + size_t len, + const ACE_Time_Value *s = 0); public: /// @@TODO: These methods IMHO should have more meaningful diff --git a/TAO/tao/Acceptor_Impl.cpp b/TAO/tao/Acceptor_Impl.cpp index d290d2f4157..dfd5849f1b0 100644 --- a/TAO/tao/Acceptor_Impl.cpp +++ b/TAO/tao/Acceptor_Impl.cpp @@ -87,6 +87,9 @@ template int TAO_Concurrency_Strategy::activate_svc_handler (SVC_HANDLER *sh, void *arg) { + // Here the service handler has been created and the new connection + // has been accepted. #REFCOUNT# is one at this point. + if (this->ACE_Concurrency_Strategy::activate_svc_handler (sh, arg) == -1) return -1; @@ -94,31 +97,93 @@ TAO_Concurrency_Strategy::activate_svc_handler (SVC_HANDLER *sh, // The service handler has been activated. Now cache the handler. if (sh->add_transport_to_cache () == -1) { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("(%P|%t) Could not add the handler to Cache \n"))); + // Adding to the cache fails, close the handler. + sh->close (); + + // #REFCOUNT# is zero at this point. + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("(%P|%t) Could not add the handler to Cache \n"))); + } + + return -1; } + // Registration with cache is successful, #REFCOUNT# is two at this + // point. + TAO_Server_Strategy_Factory *f = this->orb_core_->server_factory (); - // thread-per-connection concurrency model + int result = 0; + // Do we need to create threads? if (f->activate_server_connections ()) { + // Thread-per-connection concurrency model TAO_Thread_Per_Connection_Handler *tpch = 0; ACE_NEW_RETURN (tpch, TAO_Thread_Per_Connection_Handler (sh), -1); - return tpch->activate (f->server_connection_thread_flags (), - f->server_connection_thread_count ()); + result = tpch->activate (f->server_connection_thread_flags (), + f->server_connection_thread_count ()); + } + else + { + // Otherwise, it is the reactive concurrency model. We may want + // to register ourselves with the reactor. Call the register + // handler on the transport. + result = + sh->transport ()->register_handler (); } + if (result != -1) + { + // Activation/registration successful: the handler has been + // registered with either the Reactor or the + // Thread-per-Connection_Handler, and the Transport Cache. + // #REFCOUNT# is three at this point. + + // We can let go of our reference. + sh->transport ()->remove_reference (); + } + else + { + // Activation/registration failure. #REFCOUNT# is two at this + // point. + + // Remove from cache. + sh->transport ()->purge_entry (); + + // #REFCOUNT# is one at this point. + + // Close handler. + sh->close (); + + // #REFCOUNT# is zero at this point. + + if (TAO_debug_level > 0) + { + const char *error = 0; + if (f->activate_server_connections ()) + error = "could not activate new connection"; + else + error = "could not register new connection in the reactor"; + + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - Concurrency_Strategy::activate_svc_handler, " + "%s\n", error)); + } + + return -1; + } - // reactive concurrency model. We may want to register ourselves - // with the reactor. Call the register handler on the transport. - return sh->transport ()->register_handler (); + // Success: #REFCOUNT# is two at this point. + return result; } //////////////////////////////////////////////////////////////////////////////// diff --git a/TAO/tao/Asynch_Reply_Dispatcher_Base.cpp b/TAO/tao/Asynch_Reply_Dispatcher_Base.cpp index 21439f66a2a..47b6934cf0c 100644 --- a/TAO/tao/Asynch_Reply_Dispatcher_Base.cpp +++ b/TAO/tao/Asynch_Reply_Dispatcher_Base.cpp @@ -39,7 +39,7 @@ TAO_Asynch_Reply_Dispatcher_Base::~TAO_Asynch_Reply_Dispatcher_Base (void) if (this->transport_ != 0) { this->transport_->idle_after_reply (); - TAO_Transport::release (this->transport_); + this->transport_->remove_reference (); } } diff --git a/TAO/tao/Asynch_Reply_Dispatcher_Base.i b/TAO/tao/Asynch_Reply_Dispatcher_Base.i index 2de4ec8c3ea..232f938f7ff 100644 --- a/TAO/tao/Asynch_Reply_Dispatcher_Base.i +++ b/TAO/tao/Asynch_Reply_Dispatcher_Base.i @@ -4,9 +4,11 @@ ACE_INLINE void TAO_Asynch_Reply_Dispatcher_Base::transport (TAO_Transport *t) { if (this->transport_ != 0) { - TAO_Transport::release (this->transport_); + this->transport_->remove_reference (); } - this->transport_ = TAO_Transport::_duplicate (t); + + this->transport_ = t; + this->transport_->add_reference (); } diff --git a/TAO/tao/Cache_Entries.cpp b/TAO/tao/Cache_Entries.cpp index df610a378f6..4e3ed2de940 100644 --- a/TAO/tao/Cache_Entries.cpp +++ b/TAO/tao/Cache_Entries.cpp @@ -11,14 +11,16 @@ ACE_RCSID(tao, Cache_Entries, "$Id$") TAO_Cache_IntId::TAO_Cache_IntId (TAO_Transport *transport) - : transport_ (TAO_Transport::_duplicate (transport)), + : transport_ (transport), recycle_state_ (ACE_RECYCLABLE_UNKNOWN) { + transport->add_reference (); } TAO_Cache_IntId::~TAO_Cache_IntId (void) { - TAO_Transport::release (this->transport_); + if (this->transport_) + this->transport_->remove_reference (); } TAO_Cache_IntId& @@ -28,9 +30,12 @@ TAO_Cache_IntId::operator= (const TAO_Cache_IntId &rhs) { this->recycle_state_ = rhs.recycle_state_; - TAO_Transport* old_transport = this->transport_; - this->transport_ = TAO_Transport::_duplicate (rhs.transport_); - TAO_Transport::release (old_transport); + TAO_Transport *old_transport = this->transport_; + this->transport_ = rhs.transport_; + if (this->transport_) + this->transport_->add_reference (); + if (old_transport) + old_transport->remove_reference (); } return *this; diff --git a/TAO/tao/Connect_Strategy.cpp b/TAO/tao/Connect_Strategy.cpp index f0cd072677f..8baa2aba950 100644 --- a/TAO/tao/Connect_Strategy.cpp +++ b/TAO/tao/Connect_Strategy.cpp @@ -15,26 +15,3 @@ TAO_Connect_Strategy::TAO_Connect_Strategy (TAO_ORB_Core *orb_core) TAO_Connect_Strategy::~TAO_Connect_Strategy (void) { } - -int -TAO_Connect_Strategy::post_failed_connect (TAO_Connection_Handler *ch, - int is_finalized) -{ - int ref = 0; - if (!is_finalized) - { - // We need to do this here else we will leak memory. We cannot call - // close_connection () for the following reasons - // . the event_handlers get_handle () will return an - // ACE_INVALID_HANDLE as things havent been shutdown - // properly. - // . We cannot relax the conditions since the conditions are right - // for other natural cases ie. LF - // Under these odd circumstances we need to take care of things - // ourseleves - ch->transport (0); - ref = ch->decr_refcount (); - } - - return ref; -} diff --git a/TAO/tao/Connect_Strategy.h b/TAO/tao/Connect_Strategy.h index 3c57d269105..304f6f50201 100644 --- a/TAO/tao/Connect_Strategy.h +++ b/TAO/tao/Connect_Strategy.h @@ -66,16 +66,6 @@ public: virtual int wait (TAO_Connection_Handler *ch, ACE_Time_Value *val) = 0; - /// Cleanup in case of failed connect. - /* - * Do any left over memory management or related things after - * the connect failed. The argument @c is_successful indicates - * whether the connection handler had undergone a sucessful state - * completion or not. - */ - virtual int post_failed_connect (TAO_Connection_Handler *ch, - int is_finalized = 1); - protected: /// Cached copy of the ORB core pointer TAO_ORB_Core *orb_core_; diff --git a/TAO/tao/Connection_Handler.cpp b/TAO/tao/Connection_Handler.cpp index b70d618860b..35b48c1f9d1 100644 --- a/TAO/tao/Connection_Handler.cpp +++ b/TAO/tao/Connection_Handler.cpp @@ -24,14 +24,10 @@ TAO_Connection_Handler::TAO_Connection_Handler (TAO_ORB_Core *orb_core) : orb_core_ (orb_core) , transport_ (0) , tss_resources_ (orb_core->get_tss_resources ()) - , reference_count_ (1) { // @@todo: We need to have a distinct option/ method in the resource // factory for this and TAO_Transport. - this->refcount_lock_ = - this->orb_core_->resource_factory ()->create_cached_connection_lock (); - this->lock_ = this->orb_core_->resource_factory ()->create_cached_connection_lock (); @@ -40,15 +36,20 @@ TAO_Connection_Handler::TAO_Connection_Handler (TAO_ORB_Core *orb_core) this->state_changed (TAO_LF_Event::LFS_CONNECTION_WAIT); } - TAO_Connection_Handler::~TAO_Connection_Handler (void) { - ACE_ASSERT(this->transport_ == 0); - ACE_ASSERT(this->reference_count_ == 0); + int result = + this->release_os_resources (); + + if (result == -1 && TAO_debug_level) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - Connection_Handler::~Connection_Handler," + "release_os_resources() failed %p\n")); + } // @@ TODO Use auto_ptr<> delete this->lock_; - delete this->refcount_lock_; } @@ -126,8 +127,8 @@ TAO_Connection_Handler::svc_i (void) (void) this->transport ()->update_transport (); result = - this->transport ()->handle_input_i (rh, - max_wait_time); + this->transport ()->handle_input (rh, + max_wait_time); if (result == -1 && errno == ETIME) { @@ -159,110 +160,17 @@ TAO_Connection_Handler::svc_i (void) void TAO_Connection_Handler::transport (TAO_Transport* transport) { - // The transport can be reset, but not changed! - ACE_ASSERT(this->transport_ == 0 || transport == 0); - - TAO_Transport * tmp = 0; - { - // Make the change atomic - ACE_GUARD (ACE_Lock, ace_mon, *this->lock_); - tmp = this->transport_; - this->transport_ = TAO_Transport::_duplicate (transport); - } - - if (tmp != 0) { - tmp->connection_handler_closing (); - TAO_Transport::release (tmp); - } -} - -long -TAO_Connection_Handler::incr_refcount (void) -{ - ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->refcount_lock_, -1); - - ACE_ASSERT(this->reference_count_ > 0); - return ++this->reference_count_; -} - -long -TAO_Connection_Handler::decr_refcount (void) -{ - { - ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->refcount_lock_, -1); - - if(--this->reference_count_ > 0) - return this->reference_count_; - } - - ACE_ASSERT(this->reference_count_ == 0); - - - int r = this->release_os_resources (); - - if (r == -1 && TAO_debug_level) - { - ACE_ERROR ((LM_ERROR, - "TAO (%P|%t) - Connection_Handler::" - "decr_refcount, release_os_resources() failed %p\n")); - } - - delete this; - - return 0; -} - -void -TAO_Connection_Handler::connection_close_wait (void) -{ - ACE_GUARD (ACE_Lock, ace_mon, *this->lock_); - this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSE_WAIT); -} - - - -int -TAO_Connection_Handler::handle_close_eh ( - ACE_HANDLE handle, unsigned long reactor_mask, ACE_Event_Handler * eh) -{ - ACE_HANDLE my_handle = eh->get_handle (); - - if (TAO_debug_level) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - Connection_Handler[%d]::handle_close_eh, " - "(%d, %d)\n", - my_handle, handle, reactor_mask)); - } - - if (this->close_connection () == 0) - { - if (TAO_debug_level) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - Connection_Handler[%d]::" - "handle_close, connection closing or already closed\n", - my_handle)); - return 0; - } - - if (TAO_debug_level) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - Connection_Handler[%d]::" - "handle_close, connection fully closed\n", - my_handle)); + this->transport_ = transport; - return 0; + // Enable reference counting on the event handler. + this->transport_->event_handler_i ()->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); } int TAO_Connection_Handler::handle_output_eh ( ACE_HANDLE, ACE_Event_Handler * eh) { - // We are going to use the transport object to write data. Just make - // sure that we have transport objects to proceed. This is - // perfectly valid assert - ACE_ASSERT (this->transport () != 0); - // Let the transport that it is going to be used (void) this->transport ()->update_transport (); @@ -281,7 +189,7 @@ TAO_Connection_Handler::handle_output_eh ( return_value = this->transport ()->handle_output (); - this->pos_io_hook(return_value); + this->pos_io_hook (return_value); if (return_value != 0) { resume_handle.set_flag (TAO_Resume_Handle::TAO_HANDLE_LEAVE_SUSPENDED); @@ -294,11 +202,6 @@ int TAO_Connection_Handler::handle_input_eh ( ACE_HANDLE h, ACE_Event_Handler * eh) { - // We are going to use the transport object to read data. Just make - // sure that we have transport objects to proceed. This is - // perfectly valid assert - ACE_ASSERT (this->transport () != 0); - // Let the transport know that it is used (void) this->transport ()->update_transport (); @@ -308,20 +211,13 @@ TAO_Connection_Handler::handle_input_eh ( size_t t_id = this->transport ()->id (); - - // Increase the reference count on the upcall that have passed us. - // - // REFCNT: Matches decr_refcount() in this function... - long refcount = this->incr_refcount (); - ACE_ASSERT (refcount > 0); - if (TAO_debug_level > 6) { ACE_HANDLE handle = eh->get_handle(); ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - Connection_Handler[%d]::handle_input, " - "handle = %d/%d, refcount = %d\n", - t_id, handle, h, refcount)); + "handle = %d/%d\n", + t_id, handle, h)); } TAO_Resume_Handle resume_handle (this->orb_core (), @@ -331,220 +227,114 @@ TAO_Connection_Handler::handle_input_eh ( this->pre_io_hook (return_value); if (return_value != 0) - { - // REFCNT: Matches incr_refcount() at the beginning... - refcount = this->decr_refcount (); - ACE_ASSERT (refcount >= 0); - return return_value; - } - - - return_value = this->transport ()->handle_input_i (resume_handle); + return return_value; - this->pos_io_hook(return_value); + return_value = this->transport ()->handle_input (resume_handle); - // REFCNT: Matches incr_refcount() at the beginning... - refcount = this->decr_refcount (); - ACE_ASSERT (refcount >= 0); + this->pos_io_hook (return_value); if (TAO_debug_level > 6) { ACE_HANDLE handle = eh->get_handle (); ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - Connection_Handler[%d]::handle_input, " - "handle = %d/%d, refcount = %d, retval = %d\n", - t_id, handle, h, refcount, return_value)); - } - - if (return_value == -1 || refcount == 0) - { - // This is really a odd case. We could have a race condition if - // we dont do this. Looks like this what happens - // - imagine we have more than 1 server threads - // - The server has got more than one connection from the - // clients - // - The clients make requests and they start dissappearing. - // - The connections start getting closed - // - at that point one of the server threads is woken up to - // and handle_input () is called. - // - the handle_input sees no data and so is about return a -1. - // - if the handle is resumed, it looks like the oen more thread - // gets access to the handle and the handle_input is called by - // another thread. - // - at that point of time if the thread returning -1 to the - // reactor starts closing down the handler, bad things start - // happening. - // Looks subtle though. After adding this I dont see anything - // bad happenin and so let us stick with it... - resume_handle.set_flag (TAO_Resume_Handle::TAO_HANDLE_LEAVE_SUSPENDED); + "handle = %d/%d, retval = %d\n", + t_id, handle, h, return_value)); } return return_value; } int -TAO_Connection_Handler::close_connection_eh (ACE_Event_Handler * eh) +TAO_Connection_Handler::close_connection_eh (ACE_Event_Handler *eh) { - // Perform a double checked locking on the underlying ACE_HANDLE + this->transport ()->send_connection_closed_notifications (); + + // Save the ID for debugging messages ACE_HANDLE handle = eh->get_handle (); + size_t id = this->transport ()->id (); + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Connection_Handler[%d]::" + "close_connection, purging entry from cache\n", + handle)); + } + this->transport ()->purge_entry (); - // If the handle is ACE_INVALID_HANDLE then there is no work to be - // done in this function, and we return immediately. Returning 0 - // indicates the caller (handle_close() most likely), that there is - // no work to be done. - if (handle == ACE_INVALID_HANDLE) + // @@ This seems silly, but if we have no reason to be in the + // reactor, then we dont remove ourselves. + if (this->transport ()->wait_strategy ()->is_registered ()) { - return 0; + ACE_Reactor *eh_reactor = eh->reactor (); + + // These checks are valid as long as the ORB_Core is not + // shutdown. It is good to have these checks and they are valid + // for most of the cases. Please see below for exceptions + if (this->orb_core_->has_shutdown () == 0) + { + // The exception when these are not valid is for + // RTCORBA. With RTCORBA on, you can threads in different + // lanes creating handlers and registering them with reactor + // in those respective lanes. These threads could then even + // go away leaving the task of reclaiming these resources to + // the main thread. For the main thread that takes the + // responsibility of finalizing () the lanes and the pools, + // the calls and comparison make no sense. + ACE_Reactor * reactor = + this->transport()->orb_core()->reactor (); + ACE_ASSERT (eh_reactor == 0 || eh_reactor == reactor); + + ACE_Reactor * orb_core_reactor = this->orb_core_->reactor (); + ACE_ASSERT (reactor == orb_core_reactor); + + if (eh_reactor == 0) + eh_reactor = reactor; + + ACE_UNUSED_ARG (orb_core_reactor); + } + + // The Reactor must not be null, otherwise something else is + // horribly broken. + ACE_ASSERT (eh_reactor != 0); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Connection_Handler[%d]::" + "close_connection, removing from the reactor\n", + handle)); + } + + eh_reactor->remove_handler (handle, + ACE_Event_Handler::ALL_EVENTS_MASK | + ACE_Event_Handler::DONT_CALL); + + // Also cancel any timers, we may create those for time-limited + // buffering + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Connection_Handler[%d]::" + "close_connection, cancel all timers\n", + handle)); + } + + eh_reactor->cancel_timer (eh); + + // @@ This seems silly, the reactor is a much better authority to + // find out if a handle is registered... + this->transport ()->wait_strategy ()->is_registered (0); } - size_t id = 0; - { - ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0); - - handle = eh->get_handle (); - - // Double-checked locking. - if(handle == ACE_INVALID_HANDLE) - { - return 0; - } - - // Before closing the socket we need to remove ourselves from the - // Reactor. Sounds silly, as supposedly handle_close() was called - // *BY* the Reactor, but the Reactor calls handle_close() with - // only the masks implied by the handle_XXX() call that returned - // -1, and it does *NOT* remove the Event Handler from all masks. - // Furthermore, this method is also called outside the Reactor - // event loop, for example, when an I/O error is detected during a - // write(). - - // The following assertion is true because: - // - // - // 1) When a connection handler is initialized Transport is not zero - // and the handle is *NOT* ACE_INVALID_HANDLE. - // 2) The code here is run only once, if we get to this point the - // handle was not ACE_INVALID_HANDLE - // 3) this->transport() is only reset after we run this code - // successfully - // - // Or: for this code to run the handle must have changed state from - // something valid to ACE_INVALID_HANDLE, and the transport() field - // will not be changed before that state transition. - // - ACE_ASSERT (this->transport () != 0); - - // Save the ID for debugging messages - id = this->transport()->id (); - if (TAO_debug_level) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - Connection_Handler[%d]::" - "close_connection, purging entry from cache\n", - handle)); - } - this->transport ()->purge_entry (); - - // @@ This seems silly, but if we have no reason to be in the - // reactor, then we dont remove ourselves. - if (this->transport ()->wait_strategy ()->is_registered ()) - { - ACE_Reactor * eh_reactor = eh->reactor (); - - // These checks are valid as long as the ORB_Core is not - // shutdown. It is good to have these checks and they are valid - // for most of the cases. Please see below for exceptions - if (this->orb_core_->has_shutdown () == 0) - { - // The exception when these are not valid is for RTCORBA. With - // RTCORBA on, you can threads in different lanes creating - // handlers and registering them with reactor in those - // respective lanes. These threads could then even go away - // leaving the task of reclaiming these resources to the main - // thread. For the main thread that takes the responsibility - // of finalizing () the lanes and the pools, the calls and - // comparison make no sense. - ACE_Reactor * reactor = - this->transport()->orb_core()->reactor (); - ACE_ASSERT (eh_reactor == 0 || eh_reactor == reactor); - - ACE_Reactor * orb_core_reactor = this->orb_core_->reactor (); - ACE_ASSERT (reactor == orb_core_reactor); - - if (eh_reactor == 0) - eh_reactor = reactor; - - ACE_UNUSED_ARG (orb_core_reactor); - } - - // The Reactor must not be null, otherwise something else is - // horribly broken. - ACE_ASSERT (eh_reactor != 0); - - if (TAO_debug_level) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - Connection_Handler[%d]::" - "close_connection, removing from the reactor\n", - handle)); - } - - int r = - eh_reactor->remove_handler (handle, - (ACE_Event_Handler::ALL_EVENTS_MASK - | ACE_Event_Handler::DONT_CALL)); - if(r == -1 && TAO_debug_level) - { - ACE_ERROR ((LM_ERROR, - "TAO (%P|%t) - Connection_Handler[%d]::" - "close_connection, problem in remove_handler (%d)\n", - handle, r)); - } - - // Also cancel any timers, we may create those for time-limited - // buffering - if (TAO_debug_level) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - Connection_Handler[%d]::" - "close_connection, cancel all timers and refcount [%d]\n", - handle, reference_count_)); - } - r = eh_reactor->cancel_timer (eh); - if (r == -1 && TAO_debug_level) - { - ACE_ERROR ((LM_ERROR, - "TAO (%P|%t) - Connection_Handler[%d]::" - "close_connection, error cancelling timers\n", - handle)); - } - - // @@ This seems silly, the reactor is a much better authority to - // find out if a handle is registered... - this->transport ()->wait_strategy ()->is_registered (0); - } - - this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); - } - - ACE_ASSERT (this->transport () != 0); - - // Signal the transport that we will no longer have - // a reference to it. This will eventually call - // TAO_Transport::release (). - this->transport (0); - - // The Reactor (or the Connector) holds an implicit reference. - // REFCNT: Matches start count - // REFCNT: only this or handle_input_eh() are called - long refcount = this->decr_refcount (); + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); if (TAO_debug_level) { ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - Connection_Handler[%d]::" - "close_connection, refcount = %d\n", - id, refcount)); + "close_connection\n", + id)); } return 1; diff --git a/TAO/tao/Connection_Handler.h b/TAO/tao/Connection_Handler.h index 6401e86aca6..9394e52c1ac 100644 --- a/TAO/tao/Connection_Handler.h +++ b/TAO/tao/Connection_Handler.h @@ -17,12 +17,12 @@ #include "ace/pre.h" #include "LF_CH_Event.h" +#include "ace/Event_Handler.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ - class TAO_ORB_Core; class TAO_ORB_Core_TSS_Resources; class TAO_Transport; @@ -51,23 +51,23 @@ public: /// Constructor TAO_Connection_Handler (TAO_ORB_Core *orb_core); + /// Destructor + virtual ~TAO_Connection_Handler (void); + /// Return the underlying transport object TAO_Transport *transport (void); /// Set the underlying transport object void transport (TAO_Transport* transport); - /// Is the state final? - int is_finalized (void); + /// Is the handler closed? + int is_closed (void); - /// Increment and decrement the refcount. The object is deleted when - /// the refcount reaches zero. - long incr_refcount (void); - long decr_refcount (void); + /// Is the handler open? + int is_open (void); - /// Set the handler in LF_EVENT_CONNECTION_CLOSE_WAIT - /// state - void connection_close_wait (void); + /// Is the handler in the process of being connected? + int is_connecting (void); /// Close the underlying connection. /** @@ -96,13 +96,6 @@ public: protected: - /// Destructor - /** - * Protected destructor to enforce proper memory management through - * the reference counting mechanism. - */ - virtual ~TAO_Connection_Handler (void); - /// Return our TAO_ORB_Core pointer TAO_ORB_Core *orb_core (void); @@ -125,11 +118,6 @@ protected: * place. */ - /// Implement the handle_close() callback - virtual int handle_close_eh (ACE_HANDLE h, - unsigned long reactor_mask, - ACE_Event_Handler * eh); - /// Implement the handle_output() callback int handle_output_eh (ACE_HANDLE h, ACE_Event_Handler * eh); @@ -140,8 +128,7 @@ protected: /// also Event_Handlers. int close_connection_eh (ACE_Event_Handler * eh); - /// Release the OS resources related to this handler, used in - /// handle_close_eh() + /// Release the OS resources related to this handler. virtual int release_os_resources (void); /// Pre-invocation hook for I/O operations (handle_input() & @@ -170,12 +157,6 @@ private: /// Cached tss resources of the ORB that activated this object. TAO_ORB_Core_TSS_Resources *tss_resources_; - /// Pretty obvious - long reference_count_; - - /// Lock for the reference count - ACE_Lock *refcount_lock_; - /// Internal state lock, needs to be separate from the reference /// count / pending upcalls lock because they interleave. ACE_Lock * lock_; diff --git a/TAO/tao/Connection_Handler.inl b/TAO/tao/Connection_Handler.inl index 7de61103ad9..3562b10159a 100644 --- a/TAO/tao/Connection_Handler.inl +++ b/TAO/tao/Connection_Handler.inl @@ -20,23 +20,20 @@ TAO_Connection_Handler::transport (void) return this->transport_; } -#if 0 -// NOTE: Not used ACE_INLINE int -TAO_Connection_Handler::is_connect_complete (void) const +TAO_Connection_Handler::is_closed (void) { - return this->successful () || this->error_detected (); + return this->state_ == TAO_LF_Event::LFS_CONNECTION_CLOSED; } ACE_INLINE int -TAO_Connection_Handler::is_connect_successful (void) const +TAO_Connection_Handler::is_open (void) { - return (this->error_detected () == 0); + return this->state_ == TAO_LF_Event::LFS_SUCCESS; } -#endif /*if 0*/ ACE_INLINE int -TAO_Connection_Handler::is_finalized (void) +TAO_Connection_Handler::is_connecting (void) { - return this->is_state_final (); + return this->state_ == TAO_LF_Event::LFS_CONNECTION_WAIT; } diff --git a/TAO/tao/Connector_Impl.cpp b/TAO/tao/Connector_Impl.cpp index a4bb4cee8c0..577427054c0 100644 --- a/TAO/tao/Connector_Impl.cpp +++ b/TAO/tao/Connector_Impl.cpp @@ -39,12 +39,11 @@ TAO_Connect_Creation_Strategy::make_svc_handler (SVC_HANDLER *&sh) this->arg_), -1); - // Add a reference count. Why is this needed? We need this to make - // sure that the connector doesnt delete this handler when we are - // waiting for non-blocking connects to complete. + // We add to the #REFCOUNT# since the Connector needs this. See + // Connector::make_connection() for details. + sh->add_reference (); - // REFCNT: matches decr_refcount() in XXX_Connector::make_connection() - sh->incr_refcount (); + // At this point, the #REFCOUNT# is two. return 0; } diff --git a/TAO/tao/IIOP_Connection_Handler.cpp b/TAO/tao/IIOP_Connection_Handler.cpp index 9ea68fc555f..46c61744cdb 100644 --- a/TAO/tao/IIOP_Connection_Handler.cpp +++ b/TAO/tao/IIOP_Connection_Handler.cpp @@ -34,7 +34,7 @@ TAO_IIOP_Connection_Handler::TAO_IIOP_Connection_Handler (ACE_Thread_Manager *t) // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -54,7 +54,6 @@ TAO_IIOP_Connection_Handler::TAO_IIOP_Connection_Handler ( // store this pointer (indirectly increment ref count) this->transport (specific_transport); - TAO_Transport::release (specific_transport); } TAO_IIOP_Connection_Handler::TAO_IIOP_Connection_Handler (TAO_ORB_Core *orb_core, @@ -67,12 +66,11 @@ TAO_IIOP_Connection_Handler::TAO_IIOP_Connection_Handler (TAO_ORB_Core *orb_core { } - TAO_IIOP_Connection_Handler::~TAO_IIOP_Connection_Handler (void) { + delete this->transport (); } - int TAO_IIOP_Connection_Handler::open_handler (void *v) { @@ -134,7 +132,6 @@ TAO_IIOP_Connection_Handler::open (void*) return -1; } - if (TAO_debug_level > 0) { ACE_TCHAR client[MAXHOSTNAMELEN + 16]; @@ -158,10 +155,6 @@ TAO_IIOP_Connection_Handler::open (void*) return 0; } - - - - int TAO_IIOP_Connection_Handler::resume_handler (void) { @@ -177,26 +170,63 @@ TAO_IIOP_Connection_Handler::close_connection (void) int TAO_IIOP_Connection_Handler::handle_input (ACE_HANDLE h) { - return this->handle_input_eh (h, this); + int result = + this->handle_input_eh (h, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int TAO_IIOP_Connection_Handler::handle_output (ACE_HANDLE handle) { - return this->handle_output_eh (handle, this); + int result = + this->handle_output_eh (handle, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; +} + +int +TAO_IIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, + const void *) +{ + // We don't use this upcall for I/O. This is only used by the + // Connector to indicate that the connection timedout. Therefore, + // we should call close(). + return this->close (); } int -TAO_IIOP_Connection_Handler::handle_close (ACE_HANDLE handle, - ACE_Reactor_Mask rm) +TAO_IIOP_Connection_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) { - return this->handle_close_eh (handle, rm, this); + ACE_ASSERT (0); + return 0; +} + +int +TAO_IIOP_Connection_Handler::close (u_long) +{ + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); + this->transport ()->remove_reference (); + return 0; } int TAO_IIOP_Connection_Handler::release_os_resources (void) { - return this->peer().close (); + return this->peer ().close (); } int diff --git a/TAO/tao/IIOP_Connection_Handler.h b/TAO/tao/IIOP_Connection_Handler.h index fe7d26c3881..57a562fd0ea 100644 --- a/TAO/tao/IIOP_Connection_Handler.h +++ b/TAO/tao/IIOP_Connection_Handler.h @@ -83,7 +83,7 @@ class TAO_Export TAO_IIOP_Connection_Handler : public TAO_IIOP_SVC_HANDLER, public: - TAO_IIOP_Connection_Handler (ACE_Thread_Manager* t = 0); + TAO_IIOP_Connection_Handler (ACE_Thread_Manager * = 0); /// Constructor. parameter is used by the Acceptor to pass the /// protocol configuration properties for this connection. @@ -99,6 +99,10 @@ public: /// connected. Argument is unused. virtual int open (void *); + /// Close called by the Acceptor or Connector when connection + /// establishment fails. + int close (u_long = 0); + //@{ /** @name Event Handler overloads */ @@ -107,6 +111,8 @@ public: virtual int handle_input (ACE_HANDLE); virtual int handle_output (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + virtual int handle_timeout (const ACE_Time_Value ¤t_time, + const void *act = 0); //@} /// Add ourselves to Cache. diff --git a/TAO/tao/IIOP_Connector.cpp b/TAO/tao/IIOP_Connector.cpp index feaaeede5f9..fa3c81b0d21 100644 --- a/TAO/tao/IIOP_Connector.cpp +++ b/TAO/tao/IIOP_Connector.cpp @@ -15,25 +15,17 @@ #include "ace/Strategies_T.h" - ACE_RCSID (TAO, IIOP_Connector, "$Id$") - #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) template class TAO_Connect_Concurrency_Strategy; template class TAO_Connect_Creation_Strategy; template class ACE_Strategy_Connector; template class ACE_Connect_Strategy; template class ACE_Connector; -template class ACE_Svc_Tuple; - -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Entry*>; -template class ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX>; +template class ACE_NonBlocking_Connect_Handler; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) @@ -42,17 +34,10 @@ template class ACE_Map_Reverse_Iterator #pragma instantiate ACE_Connect_Strategy #pragma instantiate ACE_Connector -#pragma instantiate ACE_Svc_Tuple - -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Entry*> -#pragma instantiate ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX> +#pragma instantiate ACE_NonBlocking_Connect_Handler #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - TAO_IIOP_Connector::TAO_IIOP_Connector (CORBA::Boolean flag) : TAO_Connector (IOP::TAG_INTERNET_IOP), lite_flag_ (flag), @@ -154,130 +139,214 @@ TAO_IIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, TAO_IIOP_Endpoint *iiop_endpoint = this->remote_endpoint (desc->endpoint ()); - if (iiop_endpoint == 0) - return -1; - - const ACE_INET_Addr &remote_address = - iiop_endpoint->object_addr (); - - if (TAO_debug_level > 2) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_Connector::make_connection, " - "to <%s:%d>\n", - iiop_endpoint->host(), iiop_endpoint->port())); - - // Get the right synch options - ACE_Synch_Options synch_options; - - this->active_connect_strategy_->synch_options (max_wait_time, - synch_options); - - TAO_IIOP_Connection_Handler *svc_handler = 0; - - // Active connect - int result = this->base_connector_.connect (svc_handler, - remote_address, - synch_options); - - - if (result == -1 && errno == EWOULDBLOCK) - { - if (TAO_debug_level > 2) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_Connector::make_connection, " - "going to wait for connection completion on local" - "handle [%d]\n", - svc_handler->get_handle ())); - - result = - this->active_connect_strategy_->wait (svc_handler, - max_wait_time); - - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_Connector::make_connection" - "wait done for handle[%d], result = %d\n", - svc_handler->get_handle (), result)); - } - - } - - int status = - svc_handler->is_finalized (); - - // Reduce the refcount to the svc_handler that we have. The - // increment to the handler is done in make_svc_handler (). Now - // that we dont need the reference to it anymore we can decrement - // the refcount whether the connection is successful ot not. - - // REFCNT: Matches with TAO_Connect_Strategy<>::make_svc_handler() - long refcount = svc_handler->decr_refcount (); + if (iiop_endpoint == 0) + return -1; - ACE_ASSERT (refcount >= 0); + const ACE_INET_Addr &remote_address = + iiop_endpoint->object_addr (); + + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "to <%s:%d>\n", + iiop_endpoint->host(), iiop_endpoint->port())); + + // Get the right synch options + ACE_Synch_Options synch_options; + + this->active_connect_strategy_->synch_options (max_wait_time, + synch_options); + + TAO_IIOP_Connection_Handler *svc_handler = 0; + + // Connect. + int result = + this->base_connector_.connect (svc_handler, + remote_address, + synch_options); + + // The connect() method creates the service handler and bumps the + // #REFCOUNT# up one extra. There are three possibilities from + // calling connect(): (a) connection succeeds immediately - in this + // case, the #REFCOUNT# on the handler is two; (b) connection + // completion is pending - in this case, the #REFCOUNT# on the + // handler is also two; (c) connection fails immediately - in this + // case, the #REFCOUNT# on the handler is one since close() gets + // called on the handler. + // + // The extra reference count in + // TAO_Connect_Creation_Strategy::make_svc_handler() is needed in + // the case when connection completion is pending and we are going + // to wait on a variable in the handler to changes, signifying + // success or failure. Note, that this increment cannot be done + // once the connect() returns since this might be too late if + // another thread pick up the completion and potentially deletes the + // handler before we get a chance to increment the reference count. + + // No immediate result. Wait for completion. + if (result == -1 && errno == EWOULDBLOCK) + { + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "going to wait for connection completion on local" + "handle [%d]\n", + svc_handler->get_handle ())); + + // Wait for connection completion. No need to specify timeout + // to wait() since the correct timeout was passed to the + // Connector. The Connector will close the handler in the case + // of timeouts, so the event will complete (either success or + // failure) within timeout. + result = + this->active_connect_strategy_->wait (svc_handler, + 0); + + if (TAO_debug_level > 2) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Connector::make_connection" + "wait done for handle[%d], result = %d\n", + svc_handler->get_handle (), result)); + } + + // There are three possibilities when wait() returns: (a) + // connection succeeded; (b) connection failed; (c) wait() + // failed because of some other error. It is easy to deal with + // (a) and (b). (c) is tricky since the connection is still + // pending and may get completed by some other thread. The + // following code deals with (c). + + // Check if the handler has been closed. + int closed = + svc_handler->is_closed (); + + // In case of failures and close() has not be called. + if (result == -1 && + !closed) + { + // First, cancel from connector. + this->base_connector_.cancel (svc_handler); + + // Double check to make sure the handler has not been closed + // yet. This double check is required to ensure that the + // connection handler was not closed yet by some other + // thread since it was still registered with the connector. + // Once connector.cancel() has been processed, we are + // assured that the connector will no longer open/close this + // handler. + closed = + svc_handler->is_closed (); + + // If closed, there is nothing to do here. If not closed, + // it was either opened or is still pending. + if (!closed) + { + // Check if the handler has been opened. + int open = + svc_handler->is_open (); + + // Some other thread was able to open the handler even + // though wait failed for this thread. + if (open) + // Overwrite . + result = 0; + else + { + // Assert that it is still connecting. + ACE_ASSERT (svc_handler->is_connecting ()); + + // Force close the handler now. + svc_handler->close (); + } + } + } + } - ACE_UNUSED_ARG (refcount); + // Irrespective of success or failure, remove the extra #REFCOUNT#. + svc_handler->remove_reference (); - if (result == -1) - { - // Give users a clue to the problem. - if (TAO_debug_level) - { - ACE_DEBUG ((LM_ERROR, - "TAO (%P|%t) - IIOP_Connector::make_connection, " - "connection to <%s:%d> failed (%p)\n", - iiop_endpoint->host (), iiop_endpoint->port (), - "errno")); - } + // In case of errors. + if (result == -1) + { + // Give users a clue to the problem. + if (TAO_debug_level) + { + ACE_DEBUG ((LM_ERROR, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "connection to <%s:%d> failed (%p)\n", + iiop_endpoint->host (), iiop_endpoint->port (), + "errno")); + } + + return -1; + } - (void) this->active_connect_strategy_->post_failed_connect (svc_handler, - status); + // At this point, the connection has be successfully connected. + // #REFCOUNT# is one. + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "new connection to <%s:%d> on Transport[%d]\n", + iiop_endpoint->host (), iiop_endpoint->port (), + svc_handler->peer ().get_handle ())); + + TAO_Transport *transport = + svc_handler->transport (); + + // Add the handler to Cache + int retval = + this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, + transport); + + // Failure in adding to cache. + if (retval != 0) + { + // Close the handler. + svc_handler->close (); - return -1; - } + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "could not add the new connection to cache\n")); + } - if (TAO_debug_level > 2) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_Connector::make_connection, " - "new connection to <%s:%d> on Transport[%d]\n", - iiop_endpoint->host (), iiop_endpoint->port (), - svc_handler->peer ().get_handle ())); + return -1; + } - TAO_Transport *base_transport = - TAO_Transport::_duplicate (svc_handler->transport ()); + // If the wait strategy wants us to be registered with the reactor + // then we do so. If registeration is required and it succeeds, + // #REFCOUNT# becomes two. + retval = transport->wait_strategy ()->register_handler (); - // Add the handler to Cache - int retval = - this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, - base_transport); + // Registration failures. + if (retval != 0) + { + // Purge from the connection cache. + transport->purge_entry (); - if (retval != 0 && TAO_debug_level > 0) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_Connector::make_connection, " - "could not add the new connection to cache\n")); - } + // Close the handler. + svc_handler->close (); - // If the wait strategy wants us to be registered with the reactor - // then we do so. - retval = base_transport->wait_strategy ()->register_handler (); + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - IIOP_Connector::make_connection, " + "could not register the new connection in the reactor\n")); + } - if (retval != 0 && TAO_debug_level > 0) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_Connector::make_connection, " - "could not register the new connection in the reactor\n")); - } + return -1; + } - // Handover the transport pointer to the Invocation class. - TAO_Transport *&transport = invocation->transport (); - transport = base_transport; + // Handover the transport pointer to the Invocation class. + TAO_Transport *&invocation_transport = + invocation->transport (); + invocation_transport = transport; - return 0; + return 0; } - - TAO_Profile * TAO_IIOP_Connector::create_profile (TAO_InputCDR& cdr) { diff --git a/TAO/tao/IIOP_Transport.cpp b/TAO/tao/IIOP_Transport.cpp index 716ec4f1cde..522a04233b6 100644 --- a/TAO/tao/IIOP_Transport.cpp +++ b/TAO/tao/IIOP_Transport.cpp @@ -35,13 +35,6 @@ TAO_IIOP_Transport::TAO_IIOP_Transport (TAO_IIOP_Connection_Handler *handler, , connection_handler_ (handler) , messaging_object_ (0) { - if (connection_handler_ != 0) - { - // REFCNT: Matches one of - // TAO_Transport::connection_handler_close() or - // TAO_Transport::close_connection_shared. - this->connection_handler_->incr_refcount(); - } if (flag) { // Use the lite version of the protocol @@ -58,7 +51,6 @@ TAO_IIOP_Transport::TAO_IIOP_Transport (TAO_IIOP_Connection_Handler *handler, TAO_IIOP_Transport::~TAO_IIOP_Transport (void) { - ACE_ASSERT(this->connection_handler_ == 0); delete this->messaging_object_; } @@ -81,9 +73,9 @@ TAO_IIOP_Transport::messaging_object (void) } ssize_t -TAO_IIOP_Transport::send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *max_wait_time) +TAO_IIOP_Transport::send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt, max_wait_time); @@ -94,9 +86,9 @@ TAO_IIOP_Transport::send_i (iovec *iov, int iovcnt, } ssize_t -TAO_IIOP_Transport::recv_i (char *buf, - size_t len, - const ACE_Time_Value *max_wait_time) +TAO_IIOP_Transport::recv (char *buf, + size_t len, + const ACE_Time_Value *max_wait_time) { ssize_t n = this->connection_handler_->peer ().recv (buf, len, @@ -121,7 +113,6 @@ TAO_IIOP_Transport::recv_i (char *buf, if (errno == EWOULDBLOCK) return 0; - return -1; } @@ -137,32 +128,6 @@ TAO_IIOP_Transport::recv_i (char *buf, return n; } -int -TAO_IIOP_Transport::register_handler_i (void) -{ - if (TAO_debug_level > 4) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - IIOP_Transport[%d]::register_handler\n", - this->id ())); - } - - ACE_Reactor *r = this->orb_core_->reactor (); - - if (r == this->connection_handler_->reactor ()) - return 0; - - // Set the flag in the Connection Handler and in the Wait Strategy - // @@Maybe we should set these flags after registering with the - // reactor. What if the registration fails??? - this->ws_->is_registered (1); - - // Register the handler with the reactor - return r->register_handler (this->connection_handler_, - ACE_Event_Handler::READ_MASK); -} - - int TAO_IIOP_Transport::send_request (TAO_Stub *stub, TAO_ORB_Core *orb_core, @@ -261,9 +226,6 @@ TAO_IIOP_Transport::send_message_shared ( { ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->handler_lock_, -1); - if (this->check_event_handler_i ("IIOP_Transport::send_message_shared") == -1) - return -1; - if (TAO_debug_level > 6) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - ") @@ -271,8 +233,7 @@ TAO_IIOP_Transport::send_message_shared ( ACE_TEXT ("enable_network_priority = %d\n"), this->connection_handler_->enable_network_priority ())); - if (this->connection_handler_ != 0) - this->connection_handler_->set_dscp_codepoint (); + this->connection_handler_->set_dscp_codepoint (); r = this->send_message_shared_i (stub, message_semantics, message_block, max_wait_time); @@ -309,7 +270,6 @@ TAO_IIOP_Transport::generate_request_header (TAO_Operation_Details &opdetails, // setup opdetails.modify_request_id (this->bidirectional_flag ()); - return TAO_Transport::generate_request_header (opdetails, spec, msg); @@ -341,17 +301,6 @@ TAO_IIOP_Transport::tear_listen_point_list (TAO_InputCDR &cdr) // 1 (i.e., non-originating side) this->bidirectional_flag (1); - // Just make sure that the connection handler is sane before we go - // head and do anything with it. - ACE_GUARD_RETURN (ACE_Lock, - ace_mon, - *this->handler_lock_, - -1); - - if (this->check_event_handler_i ("IIOP_Transport::tear_listen_point_list") - == -1) - return -1; - return this->connection_handler_->process_listen_point_list (listen_list); } @@ -421,28 +370,16 @@ TAO_IIOP_Transport::get_listen_point ( // Get the local address of the connection ACE_INET_Addr local_addr; - { - // Just make sure that the connection handler is sane before we go - // head and do anything with it. - ACE_GUARD_RETURN (ACE_Lock, - ace_mon, - *this->handler_lock_, - -1); - - if (this->check_event_handler_i ("IIOP_Transport::get_listen_point") - == -1) - return -1; - if (this->connection_handler_->peer ().get_local_addr (local_addr) - == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT ("(%P|%t) Could not resolve local ") - ACE_TEXT ("host address in ") - ACE_TEXT ("get_listen_point()\n")), - -1); - } - } + if (this->connection_handler_->peer ().get_local_addr (local_addr) + == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("(%P|%t) Could not resolve local ") + ACE_TEXT ("host address in ") + ACE_TEXT ("get_listen_point()\n")), + -1); + } // Note: Looks like there is no point in sending the list of // endpoints on interfaces on which this connection has not @@ -484,33 +421,12 @@ TAO_IIOP_Transport::get_listen_point ( return 1; } -TAO_Connection_Handler * -TAO_IIOP_Transport::invalidate_event_handler_i (void) -{ - TAO_Connection_Handler * eh = this->connection_handler_; - this->connection_handler_ = 0; - return eh; -} - void TAO_IIOP_Transport::update_protocol_properties (int snd_buf_sz, int rcv_buf_sz, int no_delay, int enable_nw_prio) { - // Just make sure that the connection handler is sane before we go - // head and do anything with it. - ACE_GUARD (ACE_Lock, - ace_mon, - *this->handler_lock_); - - if (this->check_event_handler_i ( - "IIOP_Transport::update_protocol_properties") == -1) - return; - - /// Making an outbound call holding a lock. This is not suposed to - /// be done. But it would be dangerous to leave the lock since the - /// connection handler could dissappear. this->connection_handler_->update_protocol_properties ( snd_buf_sz, rcv_buf_sz, diff --git a/TAO/tao/IIOP_Transport.h b/TAO/tao/IIOP_Transport.h index 820f7e67e97..1670858789b 100644 --- a/TAO/tao/IIOP_Transport.h +++ b/TAO/tao/IIOP_Transport.h @@ -70,20 +70,17 @@ protected: //@{ virtual ACE_Event_Handler * event_handler_i (void); - virtual TAO_Connection_Handler * invalidate_event_handler_i (void); /// Access the underlying messaging object virtual TAO_Pluggable_Messaging *messaging_object (void); - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout = 0); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0); - virtual ssize_t recv_i (char *buf, - size_t len, - const ACE_Time_Value *s = 0); - - virtual int register_handler_i (void); + virtual ssize_t recv (char *buf, + size_t len, + const ACE_Time_Value *s = 0); virtual int send_message_shared (TAO_Stub *stub, int message_semantics, diff --git a/TAO/tao/Invocation.cpp b/TAO/tao/Invocation.cpp index 46af924c2ea..9561555ce18 100644 --- a/TAO/tao/Invocation.cpp +++ b/TAO/tao/Invocation.cpp @@ -147,7 +147,8 @@ TAO_GIOP_Invocation::~TAO_GIOP_Invocation (void) /// Ossama remove this when you are done.. if (this->profile_) this->profile_->_decr_refcnt (); - TAO_Transport::release (this->transport_); + if (this->transport_) + this->transport_->remove_reference (); } // The public API involves creating an invocation, starting it, filling @@ -236,13 +237,10 @@ TAO_GIOP_Invocation::perform_call (TAO_Transport_Descriptor_Interface &desc if (this->transport_ != 0) { this->transport_->make_idle (); + this->transport_->remove_reference (); + this->transport_ = 0; } - // Release the transport prior to connecting. - // In most cases the transport_ will already be zero. - TAO_Transport::release (this->transport_); - this->transport_ = 0; - // Get a pointer to the connector registry, which might be in // thread-specific storage, depending on the concurrency model. TAO_Connector_Registry *conn_reg = @@ -494,8 +492,7 @@ TAO_GIOP_Invocation::close_connection (void) // false error reports to applications. this->transport_->close_connection (); - // this->transport_->idle (); - TAO_Transport::release (this->transport_); + this->transport_->remove_reference (); this->transport_ = 0; this->endpoint_ = 0; diff --git a/TAO/tao/LF_CH_Event.cpp b/TAO/tao/LF_CH_Event.cpp index 700871bf95d..907e58821a2 100644 --- a/TAO/tao/LF_CH_Event.cpp +++ b/TAO/tao/LF_CH_Event.cpp @@ -48,23 +48,13 @@ TAO_LF_CH_Event::state_changed_i (int new_state) } else if (this->state_ == TAO_LF_Event::LFS_SUCCESS) { - if (new_state == TAO_LF_Event::LFS_CONNECTION_CLOSE_WAIT - || new_state == TAO_LF_Event::LFS_CONNECTION_CLOSED) + if (new_state == TAO_LF_Event::LFS_CONNECTION_CLOSED) { this->prev_state_ = this->state_; this->state_ = new_state; } return; } - else if (this->state_ == TAO_LF_Event::LFS_CONNECTION_CLOSE_WAIT) - { - if (new_state == TAO_LF_Event::LFS_CONNECTION_CLOSED) - { - // Dont reset the previous state. We could have come only - // from SUCESS. Let that state be preserved. - this->state_ = new_state; - } - } else if (this->state_ == TAO_LF_Event::LFS_TIMEOUT) { if (new_state == TAO_LF_Event::LFS_CONNECTION_CLOSED) @@ -91,8 +81,6 @@ TAO_LF_CH_Event::error_detected (void) const { if (this->prev_state_ == TAO_LF_Event::LFS_CONNECTION_WAIT) return this->state_ == TAO_LF_Event::LFS_CONNECTION_CLOSED; - else if (this->prev_state_ == TAO_LF_Event::LFS_CONNECTION_CLOSE_WAIT) - return (this->state_ != TAO_LF_Event::LFS_CONNECTION_CLOSED); return 0; } diff --git a/TAO/tao/LF_CH_Event.h b/TAO/tao/LF_CH_Event.h index 587874266b4..bbc54d64363 100644 --- a/TAO/tao/LF_CH_Event.h +++ b/TAO/tao/LF_CH_Event.h @@ -75,27 +75,21 @@ private: * * LFS_TIMEOUT - The event has timed out. * - * LFS_CONNECTION_CLOSE_WAIT - A temporary state before complete - * connection closure. An event - * handler in this state is supposed to - * be getting ready for closure. - * * LFS_CONNECTION_CLOSED - The connection was closed since * an error occured while trying to * establish connection * * Event State Diagram * ------------------- - * |----> CLOSED <-| - * | ^ | - * | | | - * IDLE ---> CONNECTION_WAIT-| | CLOSE_WAIT - * | | ^ - * | | | - * |----> SUCESS---> + * |----> CLOSED + * | ^ + * | | + * IDLE ---> CONNECTION_WAIT--| | + * | | + * | | + * |----> SUCESS * - * Timeouts can occur while waiting for connections or during - * CLOSE_WAIT state. + * Timeouts can occur while waiting for connections. * */ virtual void state_changed_i (int new_state); diff --git a/TAO/tao/LF_Connect_Strategy.cpp b/TAO/tao/LF_Connect_Strategy.cpp index b69fe08fc5d..f641d87813a 100644 --- a/TAO/tao/LF_Connect_Strategy.cpp +++ b/TAO/tao/LF_Connect_Strategy.cpp @@ -68,11 +68,8 @@ TAO_LF_Connect_Strategy::wait (TAO_Connection_Handler *ch, max_wait_time); // Set the result. - if (!ch->successful () && result != -1) + if (ch->error_detected () && result != -1) result = -1; - // @@todo We need to use a auto_ptr<>-like object here! - // TAO_Transport::release(transport); - return result; } diff --git a/TAO/tao/LF_Event.h b/TAO/tao/LF_Event.h index c6d919a333a..6dd77f6e23b 100644 --- a/TAO/tao/LF_Event.h +++ b/TAO/tao/LF_Event.h @@ -89,9 +89,6 @@ public: LFS_FAILURE, /// The event has timed out LFS_TIMEOUT, - /// The event is waiting for connection closure. This is a - /// temporary state - LFS_CONNECTION_CLOSE_WAIT, /// The connection was closed. LFS_CONNECTION_CLOSED }; diff --git a/TAO/tao/Makefile.bor b/TAO/tao/Makefile.bor index 0ca53ad1279..6766c6a1b36 100644 --- a/TAO/tao/Makefile.bor +++ b/TAO/tao/Makefile.bor @@ -61,7 +61,6 @@ OBJFILES = \ $(OBJDIR)\Default_Collocation_Resolver.obj \ $(OBJDIR)\Connection_Purging_Strategy.obj \ $(OBJDIR)\Connection_Handler.obj \ - $(OBJDIR)\Notify_Handler.obj \ $(OBJDIR)\Thread_Per_Connection_Handler.obj \ $(OBJDIR)\Connector_Impl.obj \ $(OBJDIR)\Connector_Registry.obj \ diff --git a/TAO/tao/Makefile.tao b/TAO/tao/Makefile.tao index 7f02bc8a0e6..b926ce56dac 100644 --- a/TAO/tao/Makefile.tao +++ b/TAO/tao/Makefile.tao @@ -92,7 +92,6 @@ PLUGGABLE_PROTOCOLS_FILES = \ Transport_Connector \ Transport \ Incoming_Message_Queue \ - Notify_Handler \ Resume_Handle \ Profile \ Endpoint \ @@ -1326,7 +1325,7 @@ realclean: Queued_Message.inl Asynch_Queued_Message.h Flushing_Strategy.h \ Thread_Lane_Resources.h \ Thread_Lane_Resources.i \ - debug.h Resume_Handle.h Resume_Handle.inl Notify_Handler.h \ + debug.h Resume_Handle.h Resume_Handle.inl \ Codeset_Manager.h \ CONV_FRAMEC.h \ Codeset_Translator_Factory.h \ @@ -1607,296 +1606,6 @@ realclean: $(ACE_ROOT)/ace/Thread_Manager.i \ ORB_Core.i debug.h -.obj/Notify_Handler.o .obj/Notify_Handler.so .shobj/Notify_Handler.o .shobj/Notify_Handler.so: Notify_Handler.cpp Notify_Handler.h \ - $(ACE_ROOT)/ace/pre.h \ - TAO_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/ACE_export.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Errno.inl \ - $(ACE_ROOT)/ace/OS_Dirent.inl \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Basic_Types.i \ - $(ACE_ROOT)/ace/OS_String.inl \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_Memory.inl \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/OS_TLI.inl \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/Time_Value.inl \ - $(ACE_ROOT)/ace/Default_Constants.h \ - $(ACE_ROOT)/ace/Global_Macros.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Event_Handler.i \ - Connection_Handler.h LF_CH_Event.h LF_Event.h LF_Event.inl \ - LF_Invocation_Event.inl \ - Connection_Handler.inl \ - Transport.h corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/CDR_Base.inl \ - orbconf.h \ - TAO_Export.h \ - corbafwd.i \ - Exception.h \ - corbafwd.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(ACE_ROOT)/ace/Exception_Macros.h \ - $(ACE_ROOT)/ace/SStringfwd.h \ - $(ACE_ROOT)/ace/iosfwd.h \ - Exception.i \ - Transport_Descriptor_Interface.h \ - Transport_Descriptor_Interface.inl \ - Transport_Cache_Manager.h \ - Cache_Entries.h \ - Transport_Descriptor_Interface.h \ - $(ACE_ROOT)/ace/Recyclable.h \ - $(ACE_ROOT)/ace/Recyclable.inl \ - Cache_Entries.inl \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/Flag_Manip.h \ - $(ACE_ROOT)/ace/Flag_Manip.i \ - $(ACE_ROOT)/ace/Handle_Ops.h \ - $(ACE_ROOT)/ace/Handle_Ops.i \ - $(ACE_ROOT)/ace/Lib_Find.h \ - $(ACE_ROOT)/ace/Lib_Find.i \ - $(ACE_ROOT)/ace/Init_ACE.h \ - $(ACE_ROOT)/ace/Init_ACE.i \ - $(ACE_ROOT)/ace/Sock_Connect.h \ - $(ACE_ROOT)/ace/Sock_Connect.i \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Functor.i \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \ - $(ACE_ROOT)/ace/Thread_Adapter.inl \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Unbounded_Queue.h \ - $(ACE_ROOT)/ace/Node.h \ - $(ACE_ROOT)/ace/Node.cpp \ - $(ACE_ROOT)/ace/Unbounded_Queue.inl \ - $(ACE_ROOT)/ace/Unbounded_Queue.cpp \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Unbounded_Set.h \ - $(ACE_ROOT)/ace/Unbounded_Set.inl \ - $(ACE_ROOT)/ace/Unbounded_Set.cpp \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/String_Base.h \ - $(ACE_ROOT)/ace/String_Base_Const.h \ - $(ACE_ROOT)/ace/String_Base.i \ - $(ACE_ROOT)/ace/String_Base.cpp \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Allocator.i \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Auto_Ptr.h \ - $(ACE_ROOT)/ace/Auto_Ptr.i \ - $(ACE_ROOT)/ace/Auto_Ptr.cpp \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/XML_Svc_Conf.h \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Test_and_Set.h \ - $(ACE_ROOT)/ace/Test_and_Set.i \ - $(ACE_ROOT)/ace/Test_and_Set.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - Transport_Cache_Manager.inl \ - Transport_Timer.h Incoming_Message_Queue.h Pluggable_Messaging_Utils.h \ - IOP_IORC.h \ - OctetSeqC.h \ - Sequence.h \ - Managed_Types.h \ - Managed_Types.i \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - Sequence.i \ - Sequence_T.h \ - Sequence_T.i \ - Sequence_T.cpp \ - Typecode.h \ - Exception.h \ - Pseudo_VarOut_T.h \ - Pseudo_VarOut_T.inl \ - Pseudo_VarOut_T.cpp \ - Typecode.i \ - Environment.h \ - Environment.i \ - Seq_Var_T.h \ - Seq_Var_T.inl \ - Seq_Var_T.cpp \ - Seq_Out_T.h \ - Seq_Out_T.inl \ - Seq_Out_T.cpp \ - OctetSeqC.i \ - VarOut_T.h \ - VarOut_T.inl \ - VarOut_T.cpp \ - CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(ACE_ROOT)/ace/CDR_Stream.i \ - CDR.i \ - IOP_IORC.i \ - Pluggable_Messaging_Utils.i \ - Incoming_Message_Queue.inl Synch_Refcountable.h \ - $(ACE_ROOT)/ace/Refcountable.h \ - $(ACE_ROOT)/ace/Refcountable.inl \ - Synch_Refcountable.inl Transport.inl ORB_Core.h ORB.h ServicesC.h \ - ServicesC.i CORBA_String.h \ - CORBA_String.inl \ - ObjectIdListC.h ObjectIdListC.i objectid.h PolicyC.h CurrentC.h \ - Object.h \ - Policy_ForwardC.h \ - Objref_VarOut_T.h \ - varbase.h \ - Objref_VarOut_T.inl \ - Objref_VarOut_T.cpp \ - Policy_ForwardC.i \ - Object_KeyC.h \ - Object_KeyC.i \ - Object.i \ - Any_Impl_T.h \ - Any.h \ - Any.i \ - Any_Impl_T.inl \ - Any_Impl_T.cpp \ - Marshal.h \ - Marshal.i \ - debug.h \ - CurrentC.i Policy_ForwardC.h Remote_Object_Proxy_Impl.h \ - Object_Proxy_Impl.h \ - PolicyC.i \ - ORB.i \ - Environment.h Policy_Manager.h \ - Policy_Set.h \ - PolicyC.h \ - Policy_Set.i \ - LocalObject.h \ - LocalObject.i \ - Policy_Manager.i \ - Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/DLL.h \ - $(ACE_ROOT)/ace/Service_Object.i \ - CONV_FRAMEC.h CONV_FRAMEC.i params.h \ - params.i \ - TAO_Singleton_Manager.h \ - TAO_Singleton_Manager.inl \ - TAO_Singleton.h \ - TAO_Singleton.inl \ - TAO_Singleton.cpp \ - TAO_Singleton.h \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - TAO_Singleton_Manager.h \ - Adapter.h Adapter.i PolicyFactory_Registry.h PortableInterceptorC.h \ - PI_ForwardC.h OctetSeqC.h StringSeqC.h Sequence.h StringSeqC.i \ - PI_ForwardC.i DynamicC.h \ - Any_Dual_Impl_T.h \ - Any_Dual_Impl_T.inl \ - Any_Dual_Impl_T.cpp \ - DynamicC.i Messaging_SyncScopeC.h Messaging_SyncScopeC.i IOPC.h \ - IOP_CodecC.h \ - IOP_CodecC.i \ - IOPC.i PortableInterceptorC.i \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - Parser_Registry.h \ - Parser_Registry.i \ - Service_Callbacks.h \ - IOPC.h \ - Service_Callbacks.i \ - Fault_Tolerance_Service.h \ - Fault_Tolerance_Service.i \ - Cleanup_Func_Registry.h \ - $(ACE_ROOT)/ace/Array_Base.h \ - $(ACE_ROOT)/ace/Array_Base.inl \ - $(ACE_ROOT)/ace/Array_Base.cpp \ - Cleanup_Func_Registry.inl Object_Ref_Table.h ObjectKey_Table.h \ - $(ACE_ROOT)/ace/RB_Tree.h \ - $(ACE_ROOT)/ace/RB_Tree.i \ - $(ACE_ROOT)/ace/RB_Tree.cpp \ - Interceptor_List.h Interceptor_List.inl PICurrent.h LocalObject.h \ - PICurrent.inl \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Exit.h \ - $(ACE_ROOT)/ace/Thread_Control.h \ - $(ACE_ROOT)/ace/Thread_Control.inl \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Framework_Component.h \ - $(ACE_ROOT)/ace/Framework_Component.inl \ - $(ACE_ROOT)/ace/Framework_Component_T.h \ - $(ACE_ROOT)/ace/Framework_Component_T.inl \ - $(ACE_ROOT)/ace/Framework_Component_T.cpp \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - ORB_Core.i Resume_Handle.h Resume_Handle.inl - .obj/Resume_Handle.o .obj/Resume_Handle.so .shobj/Resume_Handle.o .shobj/Resume_Handle.so: Resume_Handle.cpp Resume_Handle.h \ $(ACE_ROOT)/ace/pre.h \ TAO_Export.h \ diff --git a/TAO/tao/Notify_Handler.cpp b/TAO/tao/Notify_Handler.cpp deleted file mode 100644 index 22011d19569..00000000000 --- a/TAO/tao/Notify_Handler.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "Notify_Handler.h" -#include "Connection_Handler.h" -#include "Transport.h" -#include "ORB_Core.h" -#include "ace/Malloc_T.h" -#include "Resume_Handle.h" - -ACE_RCSID (tao, - Notify_Handler, - "$Id$") - -TAO_Notify_Handler::TAO_Notify_Handler (TAO_Transport *t, - ACE_HANDLE h, - ACE_Allocator *alloc) - : ACE_Event_Handler (t->orb_core ()->reactor ()), - // REFCNT: Matches with Notify_Handler::~Notify_Handler() - t_ (TAO_Transport::_duplicate (t)), - h_ (h), - allocator_ (alloc) -{ -} - -TAO_Notify_Handler::TAO_Notify_Handler (TAO_Connection_Handler *ch, - ACE_Allocator *alloc) - : ACE_Event_Handler (ch->transport ()->orb_core ()->reactor ()), - // REFCNT: Matches with Notify_Handler::~Notify_Handler() - t_ (ch->transport ()), - h_ (ACE_INVALID_HANDLE), - allocator_ (alloc) -{ - // This constructor should *never* get called, it is just here to - // for backward comptibility. - ACE_ASSERT (ch == 0); -} - -TAO_Notify_Handler::~TAO_Notify_Handler (void) -{ - TAO_Transport::release (this->t_); -} - - -/*static*/ TAO_Notify_Handler * -TAO_Notify_Handler::create_handler (TAO_Connection_Handler *, - ACE_Allocator *) -{ - return 0; -} - -/*static*/ TAO_Notify_Handler * -TAO_Notify_Handler::create_handler (TAO_Transport *t, - ACE_HANDLE h, - ACE_Allocator *alloc) -{ - TAO_Notify_Handler *nh = 0; - - if (alloc) - { - ACE_NEW_MALLOC_RETURN (nh, - ACE_static_cast ( - TAO_Notify_Handler *, - alloc->malloc (sizeof (TAO_Notify_Handler))), - TAO_Notify_Handler (t, - h, - alloc), - 0); - - return nh; - } - - return 0; -} - - -/*static*/ void -TAO_Notify_Handler::destroy_handler (TAO_Notify_Handler *nh) -{ - if (nh->allocator_) - { - ACE_DES_FREE (nh, - nh->allocator_->free, - TAO_Notify_Handler); - } - - return; -} - - -int -TAO_Notify_Handler::handle_input (ACE_HANDLE) -{ - // NOTE: We will do what the Connection_Handler will do with some - // exceptions though.. Quite a few things done are not required - // by the Notify_Handler at all. - - // Let the transport know that it is used - (void) this->t_->update_transport (); - - TAO_Resume_Handle resume_handle (this->t_->orb_core (), - this->h_); - - // Does return value matter? Not is my opinion. - (void) this->t_->handle_input_i (resume_handle); - - // Yes, we are wantedly returning this so that handle_close () would - // be called - return -1; -} - - -int -TAO_Notify_Handler::handle_close (ACE_HANDLE /*fd*/, - ACE_Reactor_Mask /*close_mask*/) -{ - TAO_Notify_Handler::destroy_handler (this); - return 0; -} diff --git a/TAO/tao/Notify_Handler.h b/TAO/tao/Notify_Handler.h deleted file mode 100644 index ebf9b9cc4de..00000000000 --- a/TAO/tao/Notify_Handler.h +++ /dev/null @@ -1,99 +0,0 @@ -// -*- C++ -*- - -//============================================================================= -/** - * @file Notify_Handler.h - * - * $Id$ - * - * @author Balchanadran Natarajan - */ -//============================================================================= - -#ifndef TAO_NOTIFY_HANDLER_H -#define TAO_NOTIFY_HANDLER_H -#include "ace/pre.h" - -#include "TAO_Export.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "ace/Event_Handler.h" -#include "ace/Global_Macros.h" - -class TAO_Transport; -class ACE_Allocator; -class TAO_Connection_Handler; - -/** - * @class TAO_Notify_Handler - * - * @brief Represents the handler used by the notify calls to the - * reactor within the ORB. - * - * Cluttering the *IOP handlers with the job of handling notify calls - * introduces problems as mentioned in [BUG 1230]. This special - * handler can help to avoid that problem by splitting the - * responsibilities between actual connection handling and notify - * handling that is done underneath the ORB. - */ -class TAO_Export TAO_Notify_Handler: public ACE_Event_Handler -{ -public: - - /// Dtor - ~TAO_Notify_Handler (void); - - /// NOTE: Needs to be deprecated. Just here for backward - /// compatibility - static TAO_Notify_Handler *create_handler (TAO_Connection_Handler *ch, - ACE_Allocator *alloc); - - /// Static method to create an instance of this object in the - /// memory pool - static TAO_Notify_Handler *create_handler (TAO_Transport *t, - ACE_HANDLE h, - ACE_Allocator *alloc); - - /// Static method to destroy an instance of this object - static void destroy_handler (TAO_Notify_Handler *nh); - - /// The standard handle_input method, it just redirects to the - /// connection handler - virtual int handle_input (ACE_HANDLE fd); - virtual int handle_close (ACE_HANDLE fd, - ACE_Reactor_Mask close_mask); - -protected: - - /// NOTE: Needs to be deprecated. - TAO_Notify_Handler (TAO_Connection_Handler *ch, - ACE_Allocator *alloc); - - /// Ctor - TAO_Notify_Handler (TAO_Transport *t, - ACE_HANDLE h, - ACE_Allocator *alloc); - -private: - - /// Preventing default ctor's. - ACE_UNIMPLEMENTED_FUNC (TAO_Notify_Handler (void)) - -private: - /// Our copy of the TAO_TRansport, reference count incremented - /// and stored. - TAO_Transport *t_; - - /// The handle that we should be concerened with - ACE_HANDLE h_; - - /// Our allocator - ACE_Allocator *allocator_; -}; - - -#include "ace/post.h" -#endif /*TAO_NOTIFY_HANDLER_H*/ diff --git a/TAO/tao/PortableServer/AMH_Response_Handler.cpp b/TAO/tao/PortableServer/AMH_Response_Handler.cpp index fbf1707511c..143241ec685 100644 --- a/TAO/tao/PortableServer/AMH_Response_Handler.cpp +++ b/TAO/tao/PortableServer/AMH_Response_Handler.cpp @@ -16,12 +16,13 @@ TAO_AMH_Response_Handler (TAO_ServerRequest &server_request) : mesg_base_ (server_request.mesg_base_) , request_id_ (server_request.request_id_) , response_expected_ (server_request.response_expected_) - , transport_ (TAO_Transport::_duplicate (server_request.transport ())) + , transport_ (server_request.transport ()) , orb_core_ (server_request.orb_core ()) , argument_flag_ (1) , exception_type_ (TAO_GIOP_NO_EXCEPTION) , reply_status_ (TAO_RS_UNINITIALIZED) { + this->transport_->add_reference (); } TAO_AMH_Response_Handler::~TAO_AMH_Response_Handler (void) @@ -34,10 +35,10 @@ TAO_AMH_Response_Handler::~TAO_AMH_Response_Handler (void) if (this->response_expected_ == 0) //oneway ? { // if client is not expecting anything, don't send anything - TAO_Transport::release (this->transport_); + this->transport_->remove_reference (); return; } - + // If the ResponseHandler is being destroyed before a reply has // been sent to the client, we send a system exception // CORBA::NO_RESPONSE, with minor code to indicate the problem. @@ -55,17 +56,17 @@ TAO_AMH_Response_Handler::~TAO_AMH_Response_Handler (void) this->_tao_rh_send_exception (ex ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; - TAO_Transport::release (this->transport_); + this->transport_->remove_reference (); } ACE_CATCHALL { - TAO_Transport::release (this->transport_); + this->transport_->remove_reference (); } ACE_ENDTRY; } else { - TAO_Transport::release (this->transport_); + this->transport_->remove_reference (); } } } @@ -140,7 +141,7 @@ TAO_AMH_Response_Handler::_tao_rh_send_reply (ACE_ENV_SINGLE_ARG_DECL) } // Send the message. - int result = this->transport_->send_message (this->_tao_out, + int result = this->transport_->send_message (this->_tao_out, 0, TAO_Transport::TAO_REPLY); @@ -180,7 +181,7 @@ TAO_AMH_Response_Handler::_tao_rh_send_exception (CORBA::Exception &ex } this->reply_status_ = TAO_RS_SENDING; } - + TAO_Pluggable_Reply_Params_Base reply_params; reply_params.request_id_ = this->request_id_; reply_params.svc_ctx_.length (0); @@ -192,14 +193,14 @@ TAO_AMH_Response_Handler::_tao_rh_send_exception (CORBA::Exception &ex // ExceptionHolder information. if (CORBA::SystemException::_downcast (&ex)) reply_params.reply_status_ = TAO_GIOP_SYSTEM_EXCEPTION; - + if (this->mesg_base_->generate_exception_reply (this->_tao_out, reply_params, ex) == -1) { ACE_THROW (CORBA::INTERNAL ()); } - + // Send the Exception if (this->transport_->send_message (this->_tao_out, 0, @@ -209,7 +210,7 @@ TAO_AMH_Response_Handler::_tao_rh_send_exception (CORBA::Exception &ex ACE_TEXT ("TAO: (%P|%t|%N|%l): ") ACE_TEXT ("TAO_AMH_Response_Handler: could not send exception reply\n"))); } - + { ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_); this->reply_status_ = TAO_RS_SENT; diff --git a/TAO/tao/Strategies/DIOP_Acceptor.cpp b/TAO/tao/Strategies/DIOP_Acceptor.cpp index 741c9e3834a..eff267c20f1 100644 --- a/TAO/tao/Strategies/DIOP_Acceptor.cpp +++ b/TAO/tao/Strategies/DIOP_Acceptor.cpp @@ -18,8 +18,8 @@ #include "DIOP_Acceptor.i" #endif /* __ACE_INLINE__ */ -ACE_RCSID (tao, - DIOP_Acceptor, +ACE_RCSID (tao, + DIOP_Acceptor, "$Id$") TAO_DIOP_Acceptor::TAO_DIOP_Acceptor (CORBA::Boolean flag) @@ -228,13 +228,12 @@ TAO_DIOP_Acceptor::close (void) if (this->connection_handler_->get_handle () != ACE_INVALID_HANDLE) { this->connection_handler_->reactor ()->remove_handler (this->connection_handler_, - ACE_Event_Handler::READ_MASK); - } - else - { - this->connection_handler_->handle_close (ACE_INVALID_HANDLE, - ACE_Event_Handler::ALL_EVENTS_MASK); + ACE_Event_Handler::READ_MASK | + ACE_Event_Handler::DONT_CALL); } + + this->connection_handler_->remove_reference (); + this->connection_handler_ = 0; } return 0; diff --git a/TAO/tao/Strategies/DIOP_Connection_Handler.cpp b/TAO/tao/Strategies/DIOP_Connection_Handler.cpp index 21be6692f27..0fb564fd24e 100644 --- a/TAO/tao/Strategies/DIOP_Connection_Handler.cpp +++ b/TAO/tao/Strategies/DIOP_Connection_Handler.cpp @@ -34,7 +34,7 @@ TAO_DIOP_Connection_Handler::TAO_DIOP_Connection_Handler (ACE_Thread_Manager *t) // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -52,12 +52,12 @@ TAO_DIOP_Connection_Handler::TAO_DIOP_Connection_Handler (TAO_ORB_Core *orb_core // store this pointer (indirectly increment ref count) this->transport (specific_transport); - TAO_Transport::release (specific_transport); } TAO_DIOP_Connection_Handler::~TAO_DIOP_Connection_Handler (void) { + delete this->transport (); this->udp_socket_.close (); } @@ -166,67 +166,64 @@ TAO_DIOP_Connection_Handler::close_connection (void) int TAO_DIOP_Connection_Handler::handle_input (ACE_HANDLE h) { - return this->handle_input_eh (h, this); + int result = + this->handle_input_eh (h, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int TAO_DIOP_Connection_Handler::handle_output (ACE_HANDLE handle) { - return this->handle_output_eh (handle, this); + int result = + this->handle_output_eh (handle, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int -TAO_DIOP_Connection_Handler::handle_close (ACE_HANDLE handle, - ACE_Reactor_Mask rm) +TAO_DIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, + const void *) { - return this->handle_close_eh (handle, rm, this); + // We don't use this upcall from the Reactor. However, we should + // override this since the base class returns -1 which will result + // in handle_close() getting called. + return 0; } int -TAO_DIOP_Connection_Handler::release_os_resources (void) +TAO_DIOP_Connection_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) { - return this->peer().close (); + ACE_ASSERT (0); + return 0; } -// @@ Frank: Hopefully this isn't needed -/* int -TAO_DIOP_Connection_Handler::process_listen_point_list ( - DIOP::ListenPointList &listen_list) +TAO_DIOP_Connection_Handler::close (u_long) { - // Get the size of the list - CORBA::ULong len = listen_list.length (); - - for (CORBA::ULong i = 0; i < len; ++ i) - { - DIOP::ListenPoint listen_point = listen_list[i]; - ACE_INET_Addr addr (listen_point.port, - listen_point.host.in ()); - - - // Construct an DIOP_Endpoint object - TAO_DIOP_Endpoint endpoint (addr, - 0); - - // Construct a property object - TAO_Base_Transport_Property prop (&endpoint); - - // Mark the connection as bidirectional - prop.set_bidir_flag (1); - - // The property for this handler has changed. Recache the - // handler with this property - int retval = this->transport ()->recache_transport (&prop); - if (retval == -1) - return retval; - - // Make the handler idle and ready for use - this->transport ()->make_idle (); - } - + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); + this->transport ()->remove_reference (); return 0; } -*/ + +int +TAO_DIOP_Connection_Handler::release_os_resources (void) +{ + return this->peer().close (); +} // **************************************************************** diff --git a/TAO/tao/Strategies/DIOP_Connection_Handler.h b/TAO/tao/Strategies/DIOP_Connection_Handler.h index 4fbf5155a7a..e234b8e74b7 100644 --- a/TAO/tao/Strategies/DIOP_Connection_Handler.h +++ b/TAO/tao/Strategies/DIOP_Connection_Handler.h @@ -102,6 +102,10 @@ public: virtual int open_handler (void *); //@} + /// Close called by the Acceptor or Connector when connection + /// establishment fails. + int close (u_long = 0); + //@{ /** @name Event Handler overloads */ @@ -110,6 +114,8 @@ public: virtual int handle_input (ACE_HANDLE); virtual int handle_output (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + virtual int handle_timeout (const ACE_Time_Value ¤t_time, + const void *act = 0); //@} /// Add ourselves to Cache. diff --git a/TAO/tao/Strategies/DIOP_Connector.cpp b/TAO/tao/Strategies/DIOP_Connector.cpp index cdfa8da9826..6eebb705664 100644 --- a/TAO/tao/Strategies/DIOP_Connector.cpp +++ b/TAO/tao/Strategies/DIOP_Connector.cpp @@ -24,30 +24,16 @@ ACE_RCSID (DIOP, #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Svc_Tuple; -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Entry*>; - +template class ACE_NonBlocking_Connect_Handler; template class ACE_Map_Entry; - -template class ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX>; template class ACE_Hash_Map_Iterator_Base_Ex < ACE_INET_Addr, TAO_DIOP_Connection_Handler *, ACE_Hash < ACE_INET_Addr >, ACE_Equal_To < ACE_INET_Addr >, ACE_Null_Mutex >; template class ACE_Hash_Map_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex>; template class ACE_Hash_Map_Reverse_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex>; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Svc_Tuple -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Entry*> +#pragma instantiate ACE_NonBlocking_Connect_Handler #pragma instantiate ACE_Map_Entry - -#pragma instantiate ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX> - #pragma instantiate ACE_Hash_Map_Iterator_Base_Ex < ACE_INET_Addr,TAO_DIOP_Connection_Handler *, ACE_Hash < ACE_INET_Addr >, ACE_Equal_To < ACE_INET_Addr >, ACE_Null_Mutex > #pragma instantiate ACE_Hash_Map_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex> #pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex, ACE_Equal_To, ACE_Null_Mutex> @@ -86,7 +72,7 @@ TAO_DIOP_Connector::close (void) while (!iter.done ()) { - (*iter).int_id_->decr_refcount(); + (*iter).int_id_->remove_reference (); iter++; } @@ -170,8 +156,8 @@ TAO_DIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, } // @@ Michael: We do not use regular connection management. - - transport = TAO_Transport::_duplicate (svc_handler->transport ()); + svc_handler->add_reference (); + transport = svc_handler->transport (); return 0; } diff --git a/TAO/tao/Strategies/DIOP_Transport.cpp b/TAO/tao/Strategies/DIOP_Transport.cpp index ea03fd05281..d4edd4c8c80 100644 --- a/TAO/tao/Strategies/DIOP_Transport.cpp +++ b/TAO/tao/Strategies/DIOP_Transport.cpp @@ -36,13 +36,6 @@ TAO_DIOP_Transport::TAO_DIOP_Transport (TAO_DIOP_Connection_Handler *handler, , connection_handler_ (handler) , messaging_object_ (0) { - if (connection_handler_ != 0) - { - // REFCNT: Matches one of - // TAO_Transport::connection_handler_close() or - // TAO_Transport::close_connection_shared. - this->connection_handler_->incr_refcount(); - } // @@ Michael: Set the input CDR size to ACE_MAX_DGRAM_SIZE so that // we read the whole UDP packet on a single read. if (flag) @@ -63,7 +56,6 @@ TAO_DIOP_Transport::TAO_DIOP_Transport (TAO_DIOP_Connection_Handler *handler, TAO_DIOP_Transport::~TAO_DIOP_Transport (void) { - ACE_ASSERT(this->connection_handler_ == 0); delete this->messaging_object_; } @@ -86,9 +78,9 @@ TAO_DIOP_Transport::messaging_object (void) } ssize_t -TAO_DIOP_Transport::send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *) +TAO_DIOP_Transport::send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *) { const ACE_INET_Addr &addr = this->connection_handler_->addr (); @@ -109,9 +101,9 @@ TAO_DIOP_Transport::send_i (iovec *iov, int iovcnt, } ssize_t -TAO_DIOP_Transport::recv_i (char *buf, - size_t len, - const ACE_Time_Value * /* max_wait_time */) +TAO_DIOP_Transport::recv (char *buf, + size_t len, + const ACE_Time_Value * /* max_wait_time */) { ACE_INET_Addr from_addr; @@ -136,7 +128,7 @@ TAO_DIOP_Transport::recv_i (char *buf, ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - %p \n"), ACE_TEXT ("TAO - read message failure ") - ACE_TEXT ("recv_i () \n"))); + ACE_TEXT ("recv () \n"))); } // Error handling @@ -161,9 +153,9 @@ TAO_DIOP_Transport::recv_i (char *buf, } int -TAO_DIOP_Transport::handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time, - int /*block*/) +TAO_DIOP_Transport::handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time, + int /*block*/) { // If there are no messages then we can go ahead to read from the // handle for further reading.. @@ -236,7 +228,7 @@ TAO_DIOP_Transport::handle_input_i (TAO_Resume_Handle &rh, int -TAO_DIOP_Transport::register_handler_i (void) +TAO_DIOP_Transport::register_handler (void) { // @@ Michael: // @@ -318,173 +310,4 @@ TAO_DIOP_Transport::messaging_init (CORBA::Octet major, return 1; } -// @@ Frank: Hopefully DIOP doesn't need this -/* -int -TAO_DIOP_Transport::tear_listen_point_list (TAO_InputCDR &cdr) -{ - CORBA::Boolean byte_order; - if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0) - return -1; - - cdr.reset_byte_order (ACE_static_cast(int,byte_order)); - - DIOP::ListenPointList listen_list; - if ((cdr >> listen_list) == 0) - return -1; - - // As we have received a bidirectional information, set the flag to - // 1 - this->bidirectional_flag (1); - return this->connection_handler_->process_listen_point_list (listen_list); -} -*/ - - - -// @@ Frank: Hopefully DIOP doesn't need this -/* -void -TAO_DIOP_Transport::set_bidir_context_info (TAO_Operation_Details &opdetails) -{ - - // Get a handle on to the acceptor registry - TAO_Acceptor_Registry * ar = - this->orb_core ()->acceptor_registry (); - - - // Get the first acceptor in the registry - TAO_AcceptorSetIterator acceptor = ar->begin (); - - DIOP::ListenPointList listen_point_list; - - for (; - acceptor != ar->end (); - acceptor++) - { - // Check whether it is a DIOP acceptor - if ((*acceptor)->tag () == TAO_TAG_UDP_PROFILE) - { - this->get_listen_point (listen_point_list, - *acceptor); - } - } - - // We have the ListenPointList at this point. Create a output CDR - // stream at this point - TAO_OutputCDR cdr; - - // Marshall the information into the stream - if ((cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER)== 0) - || (cdr << listen_point_list) == 0) - return; - - // Add this info in to the svc_list - opdetails.service_context ().set_context (IOP::BI_DIR_DIOP, - cdr); - - return; -} - - -int -TAO_DIOP_Transport::get_listen_point ( - DIOP::ListenPointList &listen_point_list, - TAO_Acceptor *acceptor) -{ - TAO_DIOP_Acceptor *iiop_acceptor = - ACE_dynamic_cast (TAO_DIOP_Acceptor *, - acceptor ); - - // Get the array of endpoints serviced by - const ACE_INET_Addr *endpoint_addr = - iiop_acceptor->endpoints (); - - // Get the count - size_t count = - iiop_acceptor->endpoint_count (); - - // Get the local address of the connection - ACE_INET_Addr local_addr; - - if (this->connection_handler_->peer ().get_local_addr (local_addr) - == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT ("(%P|%t) Could not resolve local host") - ACE_TEXT (" address in set_bidir_context_info () \n")), - -1); - } - - - // Note: Looks like there is no point in sending the list of - // endpoints on interfaces on which this connection has not - // been established. If this is wrong, please correct me. - char *local_interface = 0; - - // Get the hostname for the local address - if (iiop_acceptor->hostname (this->orb_core_, - local_addr, - local_interface) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT ("(%P|%t) Could not resolve local host") - ACE_TEXT (" name \n")), - -1); - } - - ACE_INET_Addr *tmp_addr = ACE_const_cast (ACE_INET_Addr *, - endpoint_addr); - - for (size_t index = 0; - index <= count; - index++) - { - // Get the listen point on that acceptor if it has the same - // interface on which this connection is established - char *acceptor_interface = 0; - - if (iiop_acceptor->hostname (this->orb_core_, - tmp_addr[index], - acceptor_interface) == -1) - continue; - - // @@ This is very bad for performance, but it is a one time - // affair - if (ACE_OS::strcmp (local_interface, - acceptor_interface) == 0) - { - // We have the connection and the acceptor endpoint on the - // same interface - DIOP::ListenPoint point; - point.host = CORBA::string_dup (local_interface); - point.port = endpoint_addr[index].get_port_number (); - - // Get the count of the number of elements - CORBA::ULong len = listen_point_list.length (); - - // Increase the length by 1 - listen_point_list.length (len + 1); - - // Add the new length to the list - listen_point_list[len] = point; - } - - // @@ This is bad.... - CORBA::string_free (acceptor_interface); - } - - CORBA::string_free (local_interface); - return 1; -} -*/ - -TAO_Connection_Handler * -TAO_DIOP_Transport::invalidate_event_handler_i (void) -{ - TAO_Connection_Handler * eh = this->connection_handler_; - this->connection_handler_ = 0; - return eh; -} - #endif /* TAO_HAS_DIOP && TAO_HAS_DIOP != 0 */ diff --git a/TAO/tao/Strategies/DIOP_Transport.h b/TAO/tao/Strategies/DIOP_Transport.h index c47c60d1a93..1ffe7064ff2 100644 --- a/TAO/tao/Strategies/DIOP_Transport.h +++ b/TAO/tao/Strategies/DIOP_Transport.h @@ -63,9 +63,9 @@ public: ~TAO_DIOP_Transport (void); /// Look for the documentation in Transport.h. - virtual int handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time = 0, - int block = 0); + virtual int handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time = 0, + int block = 0); protected: /** @name Overridden Template Methods * @@ -75,21 +75,20 @@ protected: virtual ACE_Event_Handler * event_handler_i (void); virtual TAO_Connection_Handler *connection_handler_i (void); - virtual TAO_Connection_Handler * invalidate_event_handler_i (void); virtual TAO_Pluggable_Messaging *messaging_object (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *max_wait_time); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time); /// Read len bytes from into buf. - virtual ssize_t recv_i (char *buf, - size_t len, - const ACE_Time_Value *s = 0); + virtual ssize_t recv (char *buf, + size_t len, + const ACE_Time_Value *s = 0); - virtual int register_handler_i (void); + virtual int register_handler (void); ///@} public: diff --git a/TAO/tao/Strategies/SCIOP_Connection_Handler.cpp b/TAO/tao/Strategies/SCIOP_Connection_Handler.cpp index 187dae6aaa6..dcd9b6e9967 100644 --- a/TAO/tao/Strategies/SCIOP_Connection_Handler.cpp +++ b/TAO/tao/Strategies/SCIOP_Connection_Handler.cpp @@ -39,7 +39,7 @@ TAO_SCIOP_Connection_Handler::TAO_SCIOP_Connection_Handler (ACE_Thread_Manager * // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -57,7 +57,6 @@ TAO_SCIOP_Connection_Handler::TAO_SCIOP_Connection_Handler (TAO_ORB_Core *orb_co // store this pointer (indirectly increment ref count) this->transport (specific_transport); - TAO_Transport::release (specific_transport); } TAO_SCIOP_Connection_Handler::TAO_SCIOP_Connection_Handler (TAO_ORB_Core *orb_core, @@ -73,6 +72,7 @@ TAO_SCIOP_Connection_Handler::TAO_SCIOP_Connection_Handler (TAO_ORB_Core *orb_co TAO_SCIOP_Connection_Handler::~TAO_SCIOP_Connection_Handler (void) { + delete this->transport (); } int @@ -174,20 +174,57 @@ TAO_SCIOP_Connection_Handler::close_connection (void) int TAO_SCIOP_Connection_Handler::handle_input (ACE_HANDLE h) { - return this->handle_input_eh (h, this); + int result = + this->handle_input_eh (h, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int TAO_SCIOP_Connection_Handler::handle_output (ACE_HANDLE handle) { - return this->handle_output_eh (handle, this); + int result = + this->handle_output_eh (handle, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; +} + +int +TAO_SCIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, + const void *) +{ + // We don't use this upcall for I/O. This is only used by the + // Connector to indicate that the connection timedout. Therefore, + // we should call close(). + return this->close (); } int -TAO_SCIOP_Connection_Handler::handle_close (ACE_HANDLE handle, - ACE_Reactor_Mask rm) +TAO_SCIOP_Connection_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) { - return this->handle_close_eh (handle, rm, this); + ACE_ASSERT (0); + return 0; +} + +int +TAO_SCIOP_Connection_Handler::close (u_long) +{ + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); + this->transport ()->remove_reference (); + return 0; } int diff --git a/TAO/tao/Strategies/SCIOP_Connection_Handler.h b/TAO/tao/Strategies/SCIOP_Connection_Handler.h index 2d7b694793e..b3492dc1504 100644 --- a/TAO/tao/Strategies/SCIOP_Connection_Handler.h +++ b/TAO/tao/Strategies/SCIOP_Connection_Handler.h @@ -96,8 +96,9 @@ public: */ -class TAO_Strategies_Export TAO_SCIOP_Connection_Handler : public TAO_SCIOP_SVC_HANDLER, - public TAO_Connection_Handler +class TAO_Strategies_Export TAO_SCIOP_Connection_Handler + : public TAO_SCIOP_SVC_HANDLER, + public TAO_Connection_Handler { public: @@ -121,6 +122,10 @@ public: virtual int open_handler (void *); //@} + /// Close called by the Acceptor or Connector when connection + /// establishment fails. + int close (u_long = 0); + //@{ /** @name Event Handler overloads */ @@ -129,6 +134,8 @@ public: virtual int handle_input (ACE_HANDLE); virtual int handle_output (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + virtual int handle_timeout (const ACE_Time_Value ¤t_time, + const void *act = 0); //@} /// Add ourselves to Cache. diff --git a/TAO/tao/Strategies/SCIOP_Connector.cpp b/TAO/tao/Strategies/SCIOP_Connector.cpp index 2be650999a0..24aaccf8eed 100644 --- a/TAO/tao/Strategies/SCIOP_Connector.cpp +++ b/TAO/tao/Strategies/SCIOP_Connector.cpp @@ -157,124 +157,205 @@ TAO_SCIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, TAO_SCIOP_Endpoint *sciop_endpoint = this->remote_endpoint (desc->endpoint ()); - if (sciop_endpoint == 0) - return -1; - - const ACE_INET_Addr &remote_address = - sciop_endpoint->object_addr (); + if (sciop_endpoint == 0) + return -1; - if (TAO_debug_level > 2) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SCIOP_Connector::make_connection, " - "to <%s:%d>\n", - sciop_endpoint->host(), sciop_endpoint->port())); + const ACE_INET_Addr &remote_address = + sciop_endpoint->object_addr (); - // Get the right synch options - ACE_Synch_Options synch_options; + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - SCIOP_Connector::make_connection, " + "to <%s:%d>\n", + sciop_endpoint->host(), sciop_endpoint->port())); - this->active_connect_strategy_->synch_options (max_wait_time, - synch_options); + // Get the right synch options + ACE_Synch_Options synch_options; - TAO_SCIOP_Connection_Handler *svc_handler = 0; + this->active_connect_strategy_->synch_options (max_wait_time, + synch_options); - // Active connect - int result = this->base_connector_.connect (svc_handler, - remote_address, - synch_options); + TAO_SCIOP_Connection_Handler *svc_handler = 0; - if (result == -1 && errno == EWOULDBLOCK) - { - if (TAO_debug_level > 2) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SCIOP_Connector::make_connection, " - "going to wait for connection completion on local" - "handle [%d]\n", - svc_handler->get_handle ())); - - result = - this->active_connect_strategy_->wait (svc_handler, - max_wait_time); - - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SCIOP_Connector::make_connection" - "wait done for handle[%d], result = %d\n", - svc_handler->get_handle (), result)); - } + // Connect. + int result = this->base_connector_.connect (svc_handler, + remote_address, + synch_options); - } - - int status = - svc_handler->is_finalized (); - - // Reduce the refcount to the svc_handler that we have. The - // increment to the handler is done in make_svc_handler (). Now - // that we dont need the reference to it anymore we can decrement - // the refcount whether the connection is successful ot not. - // REFCNT: Matches with TAO_Connect_Strategy<>::make_svc_handler() - long refcount = svc_handler->decr_refcount (); - - ACE_ASSERT (refcount >= 0); - - ACE_UNUSED_ARG (refcount); + // This call creates the service handler and bumps the #REFCOUNT# up + // one extra. There are three possibilities: (a) connection + // succeeds immediately - in this case, the #REFCOUNT# on the + // handler is two; (b) connection completion is pending - in this + // case, the #REFCOUNT# on the handler is also two; (c) connection + // fails immediately - in this case, the #REFCOUNT# on the handler + // is one since close() gets called on the handler. + // + // The extra reference count in + // TAO_Connect_Creation_Strategy::make_svc_handler() is needed in + // the case when connection completion is pending and we are going + // to wait on a variable in the handler to changes, signifying + // success or failure. Note, that this increment cannot be done + // once the connect() returns since this might be too late if + // another thread pick up the completion and potentially deletes the + // handler before we get a chance to increment the reference count. + + // No immediate result. Wait for completion. + if (result == -1 && errno == EWOULDBLOCK) + { + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - SCIOP_Connector::make_connection, " + "going to wait for connection completion on local" + "handle [%d]\n", + svc_handler->get_handle ())); + + // Wait for connection completion. No need to specify timeout + // to wait() since the correct timeout was passed to the + // Connector. The Connector will close the handler in the case + // of timeouts, so the event will complete (either success or + // failure) within timeout. + result = + this->active_connect_strategy_->wait (svc_handler, + 0); + + if (TAO_debug_level > 2) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - SCIOP_Connector::make_connection" + "wait done for handle[%d], result = %d\n", + svc_handler->get_handle (), result)); + } + + // There are three possibilities when wait() returns: (a) + // connection succeeded; (b) connection failed; (c) wait() + // failed because of some other error. It is easy to deal with + // (a) and (b). (c) is tricky since the connection is still + // pending and may get completed by some other thread. The + // following code deals with (c). + + // Check if the handler has been closed. + int closed = + svc_handler->is_closed (); + + // In case of failures and close() has not be called. + if (result == -1 && + !closed) + { + // First, cancel from connector. + this->base_connector_.cancel (svc_handler); + + // Double check to make sure the handler has not been closed + // yet. This double check is required to ensure that the + // connection handler was not closed yet by some other + // thread since it was still registered with the connector. + // Once connector.cancel() has been processed, we are + // assured that the connector will no longer open/close this + // handler. + closed = + svc_handler->is_closed (); + + // If closed, there is nothing to do here. If not closed, + // it was either opened or is still pending. + if (!closed) + { + // Check if the handler has been opened. + int open = + svc_handler->is_open (); + + // Some other thread was able to open the handler even + // though wait failed for this thread. + if (open) + // Overwrite . + result = 0; + else + { + // Assert that it is still connecting. + ACE_ASSERT (svc_handler->is_connecting ()); + + // Force close the handler now. + svc_handler->close (); + } + } + } + } - if (result == -1) - { - // Give users a clue to the problem. - if (TAO_debug_level) - { - ACE_DEBUG ((LM_ERROR, - "TAO (%P|%t) - SCIOP_Connector::make_connection, " - "connection to <%s:%d> failed (%p)\n", - sciop_endpoint->host (), sciop_endpoint->port (), - "errno")); - } + // Irrespective of success or failure, remove the extra #REFCOUNT#. + svc_handler->remove_reference (); - (void) this->active_connect_strategy_->post_failed_connect (svc_handler, - status); + // In case of errors. + if (result == -1) + { + // Give users a clue to the problem. + if (TAO_debug_level) + { + ACE_DEBUG ((LM_ERROR, + "TAO (%P|%t) - SCIOP_Connector::make_connection, " + "connection to <%s:%d> failed (%p)\n", + sciop_endpoint->host (), sciop_endpoint->port (), + "errno")); + } + + return -1; + } - return -1; - } + // At this point, the connection has be successfully connected. + // #REFCOUNT# is one. + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - SCIOP_Connector::make_connection, " + "new connection to <%s:%d> on Transport[%d]\n", + sciop_endpoint->host (), sciop_endpoint->port (), + svc_handler->peer ().get_handle ())); + + TAO_Transport *transport = + svc_handler->transport (); + + // Add the handler to Cache + int retval = + this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, + base_transport); + + // Failure in adding to cache. + if (retval != 0) + { + // Close the handler. + svc_handler->close (); - if (TAO_debug_level > 2) - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SCIOP_Connector::make_connection, " - "new connection to <%s:%d> on Transport[%d]\n", - sciop_endpoint->host (), sciop_endpoint->port (), - svc_handler->peer ().get_handle ())); + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - SCIOP_Connector::make_connection, " + "could not add the new connection to cache\n")); + } - TAO_Transport *base_transport = - TAO_Transport::_duplicate (svc_handler->transport ()); + return -1; + } - // Add the handler to Cache - int retval = - this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, - base_transport); + // Registration failures. + if (retval != 0) + { + // Purge from the connection cache. + transport->purge_entry (); - if (retval != 0 && TAO_debug_level > 0) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SCIOP_Connector::make_connection, " - "could not add the new connection to cache\n")); - } + // Close the handler. + svc_handler->close (); - // If the wait strategy wants us to be registered with the reactor - // then we do so. - retval = base_transport->wait_strategy ()->register_handler (); + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - SCIOP_Connector::make_connection, " + "could not register the new connection in the reactor\n")); + } - if (retval != 0 && TAO_debug_level > 0) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SCIOP_Connector::make_connection, " - "could not register the new connection in the reactor\n")); - } + return -1; + } - // Handover the transport pointer to the Invocation class. - TAO_Transport *&transport = invocation->transport (); - transport = base_transport; + // Handover the transport pointer to the Invocation class. + TAO_Transport *&invocation_transport = + invocation->transport (); + invocation_transport = transport; - return 0; + return 0; } diff --git a/TAO/tao/Strategies/SCIOP_Transport.cpp b/TAO/tao/Strategies/SCIOP_Transport.cpp index 75cde3d8814..14eec2c17c2 100644 --- a/TAO/tao/Strategies/SCIOP_Transport.cpp +++ b/TAO/tao/Strategies/SCIOP_Transport.cpp @@ -41,13 +41,6 @@ TAO_SCIOP_Transport::TAO_SCIOP_Transport (TAO_SCIOP_Connection_Handler *handler, , connection_handler_ (handler) , messaging_object_ (0) { - if (connection_handler_ != 0) - { - // REFCNT: Matches one of - // TAO_Transport::connection_handler_close() or - // TAO_Transport::close_connection_shared. - this->connection_handler_->incr_refcount(); - } if (flag) { // Use the lite version of the protocol @@ -64,7 +57,6 @@ TAO_SCIOP_Transport::TAO_SCIOP_Transport (TAO_SCIOP_Connection_Handler *handler, TAO_SCIOP_Transport::~TAO_SCIOP_Transport (void) { - ACE_ASSERT(this->connection_handler_ == 0); delete this->messaging_object_; } @@ -87,9 +79,9 @@ TAO_SCIOP_Transport::messaging_object (void) } ssize_t -TAO_SCIOP_Transport::send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *max_wait_time) +TAO_SCIOP_Transport::send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt, max_wait_time); @@ -100,9 +92,9 @@ TAO_SCIOP_Transport::send_i (iovec *iov, int iovcnt, } ssize_t -TAO_SCIOP_Transport::recv_i (char *buf, - size_t len, - const ACE_Time_Value *max_wait_time) +TAO_SCIOP_Transport::recv (char *buf, + size_t len, + const ACE_Time_Value *max_wait_time) { ssize_t n = this->connection_handler_->peer ().recv (buf, len, @@ -115,7 +107,7 @@ TAO_SCIOP_Transport::recv_i (char *buf, errno != ETIME) { ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - SCIOP_Transport[%d]::recv_i, ") + ACE_TEXT ("TAO (%P|%t) - SCIOP_Transport[%d]::recv, ") ACE_TEXT ("read failure - %m\n"), this->id ())); } @@ -142,32 +134,6 @@ TAO_SCIOP_Transport::recv_i (char *buf, return n; } -int -TAO_SCIOP_Transport::register_handler_i (void) -{ - if (TAO_debug_level > 4) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SCIOP_Transport[%d]::register_handler\n", - this->id ())); - } - - ACE_Reactor *r = this->orb_core_->reactor (); - - if (r == this->connection_handler_->reactor ()) - return 0; - - // Set the flag in the Connection Handler and in the Wait Strategy - // @@Maybe we should set these flags after registering with the - // reactor. What if the registration fails??? - this->ws_->is_registered (1); - - // Register the handler with the reactor - return r->register_handler (this->connection_handler_, - ACE_Event_Handler::READ_MASK); -} - - int TAO_SCIOP_Transport::send_request (TAO_Stub *stub, TAO_ORB_Core *orb_core, @@ -184,12 +150,6 @@ TAO_SCIOP_Transport::send_request (TAO_Stub *stub, if (tph != 0) { - ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->handler_lock_, -1); - - if (this->check_event_handler_i ("SCIOP_Transport::send_request") - == -1) - return -1; - const char protocol[] = "sciop"; const char * protocol_type = protocol; @@ -270,9 +230,6 @@ TAO_SCIOP_Transport::send_message_shared (TAO_Stub *stub, { ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->handler_lock_, -1); - if (this->check_event_handler_i ("SCIOP_Transport::send_message_shared") == -1) - return -1; - if (TAO_debug_level > 6) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - ") @@ -350,17 +307,6 @@ TAO_SCIOP_Transport::tear_listen_point_list (TAO_InputCDR &cdr) // 1 (i.e., non-originating side) this->bidirectional_flag (1); - // Just make sure that the connection handler is sane before we go - // head and do anything with it. - ACE_GUARD_RETURN (ACE_Lock, - ace_mon, - *this->handler_lock_, - -1); - - if (this->check_event_handler_i ("SCIOP_Transport::tear_listen_point_list") - == -1) - return -1; - return this->connection_handler_->process_listen_point_list (listen_list); } @@ -430,29 +376,17 @@ TAO_SCIOP_Transport::get_listen_point ( // Get the local address of the connection ACE_INET_Addr local_addr; - { - // Just make sure that the connection handler is sane before we go - // head and do anything with it. - ACE_GUARD_RETURN (ACE_Lock, - ace_mon, - *this->handler_lock_, - -1); - - if (this->check_event_handler_i ("IIOP_Transport::get_listen_point") - == -1) - return -1; - - if (this->connection_handler_->peer ().get_local_addr (local_addr) - == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT ("(%P|%t) Could not resolve local ") - ACE_TEXT ("host address in ") - ACE_TEXT ("get_listen_point()\n")), - -1); - } - } - + + if (this->connection_handler_->peer ().get_local_addr (local_addr) + == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("(%P|%t) Could not resolve local ") + ACE_TEXT ("host address in ") + ACE_TEXT ("get_listen_point()\n")), + -1); + } + // Note: Looks like there is no point in sending the list of // endpoints on interfaces on which this connection has not // been established. If this is wrong, please correct me. @@ -493,12 +427,4 @@ TAO_SCIOP_Transport::get_listen_point ( return 1; } -TAO_Connection_Handler * -TAO_SCIOP_Transport::invalidate_event_handler_i (void) -{ - TAO_Connection_Handler * eh = this->connection_handler_; - this->connection_handler_ = 0; - return eh; -} - #endif /* TAO_HAS_SCIOP == 1 */ diff --git a/TAO/tao/Strategies/SCIOP_Transport.h b/TAO/tao/Strategies/SCIOP_Transport.h index fe3905ae174..770be64e55d 100644 --- a/TAO/tao/Strategies/SCIOP_Transport.h +++ b/TAO/tao/Strategies/SCIOP_Transport.h @@ -70,25 +70,22 @@ protected: //@{ virtual ACE_Event_Handler * event_handler_i (void); - virtual TAO_Connection_Handler * invalidate_event_handler_i (void); /// Access the underlying messaging object virtual TAO_Pluggable_Messaging *messaging_object (void); - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout = 0); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0); - virtual ssize_t recv_i (char *buf, - size_t len, - const ACE_Time_Value *s = 0); - - virtual int register_handler_i (void); + virtual ssize_t recv (char *buf, + size_t len, + const ACE_Time_Value *s = 0); virtual int send_message_shared (TAO_Stub *stub, - int message_semantics, - const ACE_Message_Block *message_block, - ACE_Time_Value *max_wait_time); + int message_semantics, + const ACE_Message_Block *message_block, + ACE_Time_Value *max_wait_time); public: @@ -151,4 +148,3 @@ private: #include "ace/post.h" #endif /* TAO_SCIOP_TRANSPORT_H */ - diff --git a/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp b/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp index 6ff58729342..826317a92c9 100644 --- a/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp +++ b/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp @@ -31,7 +31,7 @@ TAO_SHMIOP_Connection_Handler::TAO_SHMIOP_Connection_Handler (ACE_Thread_Manager // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -47,12 +47,12 @@ TAO_SHMIOP_Connection_Handler::TAO_SHMIOP_Connection_Handler (TAO_ORB_Core *orb_ // store this pointer (indirectly increment ref count) this->transport (specific_transport); - TAO_Transport::release (specific_transport); } TAO_SHMIOP_Connection_Handler::~TAO_SHMIOP_Connection_Handler (void) { + delete this->transport (); } int @@ -133,20 +133,57 @@ TAO_SHMIOP_Connection_Handler::close_connection (void) int TAO_SHMIOP_Connection_Handler::handle_input (ACE_HANDLE h) { - return this->handle_input_eh (h, this); + int result = + this->handle_input_eh (h, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int TAO_SHMIOP_Connection_Handler::handle_output (ACE_HANDLE handle) { - return this->handle_output_eh (handle, this); + int result = + this->handle_output_eh (handle, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; +} + +int +TAO_SHMIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, + const void *) +{ + // We don't use this upcall for I/O. This is only used by the + // Connector to indicate that the connection timedout. Therefore, + // we should call close(). + return this->close (); } int -TAO_SHMIOP_Connection_Handler::handle_close (ACE_HANDLE handle, - ACE_Reactor_Mask rm) +TAO_SHMIOP_Connection_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) { - return this->handle_close_eh (handle, rm, this); + ACE_ASSERT (0); + return 0; +} + +int +TAO_SHMIOP_Connection_Handler::close (u_long) +{ + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); + this->transport ()->remove_reference (); + return 0; } int diff --git a/TAO/tao/Strategies/SHMIOP_Connection_Handler.h b/TAO/tao/Strategies/SHMIOP_Connection_Handler.h index fd1d046a43b..12562a37adf 100644 --- a/TAO/tao/Strategies/SHMIOP_Connection_Handler.h +++ b/TAO/tao/Strategies/SHMIOP_Connection_Handler.h @@ -71,6 +71,10 @@ public: virtual int open_handler (void *); //@} + /// Close called by the Acceptor or Connector when connection + /// establishment fails. + int close (u_long = 0); + //@{ /** @name Event Handler overloads */ @@ -79,6 +83,8 @@ public: virtual int handle_input (ACE_HANDLE); virtual int handle_output (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + virtual int handle_timeout (const ACE_Time_Value ¤t_time, + const void *act = 0); //@} /// Add ourselves to Cache. diff --git a/TAO/tao/Strategies/SHMIOP_Connector.cpp b/TAO/tao/Strategies/SHMIOP_Connector.cpp index 4a4d28a04c4..24f53525d68 100644 --- a/TAO/tao/Strategies/SHMIOP_Connector.cpp +++ b/TAO/tao/Strategies/SHMIOP_Connector.cpp @@ -29,13 +29,7 @@ template class TAO_Connect_Creation_Strategy; template class ACE_Strategy_Connector; template class ACE_Connect_Strategy; template class ACE_Connector; -template class ACE_Svc_Tuple; - -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Entry*>; -template class ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX>; +template class ACE_NonBlocking_Connect_Handler; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) @@ -44,13 +38,7 @@ template class ACE_Map_Reverse_Iterator #pragma instantiate ACE_Connect_Strategy #pragma instantiate ACE_Connector -#pragma instantiate ACE_Svc_Tuple - -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Entry*> -#pragma instantiate ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX> +#pragma instantiate ACE_NonBlocking_Connect_Handler #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ @@ -145,7 +133,7 @@ TAO_SHMIOP_Connector::set_validate_endpoint (TAO_Endpoint *endpoint) if (TAO_debug_level > 0) { ACE_DEBUG ((LM_DEBUG, - ACE_LIB_TEXT ("TAO (%P|%t) IIOP connection failed.\n") + ACE_LIB_TEXT ("TAO (%P|%t) SHMIOP connection failed.\n") ACE_LIB_TEXT ("TAO (%P|%t) This is most likely ") ACE_LIB_TEXT ("due to a hostname lookup ") ACE_LIB_TEXT ("failure.\n"))); @@ -177,9 +165,6 @@ TAO_SHMIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, const ACE_INET_Addr &remote_address = shmiop_endpoint->object_addr (); - - TAO_SHMIOP_Connection_Handler *svc_handler = 0; - if (TAO_debug_level > 2) ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) SHMIOP_Connector::connect ") @@ -191,27 +176,25 @@ TAO_SHMIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, this->active_connect_strategy_->synch_options (max_wait_time, synch_options); + TAO_SHMIOP_Connection_Handler *svc_handler = 0; + + // Connect. int result = this->base_connector_.connect (svc_handler, remote_address, synch_options); - int status = svc_handler->is_finalized (); - // Reduce the refcount to the svc_handler that we have. The - // increment to the handler is done in make_svc_handler (). Now - // that we dont need the reference to it anymore we can decrement - // the refcount whether the connection is successful ot not. - long refcount = svc_handler->decr_refcount (); - - ACE_ASSERT (refcount >= 0); - ACE_UNUSED_ARG (refcount); + // This call creates the service handler and bumps the #REFCOUNT# up + // one extra. There are two possibilities: (a) connection succeeds + // immediately - in this case, the #REFCOUNT# on the handler is two; + // (b) connection fails immediately - in this case, the #REFCOUNT# + // on the handler is one since close() gets called on the handler. + // We always use a blocking connection so the connection is never + // pending. - // = We dont do a wait since we know that we are doing a blocking - // connect - if (TAO_debug_level > 4) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%P|%t) SHMIOP_Connector::connect ") - ACE_TEXT ("The result is <%d> \n"), result)); + // Irrespective of success or failure, remove the extra #REFCOUNT#. + svc_handler->remove_reference (); + // In case of errors. if (result == -1) { // Give users a clue to the problem. @@ -227,47 +210,74 @@ TAO_SHMIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, ACE_TEXT ("errno"))); } - (void) this->active_connect_strategy_->post_failed_connect (svc_handler, - status); - return -1; } - TAO_Transport *base_transport = - TAO_Transport::_duplicate (svc_handler->transport ()); + // At this point, the connection has be successfully connected. + // #REFCOUNT# is one. + if (TAO_debug_level > 2) + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - SHMIOP_Connector::make_connection, " + "new connection to <%s:%d> on Transport[%d]\n", + shmiop_endpoint->host (), shmiop_endpoint->port (), + svc_handler->peer ().get_handle ())); + + TAO_Transport *transport = + svc_handler->transport (); // Add the handler to Cache int retval = this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, - base_transport); + transport); - if (retval != 0 && TAO_debug_level > 0) + // Failure in adding to cache. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%P|%t) SHMIOP_Connector::connect ") - ACE_TEXT ("could not add the new connection to Cache \n"))); - } + // Close the handler. + svc_handler->close (); + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - SHMIOP_Connector::make_connection, " + "could not add the new connection to cache\n")); + } + + return -1; + } // If the wait strategy wants us to be registered with the reactor - // then we do so. - retval = base_transport->wait_strategy ()->register_handler (); + // then we do so. If registeration is required and it succeeds, + // #REFCOUNT# becomes two. + retval = transport->wait_strategy ()->register_handler (); - if (retval != 0 && TAO_debug_level > 0) + // Registration failures. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_LIB_TEXT ("(%P|%t) IIOP_Connector::connect ") - ACE_LIB_TEXT ("could not add the new connection to reactor \n"))); + // Purge from the connection cache. + transport->purge_entry (); + + // Close the handler. + svc_handler->close (); + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - SHMIOP_Connector::make_connection, " + "could not register the new connection in the reactor\n")); + } + + return -1; } // Handover the transport pointer to the Invocation class. - TAO_Transport *&transport = invocation->transport (); - transport = base_transport; + TAO_Transport *&invocation_transport = + invocation->transport (); + invocation_transport = transport; return 0; } - TAO_Profile * TAO_SHMIOP_Connector::create_profile (TAO_InputCDR& cdr) { diff --git a/TAO/tao/Strategies/SHMIOP_Transport.cpp b/TAO/tao/Strategies/SHMIOP_Transport.cpp index 4151467e50f..77ef4957f7c 100644 --- a/TAO/tao/Strategies/SHMIOP_Transport.cpp +++ b/TAO/tao/Strategies/SHMIOP_Transport.cpp @@ -34,13 +34,6 @@ TAO_SHMIOP_Transport::TAO_SHMIOP_Transport (TAO_SHMIOP_Connection_Handler *handl connection_handler_ (handler), messaging_object_ (0) { - if (connection_handler_ != 0) - { - // REFCNT: Matches one of - // TAO_Transport::connection_handler_close() or - // TAO_Transport::close_connection_shared. - this->connection_handler_->incr_refcount(); - } if (flag) { // Use the lite version of the protocol @@ -57,7 +50,6 @@ TAO_SHMIOP_Transport::TAO_SHMIOP_Transport (TAO_SHMIOP_Connection_Handler *handl TAO_SHMIOP_Transport::~TAO_SHMIOP_Transport (void) { - ACE_ASSERT(this->connection_handler_ == 0); delete this->messaging_object_; } @@ -81,9 +73,9 @@ TAO_SHMIOP_Transport::messaging_object (void) ssize_t -TAO_SHMIOP_Transport::send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *max_wait_time) +TAO_SHMIOP_Transport::send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { bytes_transferred = 0; for (int i = 0; i < iovcnt; ++i) @@ -101,9 +93,9 @@ TAO_SHMIOP_Transport::send_i (iovec *iov, int iovcnt, } ssize_t -TAO_SHMIOP_Transport::recv_i (char *buf, - size_t len, - const ACE_Time_Value *max_wait_time) +TAO_SHMIOP_Transport::recv (char *buf, + size_t len, + const ACE_Time_Value *max_wait_time) { ssize_t n = 0; @@ -200,32 +192,6 @@ TAO_SHMIOP_Transport::consolidate_message (ACE_Message_Block &incoming, return this->process_parsed_messages (&pqd, rh); } - -int -TAO_SHMIOP_Transport::register_handler_i (void) -{ - if (TAO_debug_level > 4) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - SHMIOP_Transport::register_handler %d\n", - this->id ())); - } - // @@ It seems like this method should go away, the right reactor is - // picked at object creation time. - ACE_Reactor *r = this->orb_core_->reactor (); - - if (r == this->connection_handler_->reactor ()) - return 0; - - // Set the flag in the Connection Handler - this->ws_->is_registered (1); - - // Register the handler with the reactor - return r->register_handler (this->connection_handler_, - ACE_Event_Handler::READ_MASK); -} - - int TAO_SHMIOP_Transport::send_request (TAO_Stub *stub, TAO_ORB_Core *orb_core, @@ -292,12 +258,4 @@ TAO_SHMIOP_Transport::messaging_init (CORBA::Octet major, return 1; } -TAO_Connection_Handler * -TAO_SHMIOP_Transport::invalidate_event_handler_i (void) -{ - TAO_Connection_Handler * eh = this->connection_handler_; - this->connection_handler_ = 0; - return eh; -} - #endif /* TAO_HAS_SHMIOP && TAO_HAS_SHMIOP != 0 */ diff --git a/TAO/tao/Strategies/SHMIOP_Transport.h b/TAO/tao/Strategies/SHMIOP_Transport.h index b41197303ae..a0089bae8a0 100644 --- a/TAO/tao/Strategies/SHMIOP_Transport.h +++ b/TAO/tao/Strategies/SHMIOP_Transport.h @@ -69,26 +69,23 @@ protected: //@{ virtual ACE_Event_Handler * event_handler_i (void); virtual TAO_Connection_Handler *connection_handler_i (void); - virtual TAO_Connection_Handler * invalidate_event_handler_i (void); virtual TAO_Pluggable_Messaging *messaging_object (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout = 0); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0); /// Read len bytes from into buf. - virtual ssize_t recv_i (char *buf, - size_t len, - const ACE_Time_Value *s = 0); + virtual ssize_t recv (char *buf, + size_t len, + const ACE_Time_Value *s = 0); virtual int consolidate_message (ACE_Message_Block &incoming, ssize_t missing_data, TAO_Resume_Handle &rh, ACE_Time_Value *max_wait_time); - virtual int register_handler_i (void); - //@} public: diff --git a/TAO/tao/Strategies/UIOP_Connection_Handler.cpp b/TAO/tao/Strategies/UIOP_Connection_Handler.cpp index ca1b2f1b95a..3ca211a4c57 100644 --- a/TAO/tao/Strategies/UIOP_Connection_Handler.cpp +++ b/TAO/tao/Strategies/UIOP_Connection_Handler.cpp @@ -34,7 +34,7 @@ TAO_UIOP_Connection_Handler::TAO_UIOP_Connection_Handler (ACE_Thread_Manager *t) // Creation_Strategy requires a constructor with that signature, we // don't use that implementation, but some (most?) compilers // instantiate it anyway. - ACE_ASSERT (this->orb_core () != 0); + ACE_ASSERT (0); } @@ -47,17 +47,17 @@ TAO_UIOP_Connection_Handler::TAO_UIOP_Connection_Handler (TAO_ORB_Core *orb_core (TAO_UIOP_Properties *, arg)) { TAO_UIOP_Transport* specific_transport = 0; - ACE_NEW(specific_transport, - TAO_UIOP_Transport(this, orb_core, flag)); + ACE_NEW (specific_transport, + TAO_UIOP_Transport(this, orb_core, flag)); // store this pointer (indirectly increment ref count) - this->transport(specific_transport); - TAO_Transport::release (specific_transport); + this->transport (specific_transport); } TAO_UIOP_Connection_Handler::~TAO_UIOP_Connection_Handler (void) { + delete this->transport (); } int @@ -116,20 +116,57 @@ TAO_UIOP_Connection_Handler::close_connection (void) int TAO_UIOP_Connection_Handler::handle_input (ACE_HANDLE h) { - return this->handle_input_eh (h, this); + int result = + this->handle_input_eh (h, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; } int TAO_UIOP_Connection_Handler::handle_output (ACE_HANDLE handle) { - return this->handle_output_eh (handle, this); + int result = + this->handle_output_eh (handle, this); + + if (result == -1) + { + this->close_connection (); + return 0; + } + + return result; +} + +int +TAO_UIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, + const void *) +{ + // We don't use this upcall for I/O. This is only used by the + // Connector to indicate that the connection timedout. Therefore, + // we should call close(). + return this->close (); } int -TAO_UIOP_Connection_Handler::handle_close (ACE_HANDLE handle, - ACE_Reactor_Mask rm) +TAO_UIOP_Connection_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) { - return this->handle_close_eh (handle, rm, this); + ACE_ASSERT (0); + return 0; +} + +int +TAO_UIOP_Connection_Handler::close (u_long) +{ + this->state_changed (TAO_LF_Event::LFS_CONNECTION_CLOSED); + this->transport ()->remove_reference (); + return 0; } int diff --git a/TAO/tao/Strategies/UIOP_Connection_Handler.h b/TAO/tao/Strategies/UIOP_Connection_Handler.h index 1d5e1e212c5..da6216ab196 100644 --- a/TAO/tao/Strategies/UIOP_Connection_Handler.h +++ b/TAO/tao/Strategies/UIOP_Connection_Handler.h @@ -87,6 +87,10 @@ public: virtual int open_handler (void *); //@} + /// Close called by the Acceptor or Connector when connection + /// establishment fails. + int close (u_long = 0); + //@{ /** @name Event Handler overloads */ @@ -96,6 +100,8 @@ public: virtual int handle_input (ACE_HANDLE); virtual int handle_output (ACE_HANDLE); virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); + virtual int handle_timeout (const ACE_Time_Value ¤t_time, + const void *act = 0); //@} diff --git a/TAO/tao/Strategies/UIOP_Connector.cpp b/TAO/tao/Strategies/UIOP_Connector.cpp index 1991c150ba1..f16a36bddfd 100644 --- a/TAO/tao/Strategies/UIOP_Connector.cpp +++ b/TAO/tao/Strategies/UIOP_Connector.cpp @@ -23,13 +23,7 @@ template class TAO_Connect_Creation_Strategy; template class ACE_Strategy_Connector; template class ACE_Connect_Strategy; template class ACE_Connector; -template class ACE_Svc_Tuple; - -template class ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Entry*>; -template class ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX>; -template class ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX>; +template class ACE_NonBlocking_Connect_Handler; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) @@ -41,13 +35,7 @@ template class ACE_Map_Reverse_Iterator #pragma instantiate ACE_Connect_Strategy #pragma instantiate ACE_Connector -#pragma instantiate ACE_Svc_Tuple - -#pragma instantiate ACE_Map_Manager *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Iterator_Base *, TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Entry*> -#pragma instantiate ACE_Map_Iterator*,TAO_SYNCH_RW_MUTEX> -#pragma instantiate ACE_Map_Reverse_Iterator*,TAO_SYNCH_RW_MUTEX> +#pragma instantiate ACE_NonBlocking_Connect_Handler #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ @@ -167,6 +155,7 @@ TAO_UIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, ACE_TEXT ("(%P|%t) UIOP_Connector::connect ") ACE_TEXT ("making a new connection \n"))); + // Get the right synch options ACE_Synch_Options synch_options; this->active_connect_strategy_->synch_options (max_wait_time, @@ -174,11 +163,30 @@ TAO_UIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, TAO_UIOP_Connection_Handler *svc_handler = 0; + // Connect. int result = this->base_connector_.connect (svc_handler, remote_address, synch_options); + // This call creates the service handler and bumps the #REFCOUNT# up + // one extra. There are three possibilities: (a) connection + // succeeds immediately - in this case, the #REFCOUNT# on the + // handler is two; (b) connection completion is pending - in this + // case, the #REFCOUNT# on the handler is also two; (c) connection + // fails immediately - in this case, the #REFCOUNT# on the handler + // is one since close() gets called on the handler. + // + // The extra reference count in + // TAO_Connect_Creation_Strategy::make_svc_handler() is needed in + // the case when connection completion is pending and we are going + // to wait on a variable in the handler to changes, signifying + // success or failure. Note, that this increment cannot be done + // once the connect() returns since this might be too late if + // another thread pick up the completion and potentially deletes the + // handler before we get a chance to increment the reference count. + + // No immediate result. Wait for completion. if (result == -1 && errno == EWOULDBLOCK) { if (TAO_debug_level > 2) @@ -187,9 +195,15 @@ TAO_UIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, "going to wait for connection completion on local" "handle [%d]\n", svc_handler->get_handle ())); + + // Wait for connection completion. No need to specify timeout + // to wait() since the correct timeout was passed to the + // Connector. The Connector will close the handler in the case + // of timeouts, so the event will complete (either success or + // failure) within timeout. result = this->active_connect_strategy_->wait (svc_handler, - max_wait_time); + 0); if (TAO_debug_level > 2) { @@ -198,26 +212,64 @@ TAO_UIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, "wait done for handle[%d], result = %d\n", svc_handler->get_handle (), result)); } - } - - int status = - svc_handler->is_finalized (); + // There are three possibilities when wait() returns: (a) + // connection succeeded; (b) connection failed; (c) wait() + // failed because of some other error. It is easy to deal with + // (a) and (b). (c) is tricky since the connection is still + // pending and may get completed by some other thread. The + // following code deals with (c). - // Reduce the refcount to the svc_handler that we have. The - // increment to the handler is done in make_svc_handler (). Now - // that we dont need the reference to it anymore we can decrement - // the refcount whether the connection is successful ot not. - long refcount = svc_handler->decr_refcount (); + // Check if the handler has been closed. + int closed = + svc_handler->is_finalized (); - ACE_ASSERT (refcount >= 0); - ACE_UNUSED_ARG (refcount); + // In case of failures and close() has not be called. + if (result == -1 && + !closed) + { + // First, cancel from connector. + this->base_connector_.cancel (svc_handler); + + // Double check to make sure the handler has not been + // closed yet. This double check is required to ensure + // that the connection handler was not closed yet by some + // other thread since it was still registered with the + // connector. Once connector.cancel() has been processed, + // we are assured that the connector will no longer + // open/close this handler. + closed = + svc_handler->is_closed (); + + // If closed, there is nothing to do here. If not closed, + // it was either opened or is still pending. + if (!closed) + { + // Check if the handler has been opened. + int open = + svc_handler->is_open (); + + // Some other thread was able to open the handler even + // though wait failed for this thread. + if (open) + // Overwrite . + result = 0; + else + { + // Assert that it is still connecting. + ACE_ASSERT (svc_handler->is_connecting ()); + + // Force close the handler now. + svc_handler->close (); + } + } + } + } - if (TAO_debug_level > 0) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%P|%t) UIOP_Connector::connect ") - ACE_TEXT ("The result is <%d> \n"), result)); + // Irrespective of success or failure, remove the extra #REFCOUNT#. + svc_handler->remove_reference (); + // In case of errors. if (result == -1) { // Give users a clue to the problem. @@ -232,46 +284,67 @@ TAO_UIOP_Connector::make_connection (TAO_GIOP_Invocation *invocation, ACE_TEXT ("errno"))); } - (void) this->active_connect_strategy_->post_failed_connect (svc_handler, - status); return -1; } - TAO_Transport *base_transport = - TAO_Transport::_duplicate (svc_handler->transport ()); + // At this point, the connection has be successfully connected. + // #REFCOUNT# is one. + + TAO_Transport *transport = + svc_handler->transport (); // Add the handler to Cache int retval = this->orb_core ()->lane_resources ().transport_cache ().cache_transport (desc, - base_transport); - - if (retval != 0 && TAO_debug_level > 0) + transport); + // Failure in adding to cache. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%P|%t) UIOP_Connector::connect ") - ACE_TEXT ("could not add the new connection to Cache \n"))); + // Close the handler. + svc_handler->close (); + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("(%P|%t) UIOP_Connector::connect ") + ACE_TEXT ("could not add the new connection to Cache \n"))); + } + + return -1; } // If the wait strategy wants us to be registered with the reactor - // then we do so. - retval = base_transport->wait_strategy ()->register_handler (); + // then we do so. If registeration is required and it succeeds, + // #REFCOUNT# becomes two. + retval = transport->wait_strategy ()->register_handler (); - if (retval != 0 && TAO_debug_level > 0) + // Registration failures. + if (retval != 0) { - ACE_DEBUG ((LM_DEBUG, - ACE_LIB_TEXT ("(%P|%t) IIOP_Connector::connect ") - ACE_LIB_TEXT ("could not add the new connection to reactor \n"))); + // Purge from the connection cache. + transport->purge_entry (); + + // Close the handler. + svc_handler->close (); + + if (TAO_debug_level > 0) + { + ACE_ERROR ((LM_ERROR, + "TAO (%P|%t) - UIOP_Connector::make_connection, " + "could not register the new connection in the reactor\n")); + } + + return -1; } // Handover the transport pointer to the Invocation class. - TAO_Transport *&transport = invocation->transport (); - transport = base_transport; + TAO_Transport *&invocation_transport = + invocation->transport (); + invocation_transport = transport; return 0; } - - TAO_Profile * TAO_UIOP_Connector::create_profile (TAO_InputCDR& cdr) { diff --git a/TAO/tao/Strategies/UIOP_Transport.cpp b/TAO/tao/Strategies/UIOP_Transport.cpp index 3270f94f012..b5cfaf044dd 100644 --- a/TAO/tao/Strategies/UIOP_Transport.cpp +++ b/TAO/tao/Strategies/UIOP_Transport.cpp @@ -33,13 +33,6 @@ TAO_UIOP_Transport::TAO_UIOP_Transport (TAO_UIOP_Connection_Handler *handler, , connection_handler_ (handler) , messaging_object_ (0) { - if (connection_handler_ != 0) - { - // REFCNT: Matches one of - // TAO_Transport::connection_handler_close() or - // TAO_Transport::close_connection_shared. - this->connection_handler_->incr_refcount(); - } if (flag) { // Use the lite version of the protocol @@ -56,7 +49,6 @@ TAO_UIOP_Transport::TAO_UIOP_Transport (TAO_UIOP_Connection_Handler *handler, TAO_UIOP_Transport::~TAO_UIOP_Transport (void) { - ACE_ASSERT(this->connection_handler_ == 0); delete this->messaging_object_; } @@ -79,9 +71,9 @@ TAO_UIOP_Transport::messaging_object (void) } ssize_t -TAO_UIOP_Transport::send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *max_wait_time) +TAO_UIOP_Transport::send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt, max_wait_time); @@ -92,9 +84,9 @@ TAO_UIOP_Transport::send_i (iovec *iov, int iovcnt, } ssize_t -TAO_UIOP_Transport::recv_i (char *buf, - size_t len, - const ACE_Time_Value *max_wait_time) +TAO_UIOP_Transport::recv (char *buf, + size_t len, + const ACE_Time_Value *max_wait_time) { ssize_t n = this->connection_handler_->peer ().recv (buf, len, @@ -109,7 +101,7 @@ TAO_UIOP_Transport::recv_i (char *buf, ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - %p \n"), ACE_TEXT ("TAO - read message failure ") - ACE_TEXT ("recv_i () \n"))); + ACE_TEXT ("recv () \n"))); } // Error handling @@ -129,31 +121,6 @@ TAO_UIOP_Transport::recv_i (char *buf, return n; } -int -TAO_UIOP_Transport::register_handler_i (void) -{ - if (TAO_debug_level > 4) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) - UIOP_Transport::register_handler %d\n", - this->id ())); - } - // @@ It seems like this method should go away, the right reactor is - // picked at object creation time. - ACE_Reactor *r = this->orb_core_->reactor (); - - if (r == this->connection_handler_->reactor ()) - return 0; - - // Set the flag in the Connection Handler - this->ws_->is_registered (1); - - // Register the handler with the reactor - return r->register_handler (this->connection_handler_, - ACE_Event_Handler::READ_MASK); -} - - int TAO_UIOP_Transport::send_request (TAO_Stub *stub, TAO_ORB_Core *orb_core, @@ -220,12 +187,4 @@ TAO_UIOP_Transport::messaging_init (CORBA::Octet major, return 1; } -TAO_Connection_Handler * -TAO_UIOP_Transport::invalidate_event_handler_i (void) -{ - TAO_Connection_Handler * eh = this->connection_handler_; - this->connection_handler_ = 0; - return eh; -} - #endif /* TAO_HAS_UIOP */ diff --git a/TAO/tao/Strategies/UIOP_Transport.h b/TAO/tao/Strategies/UIOP_Transport.h index cb504621570..1099d7e1bf0 100644 --- a/TAO/tao/Strategies/UIOP_Transport.h +++ b/TAO/tao/Strategies/UIOP_Transport.h @@ -68,20 +68,17 @@ protected: virtual ACE_Event_Handler * event_handler_i (void); virtual TAO_Connection_Handler *connection_handler_i (void); - virtual TAO_Connection_Handler * invalidate_event_handler_i (void); virtual TAO_Pluggable_Messaging *messaging_object (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout = 0); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0); /// Read len bytes from into buf. - virtual ssize_t recv_i (char *buf, - size_t len, - const ACE_Time_Value *s = 0); - - virtual int register_handler_i (void); + virtual ssize_t recv (char *buf, + size_t len, + const ACE_Time_Value *s = 0); public: /// @todo These methods IMHO should have more meaningful names. diff --git a/TAO/tao/TAO.dsp b/TAO/tao/TAO.dsp index 9b9c6708c55..f0a69a5809f 100644 --- a/TAO/tao/TAO.dsp +++ b/TAO/tao/TAO.dsp @@ -636,10 +636,6 @@ SOURCE=.\Muxed_TMS.cpp # End Source File # Begin Source File -SOURCE=.\Notify_Handler.cpp -# End Source File -# Begin Source File - SOURCE=.\NVList.cpp # End Source File # Begin Source File @@ -1532,10 +1528,6 @@ SOURCE=.\Muxed_TMS.h # End Source File # Begin Source File -SOURCE=.\Notify_Handler.h -# End Source File -# Begin Source File - SOURCE=.\nvlist.h # End Source File # Begin Source File diff --git a/TAO/tao/TAO_Static.dsp b/TAO/tao/TAO_Static.dsp index 75d6d7cae45..682cfaf45be 100644 --- a/TAO/tao/TAO_Static.dsp +++ b/TAO/tao/TAO_Static.dsp @@ -555,10 +555,6 @@ SOURCE=.\Muxed_TMS.cpp # End Source File # Begin Source File -SOURCE=.\Notify_Handler.cpp -# End Source File -# Begin Source File - SOURCE=.\NVList.cpp # End Source File # Begin Source File @@ -1491,10 +1487,6 @@ SOURCE=.\Muxed_TMS.h # End Source File # Begin Source File -SOURCE=.\Notify_Handler.h -# End Source File -# Begin Source File - SOURCE=.\nvlist.h # End Source File # Begin Source File diff --git a/TAO/tao/Thread_Lane_Resources.cpp b/TAO/tao/Thread_Lane_Resources.cpp index ff2b263fd1d..d0c9327755c 100644 --- a/TAO/tao/Thread_Lane_Resources.cpp +++ b/TAO/tao/Thread_Lane_Resources.cpp @@ -8,7 +8,9 @@ ACE_RCSID(tao, Thread_Lane_Resources, "$Id$") #include "tao/Acceptor_Registry.h" #include "tao/Transport_Cache_Manager.h" #include "tao/Leader_Follower.h" -#include "Connector_Registry.h" +#include "tao/Connection_Handler.h" +#include "tao/Transport.h" +#include "tao/Connector_Registry.h" #include "ace/Reactor.h" @@ -260,37 +262,28 @@ TAO_Thread_Lane_Resources::finalize (void) delete this->acceptor_registry_; } - // Set of file descriptors corresponding to open connections. This - // handle set is used to explicitly deregister the connection event - // handlers from the Reactor. This is particularly important for - // dynamically loaded ORBs where an application level reactor, such - // as the Singleton reactor, is used instead of an ORB created one. - ACE_Handle_Set handle_set; - TAO_EventHandlerSet unregistered; - - // Close the transport cache and return the handle set that needs - // to be de-registered from the reactor. - this->transport_cache_->close (handle_set, unregistered); - - // Shutdown all open connections that are registered with the ORB - // Core. Note that the ACE_Event_Handler::DONT_CALL mask is NOT - // used here since the reactor should invoke each handle's - // corresponding ACE_Event_Handler::handle_close() method to ensure - // that the connection is shutdown gracefully prior to destroying - // the ORB Core. - if (handle_set.num_set () > 0) - (void) this->leader_follower ().reactor ()->remove_handler (handle_set, - ACE_Event_Handler::ALL_EVENTS_MASK); - if (!unregistered.is_empty ()) + // Set of handlers still in the connection cache. + TAO_Connection_Handler_Set handlers; + + // Close the transport cache and return the handlers that were still + // registered. The cache will decrease the #REFCOUNT# on the + // handler when it removes the handler from cache. However, + // #REFCOUNT# is increased when the handler is placed in the handler + // set. + this->transport_cache_->close (handlers); + + // Go through the handler set, closing the connections and removing + // the references. + TAO_Connection_Handler **handler = 0; + for (TAO_Connection_Handler_Set::iterator iter (handlers); + iter.next (handler); + iter.advance ()) { - ACE_Event_Handler** eh; - for (TAO_EventHandlerSetIterator iter(unregistered); - iter.next (eh); - iter.advance()) - { - (*eh)->handle_close (ACE_INVALID_HANDLE, - ACE_Event_Handler::ALL_EVENTS_MASK); - } + // Connection is closed. Potential removal from the Reactor. + (*handler)->close_connection (); + + // #REFCOUNT# related to the handler set decreases. + (*handler)->transport ()->remove_reference (); } delete this->transport_cache_; diff --git a/TAO/tao/Thread_Per_Connection_Handler.cpp b/TAO/tao/Thread_Per_Connection_Handler.cpp index d69e6dcf0df..cc9d6edac94 100644 --- a/TAO/tao/Thread_Per_Connection_Handler.cpp +++ b/TAO/tao/Thread_Per_Connection_Handler.cpp @@ -13,14 +13,12 @@ TAO_Thread_Per_Connection_Handler::TAO_Thread_Per_Connection_Handler ( TAO_Connection_Handler *ch) : ch_ (ch) { - // REFCNT: Matches decr_refcount() in the destructor. - (void) this->ch_->incr_refcount (); + this->ch_->transport ()->add_reference (); } TAO_Thread_Per_Connection_Handler::~TAO_Thread_Per_Connection_Handler (void) { - // REFCNT: Matches incr_refcount() in the constructor. - (void) this->ch_->decr_refcount (); + this->ch_->transport ()->remove_reference (); } int diff --git a/TAO/tao/Transport.cpp b/TAO/tao/Transport.cpp index e07169bb109..6cfccf24bab 100644 --- a/TAO/tao/Transport.cpp +++ b/TAO/tao/Transport.cpp @@ -20,7 +20,6 @@ #include "Thread_Lane_Resources.h" #include "debug.h" #include "Resume_Handle.h" -#include "Notify_Handler.h" #include "ace/Message_Block.h" #include "ace/Reactor.h" @@ -96,16 +95,9 @@ dump_iov (iovec *iov, int iovcnt, size_t id, ACE_Log_Msg::instance ()->release (); } -/* - * Definitions for methods declared in the transport class - * - */ - -// Constructor. TAO_Transport::TAO_Transport (CORBA::ULong tag, TAO_ORB_Core *orb_core) - : TAO_Synch_Refcountable (orb_core->resource_factory ()->create_cached_connection_lock (), 1) - , tag_ (tag) + : tag_ (tag) , orb_core_ (orb_core) , cache_map_entry_ (0) , bidirectional_flag_ (-1) @@ -135,8 +127,6 @@ TAO_Transport::TAO_Transport (CORBA::ULong tag, TAO_Transport::~TAO_Transport (void) { - ACE_ASSERT(this->refcount() == 0); - delete this->ws_; delete this->tms_; @@ -145,122 +135,17 @@ TAO_Transport::~TAO_Transport (void) // By the time the destructor is reached all the connection stuff // *must* have been cleaned up - ACE_ASSERT(this->head_ == 0); - ACE_ASSERT(this->cache_map_entry_ == 0); -} - - -/* - * - * Public utility methods that are called by other classes. - * - */ -/*static*/ TAO_Transport* -TAO_Transport::_duplicate (TAO_Transport* transport) -{ - if (transport != 0) - { - transport->increment (); - } - return transport; -} - -/*static*/ void -TAO_Transport::release (TAO_Transport* transport) -{ - if (transport != 0) - { - int count = transport->decrement (); - - if (count == 0) - { - delete transport; - } - else if (count < 0) - { - ACE_ERROR ((LM_ERROR, - "TAO (%P|%t) - Transport[%d]::release, " - "reference count is less than zero: %d\n", - transport->id (), count)); - ACE_OS::abort (); - } - } + ACE_ASSERT (this->head_ == 0); + ACE_ASSERT (this->cache_map_entry_ == 0); } - void -TAO_Transport::provide_handle (ACE_Handle_Set &reactor_registered, - TAO_EventHandlerSet &unregistered) -{ - ACE_MT (ACE_GUARD (ACE_Lock, - guard, - *this->handler_lock_)); - ACE_Event_Handler *eh = this->event_handler_i (); - - if (eh != 0) - { - if (this->ws_->is_registered ()) - { - reactor_registered.set_bit (eh->get_handle ()); - } - else - { - unregistered.insert (eh); - } - } -} - - -int -TAO_Transport::register_handler (void) -{ - ACE_MT (ACE_GUARD_RETURN (ACE_Lock, - guard, - *this->handler_lock_, - -1)); - if (this->check_event_handler_i ("Transport::register_handler") == -1) - return -1; - - return this->register_handler_i (); -} - - -ssize_t -TAO_Transport::send (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout) -{ - ACE_MT (ACE_GUARD_RETURN (ACE_Lock, - guard, - *this->handler_lock_, - -1)); - - if (this->check_event_handler_i ("Transport::send") == -1) - return -1; - - // now call the template method - return this->send_i (iov, iovcnt, bytes_transferred, timeout); -} - - -ssize_t -TAO_Transport::recv (char *buffer, - size_t len, - const ACE_Time_Value *timeout) +TAO_Transport::provide_handler (TAO_Connection_Handler_Set &handlers) { - ACE_MT (ACE_GUARD_RETURN (ACE_Lock, - guard, - *this->handler_lock_, - -1)); - - if (this->check_event_handler_i ("Transport::recv") == -1) - return -1; - - // now call the template method - return this->recv_i (buffer, len, timeout); + this->add_reference (); + handlers.insert (this->connection_handler_i ()); } - int TAO_Transport::idle_after_send (void) { @@ -282,8 +167,32 @@ TAO_Transport::tear_listen_point_list (TAO_InputCDR &) void TAO_Transport::close_connection (void) { - TAO_Connection_Handler * eh = this->invalidate_event_handler (); - this->close_connection_shared (1, eh); + this->connection_handler_i ()->close_connection (); +} + +int +TAO_Transport::register_handler (void) +{ + if (TAO_debug_level > 4) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::register_handler\n", + this->id ())); + } + + ACE_Reactor *r = this->orb_core_->reactor (); + + if (r == this->event_handler_i ()->reactor ()) + return 0; + + // Set the flag in the Connection Handler and in the Wait Strategy + // @@Maybe we should set these flags after registering with the + // reactor. What if the registration fails??? + this->ws_->is_registered (1); + + // Register the handler with the reactor + return r->register_handler (this->event_handler_i (), + ACE_Event_Handler::READ_MASK); } int @@ -308,7 +217,6 @@ TAO_Transport::generate_locate_request ( return 0; } - int TAO_Transport::generate_request_header ( TAO_Operation_Details &opdetails, @@ -318,8 +226,8 @@ TAO_Transport::generate_request_header ( // codeset service context is only supposed to be sent in the first request // on a particular connection. if (this->first_request_) - this->orb_core()->codeset_manager()-> - generate_service_context( opdetails, *this ); + this->orb_core ()->codeset_manager ()-> + generate_service_context (opdetails, *this); if (this->messaging_object ()->generate_request_header (opdetails, spec, @@ -337,32 +245,6 @@ TAO_Transport::generate_request_header ( return 0; } - -/* - * NOTE: Some of these calls looks like ideal fodder for - * inlining. But, please note that the calls made within the method - * are not inlined. This would increase closure cost on the - * compiler. - */ -void -TAO_Transport::connection_handler_closing (void) -{ - // The connection has closed, we must invalidate the handler to - // ensure that any attempt to use this transport results in an - // error. Basically all the other methods in the Transport - // cooperate via check_event_handler_i() - - TAO_Connection_Handler * eh = this->invalidate_event_handler (); - this->send_connection_closed_notifications (); - - if (eh != 0) - { - // REFCNT: Matches incr_refcnt in XXX_Transport::XXX_Transport - // REFCNT: Only one of this or close_connection_shared() run - eh->decr_refcount(); - } -} - // @@TODO: Ideally the following should be inline. int TAO_Transport::recache_transport (TAO_Transport_Descriptor_Interface *desc) @@ -378,7 +260,7 @@ TAO_Transport::recache_transport (TAO_Transport_Descriptor_Interface *desc) void TAO_Transport::purge_entry (void) { - (void) this->transport_cache_manager ().purge_entry (this->cache_map_entry_); + this->transport_cache_manager ().purge_entry (this->cache_map_entry_); } int @@ -393,7 +275,6 @@ TAO_Transport::update_transport (void) return this->transport_cache_manager ().update_entry (this->cache_map_entry_); } - /* * * Methods called and used in the output path of the ORB. @@ -427,7 +308,6 @@ TAO_Transport::handle_output (void) return retval; } - int TAO_Transport::send_message_block_chain (const ACE_Message_Block *mb, size_t &bytes_transferred, @@ -435,9 +315,6 @@ TAO_Transport::send_message_block_chain (const ACE_Message_Block *mb, { ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->handler_lock_, -1); - if (this->check_event_handler_i ("Transport::send_message_block_chain") == -1) - return -1; - return this->send_message_block_chain_i (mb, bytes_transferred, max_wait_time); @@ -490,22 +367,22 @@ TAO_Transport::send_message_shared (TAO_Stub *stub, const ACE_Message_Block *message_block, ACE_Time_Value *max_wait_time) { - int r; + int result; + { ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->handler_lock_, -1); - if (this->check_event_handler_i ("Transport::send_message_shared") == -1) - return -1; - - r = this->send_message_shared_i (stub, message_semantics, - message_block, max_wait_time); - } - if (r == -1) - { - this->close_connection (); + result = + this->send_message_shared_i (stub, message_semantics, + message_block, max_wait_time); } - return r; + if (result == -1) + { + this->close_connection (); + } + + return result; } int @@ -686,74 +563,6 @@ TAO_Transport::send_synch_message_helper_i (TAO_Synch_Queued_Message &synch_mess return 0; } - -void -TAO_Transport::close_connection_i (void) -{ - TAO_Connection_Handler * eh = this->invalidate_event_handler_i (); - this->close_connection_shared (1, eh); -} - -void -TAO_Transport::close_connection_no_purge (void) -{ - TAO_Connection_Handler * eh = this->invalidate_event_handler (); - - this->close_connection_shared (0, - eh); -} - -void -TAO_Transport::close_connection_shared (int purge, - TAO_Connection_Handler * eh) -{ - // Purge the entry - if (purge) - { - this->transport_cache_manager ().purge_entry (this->cache_map_entry_); - } - - if (eh == 0) - { - // The connection was already closed - return; - } - - // Set the event handler in the connection close wait state. - (void) eh->connection_close_wait (); - - // NOTE: If the wait strategy is in blocking mode, then there is no - // chance that it could be inside the reactor. We can safely skip - // driving the LF. If is 0, then we are cleaned up by the - // cache. So no point in driving the LF either. - if (this->ws_->non_blocking () && purge) - { - // NOTE: This is a work around for BUG 1020. We drive the leader - // follower for a predetermined amount of time. Ideally this - // needs to be an ORB option. But this is just the first - // cut. Doing that will be a todo.. - - ACE_Time_Value tv (ACE_DEFAULT_TIMEOUT, 0); - this->orb_core_->leader_follower ().wait_for_event (eh, - this, - &tv); - - } - - // We need to explicitly shut it down to avoid memory leaks. - if (!eh->successful () || - !this->ws_->non_blocking ()) - { - eh->close_connection (); - } - - this->send_connection_closed_notifications (); - - // REFCNT: Matches incr_refcnt in XXX_Transport::XXX_Transport - // REFCNT: Only one of this or connection_handler_closing() run - eh->decr_refcount (); -} - int TAO_Transport::queue_is_empty_i (void) { @@ -765,12 +574,7 @@ int TAO_Transport::schedule_output_i (void) { ACE_Event_Handler *eh = this->event_handler_i (); - if (eh == 0) - return -1; - ACE_Reactor *reactor = eh->reactor (); - if (reactor == 0) - return -1; if (TAO_debug_level > 3) { @@ -786,12 +590,7 @@ int TAO_Transport::cancel_output_i (void) { ACE_Event_Handler *eh = this->event_handler_i (); - if (eh == 0) - return -1; - ACE_Reactor *reactor = eh->reactor (); - if (reactor == 0) - return -1; if (TAO_debug_level > 3) { @@ -857,14 +656,11 @@ TAO_Transport::drain_queue (void) int TAO_Transport::drain_queue_helper (int &iovcnt, iovec iov[]) { - if (this->check_event_handler_i ("Transport::drain_queue_helper") == -1) - return -1; - size_t byte_count = 0; // ... send the message ... ssize_t retval = - this->send_i (iov, iovcnt, byte_count); + this->send (iov, iovcnt, byte_count); if (TAO_debug_level == 5) { @@ -896,7 +692,7 @@ TAO_Transport::drain_queue_helper (int &iovcnt, iovec iov[]) ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - Transport[%d]::drain_queue_helper, " "error during %p\n", - this->id (), "send_i()")); + this->id (), "send()")); } if (errno == EWOULDBLOCK) return 0; @@ -981,14 +777,8 @@ TAO_Transport::drain_queue_i (void) if (this->flush_timer_pending ()) { ACE_Event_Handler *eh = this->event_handler_i (); - if (eh != 0) - { - ACE_Reactor *reactor = eh->reactor (); - if (reactor != 0) - { - (void) reactor->cancel_timer (this->flush_timer_id_); - } - } + ACE_Reactor *reactor = eh->reactor (); + reactor->cancel_timer (this->flush_timer_id_); this->reset_flush_timer (); } return 1; @@ -1063,25 +853,19 @@ TAO_Transport::check_buffering_constraints_i (TAO_Stub *stub, if (set_timer) { ACE_Event_Handler *eh = this->event_handler_i (); - if (eh != 0) - { - ACE_Reactor *reactor = eh->reactor (); - if (reactor != 0) - { - this->current_deadline_ = new_deadline; - ACE_Time_Value delay = - new_deadline - ACE_OS::gettimeofday (); + ACE_Reactor *reactor = eh->reactor (); + this->current_deadline_ = new_deadline; + ACE_Time_Value delay = + new_deadline - ACE_OS::gettimeofday (); - if (this->flush_timer_pending ()) - { - (void) reactor->cancel_timer (this->flush_timer_id_); - } - this->flush_timer_id_ = - reactor->schedule_timer (&this->transport_timer_, - &this->current_deadline_, - delay); - } + if (this->flush_timer_pending ()) + { + reactor->cancel_timer (this->flush_timer_id_); } + this->flush_timer_id_ = + reactor->schedule_timer (&this->transport_timer_, + &this->current_deadline_, + delay); } return constraints_reached; @@ -1099,14 +883,6 @@ TAO_Transport::report_invalid_event_handler (const char *caller) } } -TAO_Connection_Handler * -TAO_Transport::invalidate_event_handler (void) -{ - ACE_MT (ACE_GUARD_RETURN (ACE_Lock, guard, *this->handler_lock_, 0)); - - return this->invalidate_event_handler_i (); -} - void TAO_Transport::send_connection_closed_notifications (void) { @@ -1152,7 +928,6 @@ TAO_Transport::send_message_shared_i (TAO_Stub *stub, max_wait_time); } - // Let's figure out if the message should be queued without trying // to send first: int try_sending_first = 1; @@ -1287,8 +1062,6 @@ TAO_Transport::send_message_shared_i (TAO_Stub *stub, return 0; } - - /* * * All the methods relevant to the incoming data path of the ORB are @@ -1296,9 +1069,9 @@ TAO_Transport::send_message_shared_i (TAO_Stub *stub, * */ int -TAO_Transport::handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value * max_wait_time, - int /*block*/) +TAO_Transport::handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value * max_wait_time, + int /*block*/) { if (TAO_debug_level > 3) { @@ -1319,9 +1092,8 @@ TAO_Transport::handle_input_i (TAO_Resume_Handle &rh, "TAO (%P|%t) - Transport[%d]::handle_input_i, " "error while parsing the head of the queue\n", this->id())); - - this->send_connection_closed_notifications (); } + return retval; } @@ -1376,14 +1148,7 @@ TAO_Transport::handle_input_i (TAO_Resume_Handle &rh, // If there is an error return to the reactor.. if (n <= 0) - { - if (n == -1) - { - this->send_connection_closed_notifications (); - } - - return n; - } + return n; if (TAO_debug_level > 2) { @@ -1492,7 +1257,6 @@ TAO_Transport::parse_incoming_messages (ACE_Message_Block &block) "error in incoming message\n", this->id ())); - this->send_connection_closed_notifications (); return -1; } } @@ -1584,7 +1348,7 @@ TAO_Transport::consolidate_message (ACE_Message_Block &incoming, "error while trying to consolidate\n", this->id ())); } - this->send_connection_closed_notifications (); + return -1; } @@ -1936,8 +1700,6 @@ TAO_Transport::process_parsed_messages (TAO_Queued_Data *qd, "received CloseConnection message %p\n", this->id(), "")); - this->send_connection_closed_notifications (); - // Return a "-1" so that the next stage can take care of // closing connection and the necessary memory management. return -1; @@ -1945,17 +1707,6 @@ TAO_Transport::process_parsed_messages (TAO_Queued_Data *qd, else if (t == TAO_PLUGGABLE_MESSAGE_REQUEST || t == TAO_PLUGGABLE_MESSAGE_LOCATEREQUEST) { - // Ready to process a request. Increment the refcount of . Theoretically, after handler resumption another - // thread can access this very same transport and can even close - // this. To have a valid Transport object for further processing - // we should increment the refcount. Please see Bug 1382 for - // more details. - // REFCNT: Matched by the release before returning. - - // This generic class takes care of everything. - TAO_Transport_Refcount_Guard rg (this); - // Let us resume the handle before we go ahead to process the // request. This will open up the handle for other threads. rh.resume_handle (); @@ -1964,9 +1715,6 @@ TAO_Transport::process_parsed_messages (TAO_Queued_Data *qd, this, qd) == -1) { - this->send_connection_closed_notifications (); - - // Return a "-1" so that the next stage can take care of // closing connection and the necessary memory management. return -1; @@ -1975,8 +1723,6 @@ TAO_Transport::process_parsed_messages (TAO_Queued_Data *qd, else if (t == TAO_PLUGGABLE_MESSAGE_REPLY || t == TAO_PLUGGABLE_MESSAGE_LOCATEREPLY) { - // Please see ..else if (XXX_REQUEST) for whys and whats.. - TAO_Transport_Refcount_Guard rg (this); rh.resume_handle (); // @@todo: Maybe the input_cdr can be constructed from the @@ -1993,7 +1739,6 @@ TAO_Transport::process_parsed_messages (TAO_Queued_Data *qd, "error in process_reply_message %p\n", this->id (), "")); - this->send_connection_closed_notifications (); return -1; } @@ -2009,7 +1754,6 @@ TAO_Transport::process_parsed_messages (TAO_Queued_Data *qd, "dispatch reply failed\n", this->id ())); - this->send_connection_closed_notifications (); return -1; } @@ -2160,25 +1904,10 @@ TAO_Transport::notify_reactor (void) ACE_Event_Handler *eh = this->event_handler_i (); - if (eh == 0) - return -1; - // Get the reactor associated with the event handler ACE_Reactor *reactor = this->orb_core ()->reactor (); - if (reactor == 0) - return -1; - - // NOTE: Instead of creating the handler seperately, it would be - // awesome if we could create the handler when we create the - // TAO_Queued_Data. That would save us an allocation. - TAO_Notify_Handler *nh = - TAO_Notify_Handler::create_handler ( - this, - eh->get_handle (), - this->orb_core ()->transport_message_buffer_allocator ()); - if (TAO_debug_level > 0) { ACE_DEBUG ((LM_DEBUG, @@ -2189,7 +1918,7 @@ TAO_Transport::notify_reactor (void) // Send a notification to the reactor... - int retval = reactor->notify (nh, + int retval = reactor->notify (eh, ACE_Event_Handler::READ_MASK); if (retval < 0 && TAO_debug_level > 2) @@ -2226,7 +1955,17 @@ TAO_Transport::assign_translators (TAO_InputCDR *inp, TAO_OutputCDR *outp) } } +ACE_Event_Handler::Reference_Count +TAO_Transport::add_reference (void) +{ + return this->event_handler_i ()->add_reference (); +} +ACE_Event_Handler::Reference_Count +TAO_Transport::remove_reference (void) +{ + return this->event_handler_i ()->remove_reference (); +} #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) diff --git a/TAO/tao/Transport.h b/TAO/tao/Transport.h index e78fa5ea664..d329759ac16 100644 --- a/TAO/tao/Transport.h +++ b/TAO/tao/Transport.h @@ -28,7 +28,6 @@ #include "Transport_Cache_Manager.h" #include "Transport_Timer.h" #include "Incoming_Message_Queue.h" -#include "Synch_Refcountable.h" class TAO_ORB_Core; class TAO_Target_Specification; @@ -209,7 +208,7 @@ class TAO_Stub; * http://deuce.doc.wustl.edu/cvsweb/ace-latest.cgi/ACE_wrappers/TAO/docs/pluggable_protocols/index.html * */ -class TAO_Export TAO_Transport : private TAO_Synch_Refcountable +class TAO_Export TAO_Transport { public: @@ -220,10 +219,6 @@ public: /// destructor virtual ~TAO_Transport (void); - // Maintain reference counting with these - static TAO_Transport* _duplicate (TAO_Transport* transport); - static void release (TAO_Transport* transport); - /// Return the protocol tag. /** * The OMG assigns unique tags (a 32-bit unsigned number) to each @@ -289,20 +284,14 @@ public: */ int queue_is_empty (void); - /// Fill in a handle_set with any associated handler's reactor handle. + /// Added event handler to the handlers set. /** - * Called by the cache when the cache is closing in order to fill - * in a handle_set in a thread-safe manner. - * - * @param reactor_registered the ACE_Handle_Set into which the - * transport should place any handle registered with the reactor + * Called by the cache when the cache is closing. * - * @param unregistered the TAO_EventHandlerSet into which the - * transport should place any event handler that is not registered - * with anyone + * @param handlers the TAO_Connection_Handler_Set into which the + * transport should place its handler */ - void provide_handle (ACE_Handle_Set &reactor_registered, - TAO_EventHandlerSet &unregistered); + void provide_handler (TAO_Connection_Handler_Set &handlers); /// Remove all messages from the outgoing queue. @@ -311,13 +300,18 @@ public: */ // void dequeue_all (void); + /// Register the handler with the reactor. /** * Register the handler with the reactor. This method is used by the * Wait_On_Reactor strategy. The transport must register its event * handler with the ORB's Reactor. + * + * @todo: I think this method is pretty much useless, the + * connections are *always* registered with the Reactor, except in + * thread-per-connection mode. In that case putting the connection + * in the Reactor would produce unpredictable results anyway. */ - int register_handler (void); - + virtual int register_handler (void); /// Write the complete Message_Block chain to the connection. /** @@ -357,9 +351,9 @@ public: * down). In that case, it returns -1 and sets errno to * ENOENT. */ - ssize_t send (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout = 0); + virtual ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0) = 0; /// Read len bytes from into buf. /** @@ -371,9 +365,9 @@ public: * not clear this this is the best place to specify this. The actual * timeout values will be kept in the Policies. */ - ssize_t recv (char *buffer, - size_t len, - const ACE_Time_Value *timeout = 0); + virtual ssize_t recv (char *buffer, + size_t len, + const ACE_Time_Value *timeout = 0) = 0; /** * @name Control connection lifecycle @@ -411,14 +405,18 @@ public: virtual int messaging_init (CORBA::Octet major, CORBA::Octet minor) = 0; - - /// Extracts the list of listen points from the stream. The /// list would have the protocol specific details of the /// ListenPoints virtual int tear_listen_point_list (TAO_InputCDR &cdr); -protected: + /// Memory management routines. + /* + * Forwards to event handler. + */ + ACE_Event_Handler::Reference_Count add_reference (void); + ACE_Event_Handler::Reference_Count remove_reference (void); + /** @name Template methods * * The Transport class uses the Template Method Pattern to implement @@ -445,71 +443,14 @@ protected: */ virtual ACE_Event_Handler * event_handler_i (void) = 0; - virtual TAO_Connection_Handler * connection_handler_i (void) = 0; +protected: - /// Called by connection_handler_closing() to signal - /// that the protocol-specific transport should dissociate itself - /// with the protocol-specific connection handler. - /** - * Typically, this just sets the pointer to the associated connection - * handler to zero, although it could also clear out any additional - * resources associated with the handler association. - * - * @return The old event handler - */ - virtual TAO_Connection_Handler * invalidate_event_handler_i (void) = 0; + virtual TAO_Connection_Handler * connection_handler_i (void) = 0; /// Return the messaging object that is used to format the data that /// needs to be sent. virtual TAO_Pluggable_Messaging * messaging_object (void) = 0; - /// Write the complete iovec chain to the connection. - /** - * Often the implementation simply forwards the arguments to the - * underlying ACE_Svc_Handler class. Using the code factored out - * into ACE. - * - * Be careful with protocols that perform non-trivial - * transformations of the data, such as SSLIOP or protocols that - * compress the stream. - * - * @param iov contains the data that must be sent. - * - * @param iovcnt is the number of iovec structures in the list - * where iov points. - * - * @param bytes_transferred should return the total number of bytes - * successfully transferred before the connection blocked. This is - * required because in some platforms and/or protocols multiple - * system calls may be required to send the chain of message - * blocks. The first few calls can work successfully, but the final - * one can fail or signal a flow control situation (via EAGAIN). - * In this case the ORB expects the function to return -1, errno to - * be appropriately set and this argument to return the number of - * bytes already on the OS I/O subsystem. - * - * @param timeout is the maximum time that the application is - * willing to wait for the data to be sent, useful in platforms that - * implement timed writes. - * The timeout value is obtained from the policies set by the - * application. - * - */ - virtual ssize_t send_i (iovec *iov, int iovcnt, - size_t &bytes_transferred, - const ACE_Time_Value *timeout = 0) = 0; - - // Read len bytes from into buf. - /** - * @param buffer ORB allocated buffer where the data should be - * @@ The ACE_Time_Value *s is just a place holder for now. It is - * not clear this this is the best place to specify this. The actual - * timeout values will be kept in the Policies. - */ - virtual ssize_t recv_i (char *buffer, - size_t len, - const ACE_Time_Value *timeout = 0) = 0; - public: /// This is a request for the transport object to write a @@ -527,10 +468,6 @@ public: /// recache ourselves in the cache int recache_transport (TAO_Transport_Descriptor_Interface* desc); - /// Method for the connection handler to signify that it - /// is being closed and destroyed. - virtual void connection_handler_closing (void); - /// Callback to read incoming data /** * The ACE_Event_Handler adapter invokes this method as part of its @@ -550,10 +487,9 @@ public: * @param block Is deprecated and ignored. * */ - virtual int handle_input_i (TAO_Resume_Handle &rh, - ACE_Time_Value *max_wait_time = 0, - int block = 0); - + virtual int handle_input (TAO_Resume_Handle &rh, + ACE_Time_Value *max_wait_time = 0, + int block = 0); enum { @@ -562,8 +498,6 @@ public: TAO_REPLY }; - - /// Prepare the waiting and demuxing strategy to receive a reply for /// a new request. /** @@ -633,19 +567,7 @@ public: const ACE_Message_Block *message_block, ACE_Time_Value *max_wait_time); - protected: - /// Register the handler with the reactor. - /** - * This method is used by the Wait_On_Reactor strategy. The - * transport must register its event handler with the ORB's Reactor. - * - * @todo: I think this method is pretty much useless, the - * connections are *always* registered with the Reactor, except in - * thread-per-connection mode. In that case putting the connection - * in the Reactor would produce unpredictable results anyway. - */ - virtual int register_handler_i (void) = 0; /// Called by the handle_input_i (). This method is used to parse /// message read by the handle_input_i () call. It also decides @@ -677,9 +599,7 @@ protected: int consolidate_fragments (TAO_Queued_Data *qd, TAO_Resume_Handle &rh); - - - /// First consolidate the message queue. If the message is still not + /// First consolidate the message queue. If the message is still not /// complete, try to read from the handle again to make it /// complete. If these dont help put the message back in the queue /// and try to check the queue if we have message to process. (the @@ -703,31 +623,20 @@ protected: /// Make a queued data from the message block TAO_Queued_Data *make_queued_data (ACE_Message_Block &incoming); - /// Implement send_message_shared() assuming the handler_lock_ is + /// Implement send_message_shared() assuming the handler_lock_ is /// held. int send_message_shared_i (TAO_Stub *stub, int message_semantics, const ACE_Message_Block *message_block, ACE_Time_Value *max_wait_time); - /// Check if the underlying event handler is still valid. - /** - * @return Returns -1 if not, 0 if it is. - */ - int check_event_handler_i (const char *caller); - public: - - - /// Send a message block chain, int send_message_block_chain (const ACE_Message_Block *message_block, size_t &bytes_transferred, ACE_Time_Value *max_wait_time = 0); - - /// Send a message block chain, assuming the lock is held int send_message_block_chain_i (const ACE_Message_Block *message_block, size_t &bytes_transferred, @@ -787,6 +696,11 @@ public: /// Set the state of the first_request_ flag to 0 void first_request_sent(); + + /// Notify all the components inside a Transport when the underlying + /// connection is closed. + void send_connection_closed_notifications (void); + private: /// Helper method that returns the Transport Cache Manager. @@ -876,7 +790,6 @@ private: /// not pending void reset_flush_timer (void); - /// Print out error messages if the event handler is not valid void report_invalid_event_handler (const char *caller); @@ -893,32 +806,9 @@ private: */ int notify_reactor (void); - /// Grab the mutex and then call invalidate_event_handler_i() - TAO_Connection_Handler * invalidate_event_handler (void); - - /// Notify all the components inside a Transport when the underlying - /// connection is closed. - void send_connection_closed_notifications (void); - /// Assume the lock is held void send_connection_closed_notifications_i (void); - /// Implement close_connection() assuming the handler_lock_ is held. - void close_connection_i (void); - - /// This class needs priviledged access to: - /// close_connection_no_purge () - friend class TAO_Transport_Cache_Manager; - - /// Close the underlying connection, do not purge the entry from the - /// map (supposedly it was purged already, trust the caller, yuck!) - void close_connection_no_purge (void); - - /// Close the underlying connection, implements the code shared by - /// all the close_connection_* variants. - void close_connection_shared (int purge, - TAO_Connection_Handler * eh); - /// Prohibited ACE_UNIMPLEMENTED_FUNC (TAO_Transport (const TAO_Transport&)) ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Transport&)) @@ -1005,6 +895,7 @@ protected: unsigned long purging_order_; private: + /// @@Phil, I think it would be nice if we could think of a way to /// do the following. /// We have been trying to use the transport for marking about diff --git a/TAO/tao/Transport.inl b/TAO/tao/Transport.inl index 53da1d841b9..ab9770b43f4 100644 --- a/TAO/tao/Transport.inl +++ b/TAO/tao/Transport.inl @@ -44,7 +44,6 @@ TAO_Transport::cache_map_entry (void) return this->cache_map_entry_; } - ACE_INLINE void TAO_Transport::cache_map_entry ( TAO_Transport_Cache_Manager::HASH_MAP_ENTRY *entry) @@ -90,8 +89,6 @@ TAO_Transport::queue_is_empty (void) return this->queue_is_empty_i (); } - - ACE_INLINE int TAO_Transport::flush_timer_pending (void) const { @@ -105,20 +102,6 @@ TAO_Transport::reset_flush_timer (void) this->current_deadline_ = ACE_Time_Value::zero; } -ACE_INLINE int -TAO_Transport::check_event_handler_i (const char *caller) -{ - // if there's no associated event handler, then we act like a null - // transport - if (this->event_handler_i () == 0) - { - this->report_invalid_event_handler (caller); - errno = ENOENT; - return -1; - } - return 0; -} - //******************************************************************** // codeset related methods @@ -162,17 +145,17 @@ TAO_Transport::first_request_sent (void) this->first_request_ = 0; } - - /*****************************************************/ + ACE_INLINE TAO_Transport_Refcount_Guard::TAO_Transport_Refcount_Guard (TAO_Transport *t) - :tr_ (TAO_Transport::_duplicate (t)) + : tr_ (t) { + this->tr_->add_reference (); } ACE_INLINE TAO_Transport_Refcount_Guard::~TAO_Transport_Refcount_Guard (void) { - TAO_Transport::release (this->tr_); + this->tr_->remove_reference (); } diff --git a/TAO/tao/Transport_Cache_Manager.cpp b/TAO/tao/Transport_Cache_Manager.cpp index de48e770861..b6a4ccae4ab 100644 --- a/TAO/tao/Transport_Cache_Manager.cpp +++ b/TAO/tao/Transport_Cache_Manager.cpp @@ -13,12 +13,10 @@ # include "tao/Transport_Cache_Manager.inl" #endif /* __ACE_INLINE__ */ - ACE_RCSID (TAO, Transport_Cache_Manager, "$Id$") - TAO_Transport_Cache_Manager::TAO_Transport_Cache_Manager (TAO_ORB_Core &orb_core) : percent_ (orb_core.resource_factory ()->purge_percentage ()), purging_strategy_ (orb_core.resource_factory ()->create_purging_strategy ()), @@ -98,8 +96,6 @@ TAO_Transport_Cache_Manager::bind_i (TAO_Cache_ExtId &ext_id, // are holding our lock this->purging_strategy_->update_item (int_id.transport ()); - - int retval = this->cache_map_.bind (ext_id, int_id, entry); @@ -119,7 +115,6 @@ TAO_Transport_Cache_Manager::bind_i (TAO_Cache_ExtId &ext_id, "Trying with a new index\n")); } - // There was an entry like this before, so let us do some // minor adjustments and rebind retval = this->get_last_index_bind (ext_id, @@ -195,8 +190,6 @@ TAO_Transport_Cache_Manager::find (const TAO_Cache_ExtId &key, return status; } - - int TAO_Transport_Cache_Manager::find_i (const TAO_Cache_ExtId &key, TAO_Cache_IntId &value) @@ -284,7 +277,6 @@ TAO_Transport_Cache_Manager::make_idle_i (HASH_MAP_ENTRY *&entry) return 0; } - int TAO_Transport_Cache_Manager::update_entry (HASH_MAP_ENTRY *&entry) { @@ -307,8 +299,7 @@ TAO_Transport_Cache_Manager::update_entry (HASH_MAP_ENTRY *&entry) } int -TAO_Transport_Cache_Manager::close_i (ACE_Handle_Set &reactor_registered, - TAO_EventHandlerSet &unregistered) +TAO_Transport_Cache_Manager::close_i (TAO_Connection_Handler_Set &handlers) { HASH_MAP_ITER end_iter = this->cache_map_.end (); @@ -322,10 +313,8 @@ TAO_Transport_Cache_Manager::close_i (ACE_Handle_Set &reactor_registered, if ((*iter).int_id_.recycle_state () != ACE_RECYCLABLE_CLOSED) { - // Get the transport to fill its associated connection's handle in - // the handle sets. - (*iter).int_id_.transport ()->provide_handle (reactor_registered, - unregistered); + // Get the transport to fill its associated connection's handler. + (*iter).int_id_.transport ()->provide_handler (handlers); // Inform the transport that has a reference to the entry in the // map that we are *gone* now. So, the transport should not use // the reference to the entry that he has, to acces us *at any @@ -463,12 +452,13 @@ TAO_Transport_Cache_Manager::purge (void) int count = 0; for(int i = 0; count < amount && i < sorted_size; i++) { - if (this->is_entry_idle(sorted_set[i])) + if (this->is_entry_idle (sorted_set[i])) { sorted_set[i]->int_id_.recycle_state (ACE_RECYCLABLE_BUSY); TAO_Transport* transport = sorted_set[i]->int_id_.transport (); - if (transports_to_be_closed.push (TAO_Transport::_duplicate(transport)) != 0) + transport->add_reference (); + if (transports_to_be_closed.push (transport) != 0) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("TAO (%P|%t) - ") @@ -484,16 +474,6 @@ TAO_Transport_Cache_Manager::purge (void) transport->id ())); } - // We need to save the cache_map_entry before we - // set it to zero, so we can call purge_entry_i() - // after we call close_connection_no_purge (). - HASH_MAP_ENTRY* entry = transport->cache_map_entry (); - - // This is a bit ugly, but we must do this to - // avoid taking and giving locks inside this loop. - transport->cache_map_entry (0); - this->purge_entry_i (entry); - // Count this as a successful purged entry count++; } @@ -512,8 +492,10 @@ TAO_Transport_Cache_Manager::purge (void) if (transports_to_be_closed.pop (transport) == 0) { if (transport) - transport->close_connection_no_purge (); - TAO_Transport::release (transport); + { + transport->close_connection (); + transport->remove_reference (); + } } } diff --git a/TAO/tao/Transport_Cache_Manager.h b/TAO/tao/Transport_Cache_Manager.h index b1a0e43cfe4..d5d16c8c4ff 100644 --- a/TAO/tao/Transport_Cache_Manager.h +++ b/TAO/tao/Transport_Cache_Manager.h @@ -17,20 +17,14 @@ #include "tao/Cache_Entries.h" - #if !defined (ACE_LACKS_PRAGMA_ONCE) #define ACE_LACKS_PRAGMA_ONCE #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "ace/Hash_Map_Manager_T.h" #include "ace/Synch_T.h" -// #include "tao/TAO_Export.h" -// #include "tao/Cache_Entries.h" -// #include "tao/Connection_Purging_Strategy.h" - - class ACE_Handle_Set; -class ACE_Event_Handler; +class TAO_Connection_Handler; class TAO_ORB_Core; class TAO_Resource_Factory; class TAO_Connection_Purging_Strategy; @@ -39,9 +33,7 @@ template class TAO_Condition; template class ACE_Unbounded_Set; template class ACE_Unbounded_Set_Iterator; -typedef ACE_Unbounded_Set TAO_EventHandlerSet; -typedef ACE_Unbounded_Set_Iterator - TAO_EventHandlerSetIterator; +typedef ACE_Unbounded_Set TAO_Connection_Handler_Set; /** * @class TAO_Transport_Cache_Manager @@ -119,10 +111,9 @@ public: /// strategy policy information. int update_entry (HASH_MAP_ENTRY *&entry); - /// Close the underlying hash map manager and return the handle set - /// that have been registered with the reactor - int close (ACE_Handle_Set &reactor_registered, - TAO_EventHandlerSet &unregistered); + /// Close the underlying hash map manager and return any handlers + /// still registered + int close (TAO_Connection_Handler_Set &handlers); /// Return the current size of the cache. size_t current_size (void) const; @@ -169,8 +160,7 @@ private: int make_idle_i (HASH_MAP_ENTRY *&entry); /// Non-locking version and actual implementation of close () - int close_i (ACE_Handle_Set &reactor_registered, - TAO_EventHandlerSet &unregistered); + int close_i (TAO_Connection_Handler_Set &handlers); /// Purge the entry from the Cache Map int purge_entry_i (HASH_MAP_ENTRY *&entry); diff --git a/TAO/tao/Transport_Cache_Manager.inl b/TAO/tao/Transport_Cache_Manager.inl index edb29408083..9163ef1907d 100644 --- a/TAO/tao/Transport_Cache_Manager.inl +++ b/TAO/tao/Transport_Cache_Manager.inl @@ -108,8 +108,7 @@ TAO_Transport_Cache_Manager::make_idle (HASH_MAP_ENTRY *&entry) ACE_INLINE int -TAO_Transport_Cache_Manager::close (ACE_Handle_Set &reactor_registered, - TAO_EventHandlerSet &unregistered) +TAO_Transport_Cache_Manager::close (TAO_Connection_Handler_Set &handlers) { // The cache lock pointer should only be zero if // Transport_Cache_Manager::open() was never called. Note that @@ -123,7 +122,7 @@ TAO_Transport_Cache_Manager::close (ACE_Handle_Set &reactor_registered, *this->cache_lock_, -1)); - return this->close_i (reactor_registered, unregistered); + return this->close_i (handlers); } diff --git a/TAO/tao/Wait_On_Read.cpp b/TAO/tao/Wait_On_Read.cpp index 572554525fb..36968e49e46 100644 --- a/TAO/tao/Wait_On_Read.cpp +++ b/TAO/tao/Wait_On_Read.cpp @@ -36,9 +36,9 @@ TAO_Wait_On_Read::wait (ACE_Time_Value * max_wait_time, while (1) { retval = - this->transport_->handle_input_i (rh, - max_wait_time, - 1); + this->transport_->handle_input (rh, + max_wait_time, + 1); // If we got our reply, no need to run the loop any // further. diff --git a/TAO/tao/tao.mpc b/TAO/tao/tao.mpc index 4fe533cb167..320491695e2 100644 --- a/TAO/tao/tao.mpc +++ b/TAO/tao/tao.mpc @@ -15,7 +15,6 @@ project(TAO) : acelib, taoversion, core, tao_output { Transport_Connector.cpp Transport.cpp Incoming_Message_Queue.cpp - Notify_Handler.cpp Resume_Handle.cpp Profile.cpp Endpoint.cpp diff --git a/TAO/tests/Bug_1361_Regression/Bug_1361_Regression.dsw b/TAO/tests/Bug_1361_Regression/Bug_1361_Regression.dsw new file mode 100644 index 00000000000..02e8e8ae61c --- /dev/null +++ b/TAO/tests/Bug_1361_Regression/Bug_1361_Regression.dsw @@ -0,0 +1,53 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Bug_1361_Regression Client"=.\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1361_Regression Server"=.\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1361_Regression Shutdown"=.\shutdown.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/TAO/tests/Bug_1361_Regression/client.dsp b/TAO/tests/Bug_1361_Regression/client.dsp new file mode 100644 index 00000000000..4250d5c1a49 --- /dev/null +++ b/TAO/tests/Bug_1361_Regression/client.dsp @@ -0,0 +1,213 @@ +# Microsoft Developer Studio Project File - Name="Bug_1361_Regression Client" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Bug_1361_Regression Client - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "client.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "client.mak" CFG="Bug_1361_Regression Client - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Bug_1361_Regression Client - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Bug_1361_Regression Client - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Bug_1361_Regression Client - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "..\..\.." /I "..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 ace.lib TAO.lib TAO_PortableServer.lib TAO_Messaging.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\Messaging" + +!ELSEIF "$(CFG)" == "Bug_1361_Regression Client - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /Zi /Od /I "..\..\.." /I "..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 aced.lib TAOd.lib TAO_PortableServerd.lib TAO_Messagingd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\Messaging" + +!ENDIF + +# Begin Target + +# Name "Bug_1361_Regression Client - Win32 Release" +# Name "Bug_1361_Regression Client - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\client.cpp +# End Source File +# Begin Source File + +SOURCE=.\ORB_Task.cpp +# End Source File +# Begin Source File + +SOURCE=.\Echo.cpp +# End Source File +# Begin Source File + +SOURCE=.\testC.cpp +# End Source File +# Begin Source File + +SOURCE=.\testS.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\Client_Task.h +# End Source File +# Begin Source File + +SOURCE=.\Echo.h +# End Source File +# Begin Source File + +SOURCE=.\testC.h +# End Source File +# End Group +# Begin Group "IDL Files" + +# PROP Default_Filter "idl" +# Begin Source File + +SOURCE=.\test.idl + +!IF "$(CFG)" == "Bug_1361_Regression Client - Win32 Release" + +USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" +# Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "Bug_1361_Regression Client - Win32 Debug" + +USERDEP__TEST_="..\..\..\bin\tao_idl.exe" +# Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# End Target +# End Project diff --git a/TAO/tests/Bug_1361_Regression/server.dsp b/TAO/tests/Bug_1361_Regression/server.dsp new file mode 100644 index 00000000000..5ba5a906b61 --- /dev/null +++ b/TAO/tests/Bug_1361_Regression/server.dsp @@ -0,0 +1,219 @@ +# Microsoft Developer Studio Project File - Name="Bug_1361_Regression Server" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Bug_1361_Regression Server - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "server.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "server.mak" CFG="Bug_1361_Regression Server - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Bug_1361_Regression Server - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Bug_1361_Regression Server - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Bug_1361_Regression Server - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "..\..\.." /I "..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 ace.lib TAO.lib TAO_PortableServer.lib TAO_Messaging.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\Messaging" + +!ELSEIF "$(CFG)" == "Bug_1361_Regression Server - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "server___Win32_Debug" +# PROP BASE Intermediate_Dir "server___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /Zi /Od /I "..\..\.." /I "..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 aced.lib TAOd.lib TAO_PortableServerd.lib TAO_Messagingd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\Messaging" + +!ENDIF + +# Begin Target + +# Name "Bug_1361_Regression Server - Win32 Release" +# Name "Bug_1361_Regression Server - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\Echo_Caller.cpp +# End Source File +# Begin Source File + +SOURCE=.\ORB_Task.cpp +# End Source File +# Begin Source File + +SOURCE=.\server.cpp +# End Source File +# Begin Source File + +SOURCE=.\Server_Thread_Pool.cpp +# End Source File +# Begin Source File + +SOURCE=.\testC.cpp +# End Source File +# Begin Source File + +SOURCE=.\testS.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\Echo_Caller.h +# End Source File +# Begin Source File + +SOURCE=.\Server_Task.h +# End Source File +# Begin Source File + +SOURCE=.\testS.h +# End Source File +# End Group +# Begin Group "IDL Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\test.idl + +!IF "$(CFG)" == "Bug_1361_Regression Server - Win32 Release" + +USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" +# Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "Bug_1361_Regression Server - Win32 Debug" + +USERDEP__TEST_="..\..\..\bin\tao_idl.exe" +# Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# End Target +# End Project diff --git a/TAO/tests/Bug_1361_Regression/shutdown.dsp b/TAO/tests/Bug_1361_Regression/shutdown.dsp new file mode 100644 index 00000000000..2022fb10844 --- /dev/null +++ b/TAO/tests/Bug_1361_Regression/shutdown.dsp @@ -0,0 +1,193 @@ +# Microsoft Developer Studio Project File - Name="Bug_1361_Regression Shutdown" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Bug_1361_Regression Shutdown - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "shutdown.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "shutdown.mak" CFG="Bug_1361_Regression Shutdown - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Bug_1361_Regression Shutdown - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Bug_1361_Regression Shutdown - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Bug_1361_Regression Shutdown - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "..\..\.." /I "..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 ace.lib TAO.lib TAO_PortableServer.lib TAO_Messaging.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\Messaging" + +!ELSEIF "$(CFG)" == "Bug_1361_Regression Shutdown - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /Zi /Od /I "..\..\.." /I "..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 aced.lib TAOd.lib TAO_PortableServerd.lib TAO_Messagingd.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\Messaging" + +!ENDIF + +# Begin Target + +# Name "Bug_1361_Regression Shutdown - Win32 Release" +# Name "Bug_1361_Regression Shutdown - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\shutdown.cpp +# End Source File +# Begin Source File + +SOURCE=.\testC.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\testC.h +# End Source File +# End Group +# Begin Group "IDL Files" + +# PROP Default_Filter "idl" +# Begin Source File + +SOURCE=.\test.idl + +!IF "$(CFG)" == "Bug_1361_Regression Shutdown - Win32 Release" + +USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" +# Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "Bug_1361_Regression Shutdown - Win32 Debug" + +USERDEP__TEST_="..\..\..\bin\tao_idl.exe" +# Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# End Target +# End Project diff --git a/TAO/tests/Connection_Failure/Connection_Failure.dsw b/TAO/tests/Connection_Failure/Connection_Failure.dsw new file mode 100644 index 00000000000..98381b77d92 --- /dev/null +++ b/TAO/tests/Connection_Failure/Connection_Failure.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Connection_Failure Client"=.\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/TAO/tests/Connection_Failure/Connection_Failure.mpc b/TAO/tests/Connection_Failure/Connection_Failure.mpc new file mode 100644 index 00000000000..5cf9dd225d2 --- /dev/null +++ b/TAO/tests/Connection_Failure/Connection_Failure.mpc @@ -0,0 +1,9 @@ +project(*client): messaging, taoserver { + exename = client + + Source_Files { + testC.cpp + client.cpp + } +} + diff --git a/TAO/tests/Connection_Failure/Makefile b/TAO/tests/Connection_Failure/Makefile new file mode 100644 index 00000000000..0b24fa415ea --- /dev/null +++ b/TAO/tests/Connection_Failure/Makefile @@ -0,0 +1,700 @@ +#---------------------------------------------------------------------------- +# +# $Id$ +# +#---------------------------------------------------------------------------- + +#---------------------------------------------------------------------------- +# Local macros +#---------------------------------------------------------------------------- + +ifndef TAO_ROOT + TAO_ROOT = $(ACE_ROOT)/TAO +endif # ! TAO_ROOT + +IDL_FILES = test +IDL_SRC = testC.cpp +BIN = client + +include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU +include $(ACE_ROOT)/include/makeinclude/macros.GNU +include $(TAO_ROOT)/rules.tao.GNU + +SRC = $(addsuffix .cpp, $(BIN)) $(IDL_SRC) + +CLIENT_OBJS = client.o testC.o + + +TAO_IDLFLAGS += -Ge 1 +#---------------------------------------------------------------------------- +# Include macros and targets +#---------------------------------------------------------------------------- + +include $(ACE_ROOT)/include/makeinclude/rules.common.GNU +include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU +include $(ACE_ROOT)/include/makeinclude/rules.local.GNU +include $(TAO_ROOT)/taoconfig.mk + +#---------------------------------------------------------------------------- +# Local targets +#---------------------------------------------------------------------------- + +.PRECIOUS: $(foreach ext, $(IDL_EXT), test$(ext)) + +client: $(addprefix $(VDIR),$(CLIENT_OBJS)) + $(LINK.cc) $(LDFLAGS) -o $@ $^ $(TAO_CLNT_LIBS) $(POSTLINK) + +realclean: clean + -$(RM) $(foreach ext, $(IDL_EXT), test$(ext)) + +# DO NOT DELETE THIS LINE -- g++dep uses it. +# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. + + +.obj/client.o .obj/client.so .shobj/client.o .shobj/client.so: client.cpp testC.h \ + $(TAO_ROOT)/tao/corba.h \ + $(ACE_ROOT)/ace/pre.h \ + $(ACE_ROOT)/ace/post.h \ + $(ACE_ROOT)/ace/ace_wchar.h \ + $(ACE_ROOT)/ace/ace_wchar.inl \ + $(TAO_ROOT)/tao/corbafwd.h \ + $(ACE_ROOT)/ace/CDR_Base.h \ + $(ACE_ROOT)/ace/Basic_Types.h \ + $(ACE_ROOT)/ace/ACE_export.h \ + $(ACE_ROOT)/ace/Basic_Types.i \ + $(ACE_ROOT)/ace/Default_Constants.h \ + $(ACE_ROOT)/ace/CDR_Base.inl \ + $(TAO_ROOT)/tao/orbconf.h \ + $(ACE_ROOT)/ace/Global_Macros.h \ + $(ACE_ROOT)/ace/OS_Export.h \ + $(TAO_ROOT)/tao/TAO_Export.h \ + $(ACE_ROOT)/ace/OS_Memory.h \ + $(ACE_ROOT)/ace/OS_Errno.h \ + $(ACE_ROOT)/ace/OS_Errno.inl \ + $(ACE_ROOT)/ace/OS_Memory.inl \ + $(TAO_ROOT)/tao/corbafwd.i \ + $(TAO_ROOT)/tao/Typecode.h \ + $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ + $(ACE_ROOT)/ace/Functor.h \ + $(ACE_ROOT)/ace/ACE.h \ + $(ACE_ROOT)/ace/OS.h \ + $(ACE_ROOT)/ace/OS_Dirent.h \ + $(ACE_ROOT)/ace/OS_Dirent.inl \ + $(ACE_ROOT)/ace/OS_String.h \ + $(ACE_ROOT)/ace/OS_String.inl \ + $(ACE_ROOT)/ace/OS_TLI.h \ + $(ACE_ROOT)/ace/OS_TLI.inl \ + $(ACE_ROOT)/ace/Time_Value.h \ + $(ACE_ROOT)/ace/Time_Value.inl \ + $(ACE_ROOT)/ace/Min_Max.h \ + $(ACE_ROOT)/ace/streams.h \ + $(ACE_ROOT)/ace/Trace.h \ + $(ACE_ROOT)/ace/OS.i \ + $(ACE_ROOT)/ace/Flag_Manip.h \ + $(ACE_ROOT)/ace/Flag_Manip.i \ + $(ACE_ROOT)/ace/Handle_Ops.h \ + $(ACE_ROOT)/ace/Handle_Ops.i \ + $(ACE_ROOT)/ace/Lib_Find.h \ + $(ACE_ROOT)/ace/Lib_Find.i \ + $(ACE_ROOT)/ace/Init_ACE.h \ + $(ACE_ROOT)/ace/Init_ACE.i \ + $(ACE_ROOT)/ace/Sock_Connect.h \ + $(ACE_ROOT)/ace/Sock_Connect.i \ + $(ACE_ROOT)/ace/ACE.i \ + $(ACE_ROOT)/ace/Functor.i \ + $(ACE_ROOT)/ace/Functor_T.h \ + $(ACE_ROOT)/ace/Functor_T.i \ + $(ACE_ROOT)/ace/Functor_T.cpp \ + $(ACE_ROOT)/ace/Log_Msg.h \ + $(ACE_ROOT)/ace/Log_Priority.h \ + $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ + $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \ + $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ + $(ACE_ROOT)/ace/Synch.h \ + $(ACE_ROOT)/ace/Synch.i \ + $(ACE_ROOT)/ace/Synch_T.h \ + $(ACE_ROOT)/ace/Synch_T.i \ + $(ACE_ROOT)/ace/Thread.h \ + $(ACE_ROOT)/ace/Thread_Adapter.h \ + $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ + $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \ + $(ACE_ROOT)/ace/Thread_Adapter.inl \ + $(ACE_ROOT)/ace/Thread.i \ + $(ACE_ROOT)/ace/Synch_T.cpp \ + $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ + $(ACE_ROOT)/ace/Service_Config.h \ + $(ACE_ROOT)/ace/Unbounded_Queue.h \ + $(ACE_ROOT)/ace/Node.h \ + $(ACE_ROOT)/ace/Node.cpp \ + $(ACE_ROOT)/ace/Unbounded_Queue.inl \ + $(ACE_ROOT)/ace/Unbounded_Queue.cpp \ + $(ACE_ROOT)/ace/Malloc_Base.h \ + $(ACE_ROOT)/ace/Unbounded_Set.h \ + $(ACE_ROOT)/ace/Unbounded_Set.inl \ + $(ACE_ROOT)/ace/Unbounded_Set.cpp \ + $(ACE_ROOT)/ace/SString.h \ + $(ACE_ROOT)/ace/SStringfwd.h \ + $(ACE_ROOT)/ace/String_Base.h \ + $(ACE_ROOT)/ace/String_Base_Const.h \ + $(ACE_ROOT)/ace/String_Base.i \ + $(ACE_ROOT)/ace/String_Base.cpp \ + $(ACE_ROOT)/ace/Malloc.h \ + $(ACE_ROOT)/ace/Malloc.i \ + $(ACE_ROOT)/ace/Malloc_T.h \ + $(ACE_ROOT)/ace/Malloc_Allocator.h \ + $(ACE_ROOT)/ace/Malloc_Allocator.i \ + $(ACE_ROOT)/ace/Free_List.h \ + $(ACE_ROOT)/ace/Free_List.i \ + $(ACE_ROOT)/ace/Free_List.cpp \ + $(ACE_ROOT)/ace/Malloc_T.i \ + $(ACE_ROOT)/ace/Malloc_T.cpp \ + $(ACE_ROOT)/ace/Memory_Pool.h \ + $(ACE_ROOT)/ace/Event_Handler.h \ + $(ACE_ROOT)/ace/Event_Handler.i \ + $(ACE_ROOT)/ace/Signal.h \ + $(ACE_ROOT)/ace/Signal.i \ + $(ACE_ROOT)/ace/Mem_Map.h \ + $(ACE_ROOT)/ace/Mem_Map.i \ + $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ + $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ + $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ + $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ + $(ACE_ROOT)/ace/Memory_Pool.i \ + $(ACE_ROOT)/ace/Auto_Ptr.h \ + $(ACE_ROOT)/ace/Auto_Ptr.i \ + $(ACE_ROOT)/ace/Auto_Ptr.cpp \ + $(ACE_ROOT)/ace/SString.i \ + $(ACE_ROOT)/ace/XML_Svc_Conf.h \ + $(ACE_ROOT)/ace/Service_Config.i \ + $(ACE_ROOT)/ace/Reactor.h \ + $(ACE_ROOT)/ace/Handle_Set.h \ + $(ACE_ROOT)/ace/Handle_Set.i \ + $(ACE_ROOT)/ace/Timer_Queue.h \ + $(ACE_ROOT)/ace/Timer_Queue_T.h \ + $(ACE_ROOT)/ace/Test_and_Set.h \ + $(ACE_ROOT)/ace/Test_and_Set.i \ + $(ACE_ROOT)/ace/Test_and_Set.cpp \ + $(ACE_ROOT)/ace/Timer_Queue_T.i \ + $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ + $(ACE_ROOT)/ace/Reactor.i \ + $(ACE_ROOT)/ace/Reactor_Impl.h \ + $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ + $(TAO_ROOT)/tao/Exception.h \ + $(ACE_ROOT)/ace/CORBA_macros.h \ + $(ACE_ROOT)/ace/Exception_Macros.h \ + $(ACE_ROOT)/ace/iosfwd.h \ + $(TAO_ROOT)/tao/Exception.i \ + $(TAO_ROOT)/tao/Pseudo_VarOut_T.h \ + $(TAO_ROOT)/tao/Pseudo_VarOut_T.inl \ + $(TAO_ROOT)/tao/Pseudo_VarOut_T.cpp \ + $(TAO_ROOT)/tao/Typecode.i \ + $(TAO_ROOT)/tao/Any_Impl_T.h \ + $(TAO_ROOT)/tao/Any.h \ + $(ACE_ROOT)/ace/CDR_Stream.h \ + $(ACE_ROOT)/ace/Message_Block.h \ + $(ACE_ROOT)/ace/Message_Block.i \ + $(ACE_ROOT)/ace/Message_Block_T.h \ + $(ACE_ROOT)/ace/Message_Block_T.i \ + $(ACE_ROOT)/ace/Message_Block_T.cpp \ + $(ACE_ROOT)/ace/CDR_Stream.i \ + $(TAO_ROOT)/tao/Object.h \ + $(TAO_ROOT)/tao/Policy_ForwardC.h \ + $(TAO_ROOT)/tao/Sequence.h \ + $(TAO_ROOT)/tao/Managed_Types.h \ + $(TAO_ROOT)/tao/Managed_Types.i \ + $(TAO_ROOT)/tao/Sequence.i \ + $(TAO_ROOT)/tao/Sequence_T.h \ + $(TAO_ROOT)/tao/Sequence_T.i \ + $(TAO_ROOT)/tao/Sequence_T.cpp \ + $(TAO_ROOT)/tao/Environment.h \ + $(TAO_ROOT)/tao/Environment.i \ + $(TAO_ROOT)/tao/CDR.h \ + $(TAO_ROOT)/tao/CDR.i \ + $(TAO_ROOT)/tao/Objref_VarOut_T.h \ + $(TAO_ROOT)/tao/varbase.h \ + $(TAO_ROOT)/tao/Objref_VarOut_T.inl \ + $(TAO_ROOT)/tao/Objref_VarOut_T.cpp \ + $(TAO_ROOT)/tao/Seq_Var_T.h \ + $(TAO_ROOT)/tao/Seq_Var_T.inl \ + $(TAO_ROOT)/tao/Seq_Var_T.cpp \ + $(TAO_ROOT)/tao/Seq_Out_T.h \ + $(TAO_ROOT)/tao/Seq_Out_T.inl \ + $(TAO_ROOT)/tao/Seq_Out_T.cpp \ + $(TAO_ROOT)/tao/Policy_ForwardC.i \ + $(TAO_ROOT)/tao/Object_KeyC.h \ + $(TAO_ROOT)/tao/Object_KeyC.i \ + $(TAO_ROOT)/tao/IOP_IORC.h \ + $(TAO_ROOT)/tao/OctetSeqC.h \ + $(TAO_ROOT)/tao/OctetSeqC.i \ + $(TAO_ROOT)/tao/VarOut_T.h \ + $(TAO_ROOT)/tao/VarOut_T.inl \ + $(TAO_ROOT)/tao/VarOut_T.cpp \ + $(TAO_ROOT)/tao/IOP_IORC.i \ + $(TAO_ROOT)/tao/Object.i \ + $(TAO_ROOT)/tao/Any.i \ + $(TAO_ROOT)/tao/Any_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Impl_T.cpp \ + $(TAO_ROOT)/tao/Marshal.h \ + $(TAO_ROOT)/tao/Marshal.i \ + $(TAO_ROOT)/tao/debug.h \ + $(TAO_ROOT)/tao/Any_Basic_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Basic_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Basic_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Special_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Special_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Special_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Special_Basic_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Special_Basic_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Special_Basic_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Array_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Array_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Array_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Dual_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Dual_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Dual_Impl_T.cpp \ + $(TAO_ROOT)/tao/NVList.h \ + $(TAO_ROOT)/tao/NVList.i \ + $(TAO_ROOT)/tao/LocalObject.h \ + $(TAO_ROOT)/tao/LocalObject.i \ + $(TAO_ROOT)/tao/Principal.h \ + $(TAO_ROOT)/tao/Principal.i \ + $(TAO_ROOT)/tao/ORB.h \ + $(TAO_ROOT)/tao/ServicesC.h \ + $(TAO_ROOT)/tao/ServicesC.i \ + $(TAO_ROOT)/tao/CORBA_String.h \ + $(TAO_ROOT)/tao/CORBA_String.inl \ + $(TAO_ROOT)/tao/ObjectIdListC.h \ + $(TAO_ROOT)/tao/ObjectIdListC.i \ + $(TAO_ROOT)/tao/objectid.h \ + $(TAO_ROOT)/tao/PolicyC.h \ + $(TAO_ROOT)/tao/CurrentC.h \ + $(TAO_ROOT)/tao/CurrentC.i \ + $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ + $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ + $(TAO_ROOT)/tao/PolicyC.i \ + $(TAO_ROOT)/tao/ORB.i \ + $(TAO_ROOT)/tao/BoundsC.h \ + $(TAO_ROOT)/tao/BoundsC.i \ + $(TAO_ROOT)/tao/DomainC.h \ + $(TAO_ROOT)/tao/DomainC.i \ + $(TAO_ROOT)/tao/WrongTransactionC.h \ + $(TAO_ROOT)/tao/WrongTransactionC.i \ + $(TAO_ROOT)/tao/Array_VarOut_T.h \ + $(TAO_ROOT)/tao/Array_VarOut_T.inl \ + $(TAO_ROOT)/tao/Array_VarOut_T.cpp \ + $(TAO_ROOT)/tao/StringSeqC.h \ + $(TAO_ROOT)/tao/StringSeqC.i \ + $(TAO_ROOT)/tao/PortableInterceptorC.h \ + $(TAO_ROOT)/tao/PI_ForwardC.h \ + $(TAO_ROOT)/tao/PI_ForwardC.i \ + $(TAO_ROOT)/tao/DynamicC.h \ + $(TAO_ROOT)/tao/DynamicC.i \ + $(TAO_ROOT)/tao/Messaging_SyncScopeC.h \ + $(TAO_ROOT)/tao/Messaging_SyncScopeC.i \ + $(TAO_ROOT)/tao/IOPC.h \ + $(TAO_ROOT)/tao/IOP_CodecC.h \ + $(TAO_ROOT)/tao/IOP_CodecC.i \ + $(TAO_ROOT)/tao/IOPC.i \ + $(TAO_ROOT)/tao/PortableInterceptorC.i \ + testC.i \ + $(ACE_ROOT)/ace/Get_Opt.h \ + $(ACE_ROOT)/ace/Containers.h \ + $(ACE_ROOT)/ace/Containers.i \ + $(ACE_ROOT)/ace/Containers_T.h \ + $(ACE_ROOT)/ace/Array_Base.h \ + $(ACE_ROOT)/ace/Array_Base.inl \ + $(ACE_ROOT)/ace/Array_Base.cpp \ + $(ACE_ROOT)/ace/Containers_T.i \ + $(ACE_ROOT)/ace/Containers_T.cpp \ + $(ACE_ROOT)/ace/Get_Opt.i \ + $(ACE_ROOT)/ace/Profile_Timer.h \ + $(ACE_ROOT)/ace/High_Res_Timer.h \ + $(ACE_ROOT)/ace/High_Res_Timer.i \ + $(ACE_ROOT)/ace/Profile_Timer.i \ + $(TAO_ROOT)/tao/Messaging/Messaging.h \ + $(TAO_ROOT)/tao/Messaging/messaging_export.h \ + $(TAO_ROOT)/tao/Messaging/MessagingC.h \ + $(TAO_ROOT)/tao/Messaging/Messaging_SyncScope_PolicyC.h \ + $(TAO_ROOT)/tao/Messaging/Messaging_SyncScope_PolicyC.i \ + $(TAO_ROOT)/tao/Messaging/Messaging_RT_PolicyC.h \ + $(TAO_ROOT)/tao/TimeBaseC.h \ + $(TAO_ROOT)/tao/TimeBaseC.i \ + $(TAO_ROOT)/tao/Messaging/Messaging_RT_PolicyC.i \ + $(TAO_ROOT)/tao/Messaging/Messaging_No_ImplC.h \ + $(TAO_ROOT)/tao/Messaging/Messaging_No_ImplC.i \ + $(TAO_ROOT)/tao/Valuetype/Value_VarOut_T.h \ + $(TAO_ROOT)/tao/Valuetype/Value_VarOut_T.inl \ + $(TAO_ROOT)/tao/Valuetype/Value_VarOut_T.cpp \ + $(TAO_ROOT)/tao/Valuetype/ValueBase.h \ + $(TAO_ROOT)/tao/Valuetype/valuetype_export.h \ + $(TAO_ROOT)/tao/Valuetype/ValueBase.inl \ + $(TAO_ROOT)/tao/Valuetype/ValueFactory.h \ + $(TAO_ROOT)/tao/Valuetype/ValueFactory.inl \ + $(TAO_ROOT)/tao/Messaging/MessagingC.i \ + $(TAO_ROOT)/tao/Messaging/TAO_ExtC.h \ + $(TAO_ROOT)/tao/Messaging/TAO_ExtC.i \ + $(TAO_ROOT)/tao/TAOC.h \ + $(TAO_ROOT)/tao/TAOC.i + +.obj/testC.o .obj/testC.so .shobj/testC.o .shobj/testC.so: testC.cpp testC.h \ + $(TAO_ROOT)/tao/corba.h \ + $(ACE_ROOT)/ace/pre.h \ + $(ACE_ROOT)/ace/post.h \ + $(ACE_ROOT)/ace/ace_wchar.h \ + $(ACE_ROOT)/ace/ace_wchar.inl \ + $(TAO_ROOT)/tao/corbafwd.h \ + $(ACE_ROOT)/ace/CDR_Base.h \ + $(ACE_ROOT)/ace/Basic_Types.h \ + $(ACE_ROOT)/ace/ACE_export.h \ + $(ACE_ROOT)/ace/Basic_Types.i \ + $(ACE_ROOT)/ace/Default_Constants.h \ + $(ACE_ROOT)/ace/CDR_Base.inl \ + $(TAO_ROOT)/tao/orbconf.h \ + $(ACE_ROOT)/ace/Global_Macros.h \ + $(ACE_ROOT)/ace/OS_Export.h \ + $(TAO_ROOT)/tao/TAO_Export.h \ + $(ACE_ROOT)/ace/OS_Memory.h \ + $(ACE_ROOT)/ace/OS_Errno.h \ + $(ACE_ROOT)/ace/OS_Errno.inl \ + $(ACE_ROOT)/ace/OS_Memory.inl \ + $(TAO_ROOT)/tao/corbafwd.i \ + $(TAO_ROOT)/tao/Typecode.h \ + $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ + $(ACE_ROOT)/ace/Functor.h \ + $(ACE_ROOT)/ace/ACE.h \ + $(ACE_ROOT)/ace/OS.h \ + $(ACE_ROOT)/ace/OS_Dirent.h \ + $(ACE_ROOT)/ace/OS_Dirent.inl \ + $(ACE_ROOT)/ace/OS_String.h \ + $(ACE_ROOT)/ace/OS_String.inl \ + $(ACE_ROOT)/ace/OS_TLI.h \ + $(ACE_ROOT)/ace/OS_TLI.inl \ + $(ACE_ROOT)/ace/Time_Value.h \ + $(ACE_ROOT)/ace/Time_Value.inl \ + $(ACE_ROOT)/ace/Min_Max.h \ + $(ACE_ROOT)/ace/streams.h \ + $(ACE_ROOT)/ace/Trace.h \ + $(ACE_ROOT)/ace/OS.i \ + $(ACE_ROOT)/ace/Flag_Manip.h \ + $(ACE_ROOT)/ace/Flag_Manip.i \ + $(ACE_ROOT)/ace/Handle_Ops.h \ + $(ACE_ROOT)/ace/Handle_Ops.i \ + $(ACE_ROOT)/ace/Lib_Find.h \ + $(ACE_ROOT)/ace/Lib_Find.i \ + $(ACE_ROOT)/ace/Init_ACE.h \ + $(ACE_ROOT)/ace/Init_ACE.i \ + $(ACE_ROOT)/ace/Sock_Connect.h \ + $(ACE_ROOT)/ace/Sock_Connect.i \ + $(ACE_ROOT)/ace/ACE.i \ + $(ACE_ROOT)/ace/Functor.i \ + $(ACE_ROOT)/ace/Functor_T.h \ + $(ACE_ROOT)/ace/Functor_T.i \ + $(ACE_ROOT)/ace/Functor_T.cpp \ + $(ACE_ROOT)/ace/Log_Msg.h \ + $(ACE_ROOT)/ace/Log_Priority.h \ + $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ + $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.inl \ + $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ + $(ACE_ROOT)/ace/Synch.h \ + $(ACE_ROOT)/ace/Synch.i \ + $(ACE_ROOT)/ace/Synch_T.h \ + $(ACE_ROOT)/ace/Synch_T.i \ + $(ACE_ROOT)/ace/Thread.h \ + $(ACE_ROOT)/ace/Thread_Adapter.h \ + $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ + $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \ + $(ACE_ROOT)/ace/Thread_Adapter.inl \ + $(ACE_ROOT)/ace/Thread.i \ + $(ACE_ROOT)/ace/Synch_T.cpp \ + $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ + $(ACE_ROOT)/ace/Service_Config.h \ + $(ACE_ROOT)/ace/Unbounded_Queue.h \ + $(ACE_ROOT)/ace/Node.h \ + $(ACE_ROOT)/ace/Node.cpp \ + $(ACE_ROOT)/ace/Unbounded_Queue.inl \ + $(ACE_ROOT)/ace/Unbounded_Queue.cpp \ + $(ACE_ROOT)/ace/Malloc_Base.h \ + $(ACE_ROOT)/ace/Unbounded_Set.h \ + $(ACE_ROOT)/ace/Unbounded_Set.inl \ + $(ACE_ROOT)/ace/Unbounded_Set.cpp \ + $(ACE_ROOT)/ace/SString.h \ + $(ACE_ROOT)/ace/SStringfwd.h \ + $(ACE_ROOT)/ace/String_Base.h \ + $(ACE_ROOT)/ace/String_Base_Const.h \ + $(ACE_ROOT)/ace/String_Base.i \ + $(ACE_ROOT)/ace/String_Base.cpp \ + $(ACE_ROOT)/ace/Malloc.h \ + $(ACE_ROOT)/ace/Malloc.i \ + $(ACE_ROOT)/ace/Malloc_T.h \ + $(ACE_ROOT)/ace/Malloc_Allocator.h \ + $(ACE_ROOT)/ace/Malloc_Allocator.i \ + $(ACE_ROOT)/ace/Free_List.h \ + $(ACE_ROOT)/ace/Free_List.i \ + $(ACE_ROOT)/ace/Free_List.cpp \ + $(ACE_ROOT)/ace/Malloc_T.i \ + $(ACE_ROOT)/ace/Malloc_T.cpp \ + $(ACE_ROOT)/ace/Memory_Pool.h \ + $(ACE_ROOT)/ace/Event_Handler.h \ + $(ACE_ROOT)/ace/Event_Handler.i \ + $(ACE_ROOT)/ace/Signal.h \ + $(ACE_ROOT)/ace/Signal.i \ + $(ACE_ROOT)/ace/Mem_Map.h \ + $(ACE_ROOT)/ace/Mem_Map.i \ + $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ + $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ + $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ + $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ + $(ACE_ROOT)/ace/Memory_Pool.i \ + $(ACE_ROOT)/ace/Auto_Ptr.h \ + $(ACE_ROOT)/ace/Auto_Ptr.i \ + $(ACE_ROOT)/ace/Auto_Ptr.cpp \ + $(ACE_ROOT)/ace/SString.i \ + $(ACE_ROOT)/ace/XML_Svc_Conf.h \ + $(ACE_ROOT)/ace/Service_Config.i \ + $(ACE_ROOT)/ace/Reactor.h \ + $(ACE_ROOT)/ace/Handle_Set.h \ + $(ACE_ROOT)/ace/Handle_Set.i \ + $(ACE_ROOT)/ace/Timer_Queue.h \ + $(ACE_ROOT)/ace/Timer_Queue_T.h \ + $(ACE_ROOT)/ace/Test_and_Set.h \ + $(ACE_ROOT)/ace/Test_and_Set.i \ + $(ACE_ROOT)/ace/Test_and_Set.cpp \ + $(ACE_ROOT)/ace/Timer_Queue_T.i \ + $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ + $(ACE_ROOT)/ace/Reactor.i \ + $(ACE_ROOT)/ace/Reactor_Impl.h \ + $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ + $(TAO_ROOT)/tao/Exception.h \ + $(ACE_ROOT)/ace/CORBA_macros.h \ + $(ACE_ROOT)/ace/Exception_Macros.h \ + $(ACE_ROOT)/ace/iosfwd.h \ + $(TAO_ROOT)/tao/Exception.i \ + $(TAO_ROOT)/tao/Pseudo_VarOut_T.h \ + $(TAO_ROOT)/tao/Pseudo_VarOut_T.inl \ + $(TAO_ROOT)/tao/Pseudo_VarOut_T.cpp \ + $(TAO_ROOT)/tao/Typecode.i \ + $(TAO_ROOT)/tao/Any_Impl_T.h \ + $(TAO_ROOT)/tao/Any.h \ + $(ACE_ROOT)/ace/CDR_Stream.h \ + $(ACE_ROOT)/ace/Message_Block.h \ + $(ACE_ROOT)/ace/Message_Block.i \ + $(ACE_ROOT)/ace/Message_Block_T.h \ + $(ACE_ROOT)/ace/Message_Block_T.i \ + $(ACE_ROOT)/ace/Message_Block_T.cpp \ + $(ACE_ROOT)/ace/CDR_Stream.i \ + $(TAO_ROOT)/tao/Object.h \ + $(TAO_ROOT)/tao/Policy_ForwardC.h \ + $(TAO_ROOT)/tao/Sequence.h \ + $(TAO_ROOT)/tao/Managed_Types.h \ + $(TAO_ROOT)/tao/Managed_Types.i \ + $(TAO_ROOT)/tao/Sequence.i \ + $(TAO_ROOT)/tao/Sequence_T.h \ + $(TAO_ROOT)/tao/Sequence_T.i \ + $(TAO_ROOT)/tao/Sequence_T.cpp \ + $(TAO_ROOT)/tao/Environment.h \ + $(TAO_ROOT)/tao/Environment.i \ + $(TAO_ROOT)/tao/CDR.h \ + $(TAO_ROOT)/tao/CDR.i \ + $(TAO_ROOT)/tao/Objref_VarOut_T.h \ + $(TAO_ROOT)/tao/varbase.h \ + $(TAO_ROOT)/tao/Objref_VarOut_T.inl \ + $(TAO_ROOT)/tao/Objref_VarOut_T.cpp \ + $(TAO_ROOT)/tao/Seq_Var_T.h \ + $(TAO_ROOT)/tao/Seq_Var_T.inl \ + $(TAO_ROOT)/tao/Seq_Var_T.cpp \ + $(TAO_ROOT)/tao/Seq_Out_T.h \ + $(TAO_ROOT)/tao/Seq_Out_T.inl \ + $(TAO_ROOT)/tao/Seq_Out_T.cpp \ + $(TAO_ROOT)/tao/Policy_ForwardC.i \ + $(TAO_ROOT)/tao/Object_KeyC.h \ + $(TAO_ROOT)/tao/Object_KeyC.i \ + $(TAO_ROOT)/tao/IOP_IORC.h \ + $(TAO_ROOT)/tao/OctetSeqC.h \ + $(TAO_ROOT)/tao/OctetSeqC.i \ + $(TAO_ROOT)/tao/VarOut_T.h \ + $(TAO_ROOT)/tao/VarOut_T.inl \ + $(TAO_ROOT)/tao/VarOut_T.cpp \ + $(TAO_ROOT)/tao/IOP_IORC.i \ + $(TAO_ROOT)/tao/Object.i \ + $(TAO_ROOT)/tao/Any.i \ + $(TAO_ROOT)/tao/Any_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Impl_T.cpp \ + $(TAO_ROOT)/tao/Marshal.h \ + $(TAO_ROOT)/tao/Marshal.i \ + $(TAO_ROOT)/tao/debug.h \ + $(TAO_ROOT)/tao/Any_Basic_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Basic_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Basic_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Special_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Special_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Special_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Special_Basic_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Special_Basic_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Special_Basic_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Array_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Array_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Array_Impl_T.cpp \ + $(TAO_ROOT)/tao/Any_Dual_Impl_T.h \ + $(TAO_ROOT)/tao/Any_Dual_Impl_T.inl \ + $(TAO_ROOT)/tao/Any_Dual_Impl_T.cpp \ + $(TAO_ROOT)/tao/NVList.h \ + $(TAO_ROOT)/tao/NVList.i \ + $(TAO_ROOT)/tao/LocalObject.h \ + $(TAO_ROOT)/tao/LocalObject.i \ + $(TAO_ROOT)/tao/Principal.h \ + $(TAO_ROOT)/tao/Principal.i \ + $(TAO_ROOT)/tao/ORB.h \ + $(TAO_ROOT)/tao/ServicesC.h \ + $(TAO_ROOT)/tao/ServicesC.i \ + $(TAO_ROOT)/tao/CORBA_String.h \ + $(TAO_ROOT)/tao/CORBA_String.inl \ + $(TAO_ROOT)/tao/ObjectIdListC.h \ + $(TAO_ROOT)/tao/ObjectIdListC.i \ + $(TAO_ROOT)/tao/objectid.h \ + $(TAO_ROOT)/tao/PolicyC.h \ + $(TAO_ROOT)/tao/CurrentC.h \ + $(TAO_ROOT)/tao/CurrentC.i \ + $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ + $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ + $(TAO_ROOT)/tao/PolicyC.i \ + $(TAO_ROOT)/tao/ORB.i \ + $(TAO_ROOT)/tao/BoundsC.h \ + $(TAO_ROOT)/tao/BoundsC.i \ + $(TAO_ROOT)/tao/DomainC.h \ + $(TAO_ROOT)/tao/DomainC.i \ + $(TAO_ROOT)/tao/WrongTransactionC.h \ + $(TAO_ROOT)/tao/WrongTransactionC.i \ + $(TAO_ROOT)/tao/Array_VarOut_T.h \ + $(TAO_ROOT)/tao/Array_VarOut_T.inl \ + $(TAO_ROOT)/tao/Array_VarOut_T.cpp \ + $(TAO_ROOT)/tao/StringSeqC.h \ + $(TAO_ROOT)/tao/StringSeqC.i \ + $(TAO_ROOT)/tao/PortableInterceptorC.h \ + $(TAO_ROOT)/tao/PI_ForwardC.h \ + $(TAO_ROOT)/tao/PI_ForwardC.i \ + $(TAO_ROOT)/tao/DynamicC.h \ + $(TAO_ROOT)/tao/DynamicC.i \ + $(TAO_ROOT)/tao/Messaging_SyncScopeC.h \ + $(TAO_ROOT)/tao/Messaging_SyncScopeC.i \ + $(TAO_ROOT)/tao/IOPC.h \ + $(TAO_ROOT)/tao/IOP_CodecC.h \ + $(TAO_ROOT)/tao/IOP_CodecC.i \ + $(TAO_ROOT)/tao/IOPC.i \ + $(TAO_ROOT)/tao/PortableInterceptorC.i \ + testC.i \ + $(TAO_ROOT)/tao/Stub.h \ + $(TAO_ROOT)/tao/MProfile.h \ + $(TAO_ROOT)/tao/MProfile.i \ + $(TAO_ROOT)/tao/ORB_Core.h \ + $(TAO_ROOT)/tao/Policy_Manager.h \ + $(TAO_ROOT)/tao/Policy_Set.h \ + $(TAO_ROOT)/tao/Policy_Set.i \ + $(TAO_ROOT)/tao/Policy_Manager.i \ + $(TAO_ROOT)/tao/Resource_Factory.h \ + $(ACE_ROOT)/ace/Service_Object.h \ + $(ACE_ROOT)/ace/Shared_Object.h \ + $(ACE_ROOT)/ace/Shared_Object.i \ + $(ACE_ROOT)/ace/DLL.h \ + $(ACE_ROOT)/ace/Service_Object.i \ + $(TAO_ROOT)/tao/CONV_FRAMEC.h \ + $(TAO_ROOT)/tao/CONV_FRAMEC.i \ + $(TAO_ROOT)/tao/params.h \ + $(TAO_ROOT)/tao/params.i \ + $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ + $(TAO_ROOT)/tao/TAO_Singleton_Manager.inl \ + $(TAO_ROOT)/tao/TAO_Singleton.h \ + $(TAO_ROOT)/tao/TAO_Singleton.inl \ + $(TAO_ROOT)/tao/TAO_Singleton.cpp \ + $(ACE_ROOT)/ace/Object_Manager.h \ + $(ACE_ROOT)/ace/Object_Manager.i \ + $(ACE_ROOT)/ace/Managed_Object.h \ + $(ACE_ROOT)/ace/Managed_Object.i \ + $(ACE_ROOT)/ace/Managed_Object.cpp \ + $(TAO_ROOT)/tao/Adapter.h \ + $(TAO_ROOT)/tao/Adapter.i \ + $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ + $(ACE_ROOT)/ace/Map_Manager.h \ + $(ACE_ROOT)/ace/Map_Manager.i \ + $(ACE_ROOT)/ace/Map_Manager.cpp \ + $(TAO_ROOT)/tao/Parser_Registry.h \ + $(TAO_ROOT)/tao/Parser_Registry.i \ + $(TAO_ROOT)/tao/Service_Callbacks.h \ + $(TAO_ROOT)/tao/Service_Callbacks.i \ + $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ + $(TAO_ROOT)/tao/Fault_Tolerance_Service.i \ + $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ + $(ACE_ROOT)/ace/Array_Base.h \ + $(ACE_ROOT)/ace/Array_Base.inl \ + $(ACE_ROOT)/ace/Array_Base.cpp \ + $(TAO_ROOT)/tao/Cleanup_Func_Registry.inl \ + $(TAO_ROOT)/tao/Object_Ref_Table.h \ + $(TAO_ROOT)/tao/Interceptor_List.h \ + $(TAO_ROOT)/tao/Interceptor_List.inl \ + $(TAO_ROOT)/tao/PICurrent.h \ + $(TAO_ROOT)/tao/PICurrent.inl \ + $(ACE_ROOT)/ace/Thread_Manager.h \ + $(ACE_ROOT)/ace/Thread_Exit.h \ + $(ACE_ROOT)/ace/Thread_Control.h \ + $(ACE_ROOT)/ace/Thread_Control.inl \ + $(ACE_ROOT)/ace/Containers.h \ + $(ACE_ROOT)/ace/Containers.i \ + $(ACE_ROOT)/ace/Containers_T.h \ + $(ACE_ROOT)/ace/Containers_T.i \ + $(ACE_ROOT)/ace/Containers_T.cpp \ + $(ACE_ROOT)/ace/Singleton.h \ + $(ACE_ROOT)/ace/Singleton.i \ + $(ACE_ROOT)/ace/Singleton.cpp \ + $(ACE_ROOT)/ace/Framework_Component.h \ + $(ACE_ROOT)/ace/Framework_Component.inl \ + $(ACE_ROOT)/ace/Framework_Component_T.h \ + $(ACE_ROOT)/ace/Framework_Component_T.inl \ + $(ACE_ROOT)/ace/Framework_Component_T.cpp \ + $(ACE_ROOT)/ace/Thread_Manager.i \ + $(TAO_ROOT)/tao/ORB_Core.i \ + $(TAO_ROOT)/tao/ORB_Core_Auto_Ptr.h \ + $(TAO_ROOT)/tao/ORB_Core_Auto_Ptr.inl \ + $(TAO_ROOT)/tao/Stub.i \ + $(TAO_ROOT)/tao/Invocation.h \ + $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ + $(TAO_ROOT)/tao/Reply_Dispatcher.h \ + $(TAO_ROOT)/tao/Reply_Dispatcher.i \ + $(TAO_ROOT)/tao/LF_Invocation_Event.h \ + $(TAO_ROOT)/tao/LF_Event.h \ + $(TAO_ROOT)/tao/LF_Event.inl \ + $(TAO_ROOT)/tao/LF_Invocation_Event.inl \ + $(TAO_ROOT)/tao/GIOP_Message_Version.h \ + $(TAO_ROOT)/tao/GIOP_Message_Version.inl \ + $(TAO_ROOT)/tao/operation_details.h \ + $(TAO_ROOT)/tao/Service_Context.h \ + $(TAO_ROOT)/tao/Service_Context.inl \ + $(TAO_ROOT)/tao/target_specification.h \ + $(TAO_ROOT)/tao/target_specification.i \ + $(TAO_ROOT)/tao/operation_details.i \ + $(TAO_ROOT)/tao/Transport.h \ + $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ + $(TAO_ROOT)/tao/Transport_Descriptor_Interface.inl \ + $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ + $(TAO_ROOT)/tao/Cache_Entries.h \ + $(ACE_ROOT)/ace/Recyclable.h \ + $(ACE_ROOT)/ace/Recyclable.inl \ + $(TAO_ROOT)/tao/Cache_Entries.inl \ + $(TAO_ROOT)/tao/Transport_Cache_Manager.inl \ + $(TAO_ROOT)/tao/Transport_Timer.h \ + $(TAO_ROOT)/tao/Incoming_Message_Queue.h \ + $(TAO_ROOT)/tao/Pluggable_Messaging_Utils.h \ + $(TAO_ROOT)/tao/Pluggable_Messaging_Utils.i \ + $(TAO_ROOT)/tao/Incoming_Message_Queue.inl \ + $(TAO_ROOT)/tao/Synch_Refcountable.h \ + $(ACE_ROOT)/ace/Refcountable.h \ + $(ACE_ROOT)/ace/Refcountable.inl \ + $(TAO_ROOT)/tao/Synch_Refcountable.inl \ + $(TAO_ROOT)/tao/Transport.inl \ + $(TAO_ROOT)/tao/Invocation.i \ + $(TAO_ROOT)/tao/PortableInterceptor.h \ + $(TAO_ROOT)/tao/RequestInfo_Util.h \ + $(TAO_ROOT)/tao/ClientRequestInfo_i.h \ + $(TAO_ROOT)/tao/ClientRequestInfo_i.inl \ + $(TAO_ROOT)/tao/ClientInterceptorAdapter.h \ + $(TAO_ROOT)/tao/ClientInterceptorAdapter.inl + +# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/TAO/tests/Connection_Failure/Makefile.bor b/TAO/tests/Connection_Failure/Makefile.bor new file mode 100644 index 00000000000..e321e32567a --- /dev/null +++ b/TAO/tests/Connection_Failure/Makefile.bor @@ -0,0 +1,7 @@ +# +# $Id$ +# + +MAKEFILES = client.bor + +!include <$(ACE_ROOT)\include\makeinclude\recurse.bor> diff --git a/TAO/tests/Connection_Failure/README b/TAO/tests/Connection_Failure/README new file mode 100644 index 00000000000..7ae5b95d45d --- /dev/null +++ b/TAO/tests/Connection_Failure/README @@ -0,0 +1,8 @@ +/** + +@page Connection_Failure Test README File + +A simple test for connection failures. The client tries to connect to +an non-existent server. + +*/ diff --git a/TAO/tests/Connection_Failure/client.bor b/TAO/tests/Connection_Failure/client.bor new file mode 100644 index 00000000000..04225c59cea --- /dev/null +++ b/TAO/tests/Connection_Failure/client.bor @@ -0,0 +1,35 @@ +# +# $Id$ +# + +NAME = client + +TAO_IDL = $(CORE_BINDIR)\tao_idl -g $(CORE_BINDIR)\gperf.exe -Ge 1 + +OBJFILES = \ + $(OBJDIR)\testC.obj \ + $(OBJDIR)\client.obj + +CFLAGS = \ + $(ACE_CFLAGS) \ + $(TAO_CFLAGS) + +LIBFILES = \ + $(ACE_LIB) \ + $(TAO_LIB) + +IDLFILES = \ + $(IDLDIR)\test.idl + +CPPDIR = . + +IDLDIR = . + +!include <$(ACE_ROOT)\include\makeinclude\build_exe.bor> + +# +# IDL Build rules +# + +$(IDLDIR)\testS.cpp $(IDLDIR)\testC.cpp: $(IDLDIR)\test.idl + $(TAO_IDL) $** diff --git a/TAO/tests/Connection_Failure/client.cpp b/TAO/tests/Connection_Failure/client.cpp new file mode 100644 index 00000000000..1ed7cbc25bc --- /dev/null +++ b/TAO/tests/Connection_Failure/client.cpp @@ -0,0 +1,45 @@ +// $Id$ + +#include "testC.h" + +ACE_RCSID(Connection_Failure, client, "$Id$") + +const char *ior = + "corbaloc:iiop:192.3.47/10007/RandomObject"; + +int +main (int argc, char *argv[]) +{ + ACE_TRY_NEW_ENV + { + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, "" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CORBA::Object_var tmp = + orb->string_to_object (ior ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // First connection happens here.. + test::_narrow (tmp.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Should not reach here. + ACE_ERROR_RETURN ((LM_ERROR, + "_narrow() succeeded to non-existent object when it should not have...\n"), + -1); + } + ACE_CATCH (CORBA::TRANSIENT, transient_exception) + { + // This exception is correct. + ACE_DEBUG ((LM_DEBUG, + "_narrow() to non-existent object failed correctly. Test succeeded.\n")); + return 0; + } + ACE_ENDTRY; + + // Should not reach here. + ACE_ERROR_RETURN ((LM_ERROR, + "This test should not reach this code...\n"), + -1); +} diff --git a/TAO/tests/Connection_Failure/client.dsp b/TAO/tests/Connection_Failure/client.dsp new file mode 100644 index 00000000000..9de61d97c8d --- /dev/null +++ b/TAO/tests/Connection_Failure/client.dsp @@ -0,0 +1,202 @@ +# Microsoft Developer Studio Project File - Name="Connection_Failure Client" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Connection_Failure Client - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "client.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "client.mak" CFG="Connection_Failure Client - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Connection_Failure Client - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Connection_Failure Client - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Connection_Failure Client - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../../" /I "../../" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 tao.lib ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" + +!ELSEIF "$(CFG)" == "Connection_Failure Client - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "../../../" /I "../../" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 taod.lib aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao" +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "Connection_Failure Client - Win32 Release" +# Name "Connection_Failure Client - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter ".cpp" +# Begin Source File + +SOURCE=.\client.cpp +# End Source File +# Begin Source File + +SOURCE=.\testC.cpp +# ADD CPP /GR +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "" +# End Group +# Begin Group "IDL Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\test.idl + +!IF "$(CFG)" == "Connection_Failure Client - Win32 Release" + +# PROP Ignore_Default_Tool 1 +USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" +# Begin Custom Build - Invoking TAO_IDL Compiler +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\Release\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "Connection_Failure Client - Win32 Debug" + +USERDEP__TEST_="..\..\..\bin\tao_idl.exe" +# Begin Custom Build - Invoking TAO_IDL Compiler +InputPath=.\test.idl +InputName=test + +BuildCmds= \ + ..\..\..\bin\tao_idl -Ge 1 $(InputName).idl + +"$(InputName)C.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)C.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.i" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"$(InputName)S_T.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# Begin Group "Inline Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\testC.i +# End Source File +# End Group +# End Target +# End Project diff --git a/TAO/tests/Connection_Failure/run_test.pl b/TAO/tests/Connection_Failure/run_test.pl new file mode 100755 index 00000000000..16469fa132a --- /dev/null +++ b/TAO/tests/Connection_Failure/run_test.pl @@ -0,0 +1,22 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- + +use lib '../../../bin'; +use PerlACE::Run_Test; + +$status = 0; + +$CL = new PerlACE::Process ("client", ""); + +$client = $CL->SpawnWaitKill (60); + +if ($client != 0) { + print STDERR "ERROR: client returned $client\n"; + $status = 1; +} + +exit $status; diff --git a/TAO/tests/Connection_Failure/test.idl b/TAO/tests/Connection_Failure/test.idl new file mode 100644 index 00000000000..0e52e7f2a6a --- /dev/null +++ b/TAO/tests/Connection_Failure/test.idl @@ -0,0 +1,7 @@ +// +// $Id$ +// + +interface test +{ +}; diff --git a/TAO/tests/Connection_Timeout/client.cpp b/TAO/tests/Connection_Timeout/client.cpp index 323caa40871..345ca8f5a38 100644 --- a/TAO/tests/Connection_Timeout/client.cpp +++ b/TAO/tests/Connection_Timeout/client.cpp @@ -64,8 +64,6 @@ main (int argc, char *argv[]) CORBA::PolicyCurrent::_narrow (object.in () ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; - - CORBA::Any timeout_as_any; timeout_as_any <<= timeout_period; @@ -77,7 +75,6 @@ main (int argc, char *argv[]) ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; - policy_current->set_policy_overrides (policy_list, CORBA::ADD_OVERRIDE ACE_ENV_ARG_PARAMETER); diff --git a/TAO/tests/Connection_Timeout/client.dsp b/TAO/tests/Connection_Timeout/client.dsp index ce4579b8d37..9c6ca00d197 100644 --- a/TAO/tests/Connection_Timeout/client.dsp +++ b/TAO/tests/Connection_Timeout/client.dsp @@ -1,10 +1,10 @@ -# Microsoft Developer Studio Project File - Name="Hello Client" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="Connection_Timeout Client" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=Hello Client - Win32 Debug +CFG=Connection_Timeout Client - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,12 +13,12 @@ CFG=Hello Client - Win32 Debug !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "client.mak" CFG="Hello Client - Win32 Debug" +!MESSAGE NMAKE /f "client.mak" CFG="Connection_Timeout Client - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "Hello Client - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "Hello Client - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "Connection_Timeout Client - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Connection_Timeout Client - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -28,7 +28,7 @@ CFG=Hello Client - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "Hello Client - Win32 Release" +!IF "$(CFG)" == "Connection_Timeout Client - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -53,7 +53,7 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 TAO_Messaging.lib tao.lib ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\tao\Messaging" /libpath:"..\..\..\ace" /libpath:"..\..\tao" -!ELSEIF "$(CFG)" == "Hello Client - Win32 Debug" +!ELSEIF "$(CFG)" == "Connection_Timeout Client - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -83,8 +83,8 @@ LINK32=link.exe # Begin Target -# Name "Hello Client - Win32 Release" -# Name "Hello Client - Win32 Debug" +# Name "Connection_Timeout Client - Win32 Release" +# Name "Connection_Timeout Client - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter ".cpp" @@ -109,7 +109,7 @@ SOURCE=.\TestC.cpp SOURCE=.\Test.idl -!IF "$(CFG)" == "Hello Client - Win32 Release" +!IF "$(CFG)" == "Connection_Timeout Client - Win32 Release" # PROP Ignore_Default_Tool 1 USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" @@ -148,7 +148,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "Hello Client - Win32 Debug" +!ELSEIF "$(CFG)" == "Connection_Timeout Client - Win32 Debug" USERDEP__TEST_="..\..\..\bin\tao_idl.exe" # Begin Custom Build - Invoking TAO_IDL Compiler diff --git a/TAO/tests/MProfile_Connection_Timeout/client.dsp b/TAO/tests/MProfile_Connection_Timeout/client.dsp index 51b6dc3ecea..e51e2b93b70 100644 --- a/TAO/tests/MProfile_Connection_Timeout/client.dsp +++ b/TAO/tests/MProfile_Connection_Timeout/client.dsp @@ -1,10 +1,10 @@ -# Microsoft Developer Studio Project File - Name="MProfile Client" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="MProfile_Connection_Timeout Client" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=MProfile Client - Win32 Debug +CFG=MProfile_Connection_Timeout Client - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,12 +13,12 @@ CFG=MProfile Client - Win32 Debug !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "client.mak" CFG="MProfile Client - Win32 Debug" +!MESSAGE NMAKE /f "client.mak" CFG="MProfile_Connection_Timeout Client - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "MProfile Client - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "MProfile Client - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "MProfile_Connection_Timeout Client - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "MProfile_Connection_Timeout Client - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -28,7 +28,7 @@ CFG=MProfile Client - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "MProfile Client - Win32 Release" +!IF "$(CFG)" == "MProfile_Connection_Timeout Client - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -54,7 +54,7 @@ LINK32=link.exe # ADD LINK32 ace.lib TAO.lib TAO_IORManip.lib TAO_Messaging.lib /nologo /subsystem:console /debug /machine:I386 /out:"Release/client.exe" /pdbtype:sept /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\IORManipulation" /libpath:"..\..\tao\Messaging" # SUBTRACT LINK32 /pdb:none -!ELSEIF "$(CFG)" == "MProfile Client - Win32 Debug" +!ELSEIF "$(CFG)" == "MProfile_Connection_Timeout Client - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -84,8 +84,8 @@ LINK32=link.exe # Begin Target -# Name "MProfile Client - Win32 Release" -# Name "MProfile Client - Win32 Debug" +# Name "MProfile_Connection_Timeout Client - Win32 Release" +# Name "MProfile_Connection_Timeout Client - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" @@ -114,7 +114,7 @@ SOURCE=.\testC.h SOURCE=.\test.idl -!IF "$(CFG)" == "MProfile Client - Win32 Release" +!IF "$(CFG)" == "MProfile_Connection_Timeout Client - Win32 Release" USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" # Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) @@ -152,7 +152,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "MProfile Client - Win32 Debug" +!ELSEIF "$(CFG)" == "MProfile_Connection_Timeout Client - Win32 Debug" USERDEP__TEST_="..\..\..\bin\tao_idl.exe" # Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) diff --git a/TAO/tests/MProfile_Connection_Timeout/server.dsp b/TAO/tests/MProfile_Connection_Timeout/server.dsp index 92b0a57aee8..67a59ed66ca 100644 --- a/TAO/tests/MProfile_Connection_Timeout/server.dsp +++ b/TAO/tests/MProfile_Connection_Timeout/server.dsp @@ -1,10 +1,10 @@ -# Microsoft Developer Studio Project File - Name="MProfile Server" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="MProfile_Connection_Timeout Server" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=MProfile Server - Win32 Debug +CFG=MProfile_Connection_Timeout Server - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,12 +13,12 @@ CFG=MProfile Server - Win32 Debug !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "server.mak" CFG="MProfile Server - Win32 Debug" +!MESSAGE NMAKE /f "server.mak" CFG="MProfile_Connection_Timeout Server - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "MProfile Server - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "MProfile Server - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "MProfile_Connection_Timeout Server - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "MProfile_Connection_Timeout Server - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -28,7 +28,7 @@ CFG=MProfile Server - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "MProfile Server - Win32 Release" +!IF "$(CFG)" == "MProfile_Connection_Timeout Server - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -53,7 +53,7 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ace.lib TAO.lib TAO_PortableServer.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\lib" /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\IORManipulation" -!ELSEIF "$(CFG)" == "MProfile Server - Win32 Debug" +!ELSEIF "$(CFG)" == "MProfile_Connection_Timeout Server - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -82,8 +82,8 @@ LINK32=link.exe # Begin Target -# Name "MProfile Server - Win32 Release" -# Name "MProfile Server - Win32 Debug" +# Name "MProfile_Connection_Timeout Server - Win32 Release" +# Name "MProfile_Connection_Timeout Server - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" @@ -124,7 +124,7 @@ SOURCE=.\testS.h SOURCE=.\test.idl -!IF "$(CFG)" == "MProfile Server - Win32 Release" +!IF "$(CFG)" == "MProfile_Connection_Timeout Server - Win32 Release" USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" # Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) @@ -162,7 +162,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "MProfile Server - Win32 Debug" +!ELSEIF "$(CFG)" == "MProfile_Connection_Timeout Server - Win32 Debug" USERDEP__TEST_="..\..\..\bin\tao_idl.exe" # Begin Custom Build - Invoking TAO's IDL Compiler on $(InputPath) diff --git a/TAO/tests/MT_BiDir/client.dsp b/TAO/tests/MT_BiDir/client.dsp index d84c65a123b..377d0949356 100644 --- a/TAO/tests/MT_BiDir/client.dsp +++ b/TAO/tests/MT_BiDir/client.dsp @@ -1,10 +1,10 @@ -# Microsoft Developer Studio Project File - Name="BiDir Client" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="MT_BiDir Client" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=BiDir Client - Win32 Debug +CFG=MT_BiDir Client - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,12 +13,12 @@ CFG=BiDir Client - Win32 Debug !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "client.mak" CFG="BiDir Client - Win32 Debug" +!MESSAGE NMAKE /f "client.mak" CFG="MT_BiDir Client - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "BiDir Client - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "BiDir Client - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "MT_BiDir Client - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "MT_BiDir Client - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -28,7 +28,7 @@ CFG=BiDir Client - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "BiDir Client - Win32 Release" +!IF "$(CFG)" == "MT_BiDir Client - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -54,7 +54,7 @@ LINK32=link.exe # ADD LINK32 ace.lib tao.lib TAO_PortableServer.lib TAO_BiDirGIOP.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\BiDir_GIOP" # SUBTRACT LINK32 /pdb:none -!ELSEIF "$(CFG)" == "BiDir Client - Win32 Debug" +!ELSEIF "$(CFG)" == "MT_BiDir Client - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -84,8 +84,8 @@ LINK32=link.exe # Begin Target -# Name "BiDir Client - Win32 Release" -# Name "BiDir Client - Win32 Debug" +# Name "MT_BiDir Client - Win32 Release" +# Name "MT_BiDir Client - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" @@ -151,7 +151,7 @@ SOURCE=.\SenderC.h SOURCE=.\Receiver.idl -!IF "$(CFG)" == "BiDir Client - Win32 Release" +!IF "$(CFG)" == "MT_BiDir Client - Win32 Release" # Begin Custom Build InputPath=.\Receiver.idl @@ -188,7 +188,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "BiDir Client - Win32 Debug" +!ELSEIF "$(CFG)" == "MT_BiDir Client - Win32 Debug" # Begin Custom Build - Invoking TAO_IDL Compiler InputPath=.\Receiver.idl @@ -232,7 +232,7 @@ BuildCmds= \ SOURCE=.\Sender.idl -!IF "$(CFG)" == "BiDir Client - Win32 Release" +!IF "$(CFG)" == "MT_BiDir Client - Win32 Release" # Begin Custom Build InputPath=.\Sender.idl @@ -269,7 +269,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "BiDir Client - Win32 Debug" +!ELSEIF "$(CFG)" == "MT_BiDir Client - Win32 Debug" # Begin Custom Build - Invoking TAO_IDL Compiler InputPath=.\Sender.idl diff --git a/TAO/tests/MT_BiDir/server.dsp b/TAO/tests/MT_BiDir/server.dsp index 72938a046d0..bda4accfffc 100644 --- a/TAO/tests/MT_BiDir/server.dsp +++ b/TAO/tests/MT_BiDir/server.dsp @@ -1,10 +1,10 @@ -# Microsoft Developer Studio Project File - Name="BiDir Server" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="MT_BiDir Server" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=BiDir Server - Win32 Debug +CFG=MT_BiDir Server - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,12 +13,12 @@ CFG=BiDir Server - Win32 Debug !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "server.mak" CFG="BiDir Server - Win32 Debug" +!MESSAGE NMAKE /f "server.mak" CFG="MT_BiDir Server - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "BiDir Server - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "BiDir Server - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "MT_BiDir Server - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "MT_BiDir Server - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -28,7 +28,7 @@ CFG=BiDir Server - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "BiDir Server - Win32 Release" +!IF "$(CFG)" == "MT_BiDir Server - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -54,7 +54,7 @@ LINK32=link.exe # ADD LINK32 ace.lib tao.lib TAO_PortableServer.lib TAO_BiDirGIOP.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" /libpath:"..\..\tao\BiDir_GIOP" # SUBTRACT LINK32 /pdb:none -!ELSEIF "$(CFG)" == "BiDir Server - Win32 Debug" +!ELSEIF "$(CFG)" == "MT_BiDir Server - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -84,8 +84,8 @@ LINK32=link.exe # Begin Target -# Name "BiDir Server - Win32 Release" -# Name "BiDir Server - Win32 Debug" +# Name "MT_BiDir Server - Win32 Release" +# Name "MT_BiDir Server - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" @@ -151,7 +151,7 @@ SOURCE=.\Server_Task.h SOURCE=.\Receiver.idl -!IF "$(CFG)" == "BiDir Server - Win32 Release" +!IF "$(CFG)" == "MT_BiDir Server - Win32 Release" # Begin Custom Build InputPath=.\Receiver.idl @@ -188,7 +188,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "BiDir Server - Win32 Debug" +!ELSEIF "$(CFG)" == "MT_BiDir Server - Win32 Debug" # Begin Custom Build InputPath=.\Receiver.idl @@ -232,7 +232,7 @@ BuildCmds= \ SOURCE=.\Sender.idl -!IF "$(CFG)" == "BiDir Server - Win32 Release" +!IF "$(CFG)" == "MT_BiDir Server - Win32 Release" # Begin Custom Build InputPath=.\Sender.idl @@ -269,7 +269,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "BiDir Server - Win32 Debug" +!ELSEIF "$(CFG)" == "MT_BiDir Server - Win32 Debug" # Begin Custom Build InputPath=.\Sender.idl diff --git a/TAO/tests/Makefile b/TAO/tests/Makefile index f7101331388..0b85e9e6487 100644 --- a/TAO/tests/Makefile +++ b/TAO/tests/Makefile @@ -24,6 +24,7 @@ DIRS = CDR \ Collocation_Tests \ CodeSets \ Collocation \ + Connection_Failure \ Connection_Timeout \ IDL_Test \ OctetSeq \ diff --git a/TAO/tests/Makefile.bor b/TAO/tests/Makefile.bor index 2be206f2269..6fafb10574e 100644 --- a/TAO/tests/Makefile.bor +++ b/TAO/tests/Makefile.bor @@ -29,6 +29,7 @@ DIRS = \ Collocation_Tests \ Connect_Strategy_Test \ Connection_Purging \ + Connection_Failure \ Connection_Timeout \ Crash_On_Write \ Cache_Growth_Test \ diff --git a/TAO/tests/ORB_shutdown/server.dsp b/TAO/tests/ORB_shutdown/server.dsp index 1b8448b5ce0..5eeab6b5a1f 100644 --- a/TAO/tests/ORB_shutdown/server.dsp +++ b/TAO/tests/ORB_shutdown/server.dsp @@ -1,10 +1,10 @@ -# Microsoft Developer Studio Project File - Name="Foo_Bar Server" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="ORB_shutdown Server" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 -CFG=Foo_Bar Server - Win32 Debug +CFG=ORB_shutdown Server - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE @@ -13,12 +13,12 @@ CFG=Foo_Bar Server - Win32 Debug !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "server.mak" CFG="Foo_Bar Server - Win32 Debug" +!MESSAGE NMAKE /f "server.mak" CFG="ORB_shutdown Server - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "Foo_Bar Server - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "Foo_Bar Server - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "ORB_shutdown Server - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "ORB_shutdown Server - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project @@ -28,7 +28,7 @@ CFG=Foo_Bar Server - Win32 Debug CPP=cl.exe RSC=rc.exe -!IF "$(CFG)" == "Foo_Bar Server - Win32 Release" +!IF "$(CFG)" == "ORB_shutdown Server - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -53,7 +53,7 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ace.lib TAO.lib TAO_PortableServer.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\ace" /libpath:"..\..\tao" /libpath:"..\..\tao\PortableServer" -!ELSEIF "$(CFG)" == "Foo_Bar Server - Win32 Debug" +!ELSEIF "$(CFG)" == "ORB_shutdown Server - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -82,8 +82,8 @@ LINK32=link.exe # Begin Target -# Name "Foo_Bar Server - Win32 Release" -# Name "Foo_Bar Server - Win32 Debug" +# Name "ORB_shutdown Server - Win32 Release" +# Name "ORB_shutdown Server - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter ".cpp" @@ -120,7 +120,7 @@ SOURCE=.\Foo_Bar.h SOURCE=.\Test.idl -!IF "$(CFG)" == "Foo_Bar Server - Win32 Release" +!IF "$(CFG)" == "ORB_shutdown Server - Win32 Release" # PROP Ignore_Default_Tool 1 USERDEP__TEST_="..\..\..\bin\Release\tao_idl.exe" @@ -159,7 +159,7 @@ BuildCmds= \ $(BuildCmds) # End Custom Build -!ELSEIF "$(CFG)" == "Foo_Bar Server - Win32 Debug" +!ELSEIF "$(CFG)" == "ORB_shutdown Server - Win32 Debug" USERDEP__TEST_="..\..\..\bin\tao_idl.exe" # Begin Custom Build - Invoking TAO_IDL Compiler diff --git a/TAO/tests/README b/TAO/tests/README index f537674c084..8e48823cca7 100644 --- a/TAO/tests/README +++ b/TAO/tests/README @@ -77,6 +77,11 @@ how to run the following tests: and checks whether cached handlers are purged effectively when the process runs out of descriptors. + . Connection_Failure + + A simple test for connection failures. The client tries to + connect to an non-existent server. + . Crashed_Callback A regression test for callbacks, sent as a reliable oneway, diff --git a/TAO/tests/TAO_Tests.dsw b/TAO/tests/TAO_Tests.dsw index e728d7697fd..04060998a1a 100644 --- a/TAO/tests/TAO_Tests.dsw +++ b/TAO/tests/TAO_Tests.dsw @@ -1,1751 +1,2255 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "AMI Timeout Client"=.\AMI_Timeouts\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "AMI Timeout Server"=.\AMI_Timeouts\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "AMI_Buffering Admin"=.\AMI_Buffering\admin.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "AMI_Buffering Client"=.\AMI_Buffering\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "AMI_Buffering Server"=.\AMI_Buffering\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "AMI_Test_Client"=.\AMI\AMI_Test_Client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "AMI_Test_Server"=.\AMI\AMI_Test_Server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "AMI_Test_Simple_Client"=.\AMI\AMI_Test_Simple_Client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "BiDir Client"=.\BiDirectional\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "BiDir Server"=.\BiDirectional\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "BiDirectional_NestedUpcall Client"=.\BiDirectional_NestedUpcall\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "BiDirectional_NestedUpcall Server"=.\BiDirectional_NestedUpcall\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Oneways Client"=.\Big_Oneways\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Oneways Server"=.\Big_Oneways\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Reply Client"=.\Big_Reply\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Reply Server"=.\Big_Reply\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Request_Muxing Client"=.\Big_Request_Muxing\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Request_Muxing Server"=.\Big_Request_Muxing\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Twoways Client"=.\Big_Twoways\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Big_Twoways Server"=.\Big_Twoways\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Blocking_Sync_None Client"=.\Blocking_Sync_None\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Blocking_Sync_None Server"=.\Blocking_Sync_None\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Bug 1020 Basic Regression Client"=.\Bug_1020_Basic_Regression\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Bug 1020 Basic Regression Server"=.\Bug_1020_Basic_Regression\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Bug 1020 Regression Client"=.\Bug_1020_Regression\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Bug 1020 Regression Server"=.\Bug_1020_Regression\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "CDR Basic Types"=.\CDR\basic_types.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "CDR Growth"=.\CDR\growth.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "CDR TC"=.\CDR\tc.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Cache Grow Client"=.\Cache_Growth_Test\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Cache Grow Server"=.\Cache_Growth_Test\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Client_Leaks Child"=.\Client_Leaks\child.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Client_Leaks Client"=.\Client_Leaks\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Client_Leaks Server"=.\Client_Leaks\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Codec Client"=.\Codec\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Codeset Simple client"=.\CodeSets\simple\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name IBM1047_ISO8859 - End Project Dependency -}}} - -############################################################################### - -Project: "Codeset Simple server"=.\CodeSets\simple\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name IBM1047_ISO8859 - End Project Dependency -}}} - -############################################################################### - -Project: "Collocation"=.\Collocation\Collocation.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name Collocation Diamond DLL - End Project Dependency -}}} - -############################################################################### - -Project: "Collocation Diamond DLL"=.\Collocation\Diamond.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name Collocation Test Stubs DLL - End Project Dependency -}}} - -############################################################################### - -Project: "Collocation Test Stubs DLL"=.\Collocation\Collocation_Test_Stubs.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Connection Purging Client"=.\Connection_Purging\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Connection Purging Server"=.\Connection_Purging\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Crash_On_Write Client"=.\Crash_On_Write\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Crash_On_Write Server"=.\Crash_On_Write\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Crashed_Callback Server"=.\Crashed_Callback\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Crashed_Callbacks Client"=.\Crashed_Callback\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "DLL_ORB Test_Client_Module"=.\DLL_ORB\Test_Client_Module.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "DLL_ORB Test_Server_Module"=.\DLL_ORB\Test_Server_Module.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "DLL_ORB client"=.\DLL_ORB\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name Test_Client_Module - End Project Dependency -}}} - -############################################################################### - -Project: "DLL_ORB server"=.\DLL_ORB\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name Test_Server_Module - End Project Dependency -}}} - -############################################################################### - -Project: "DSI_Gateway_Client"=.\DSI_Gateway\DSI_Gateway_Client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "DSI_Gateway_Server"=.\DSI_Gateway\DSI_Gateway_Server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "DSI_Gateway_Service"=.\DSI_Gateway\DSI_Gateway_Service.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "DynAny Basics"=.\DynAny_Test\basic_test.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Explicit_Event_Loop Client"=.\Explicit_Event_Loop\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Explicit_Event_Loop Server"=.\Explicit_Event_Loop\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Exposed_Policies Client"=.\Exposed_Policies\Client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Exposed_Policies Server"=.\Exposed_Policies\Server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Faults Client"=.\Faults\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Faults Middle Server"=.\Faults\middle.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Faults Ping"=.\Faults\ping.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Faults Pong"=.\Faults\pong.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Faults Server"=.\Faults\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Forwarding Client"=.\Forwarding\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Forwarding Server"=.\Forwarding\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Hello Client"=.\Hello\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Hello Server"=.\Hello\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "IBM1047_ISO8859"=.\CodeSets\libs\IBM1047_ISO8859\IBM1047_ISO8859.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "IORTest"=.\IORManipulation\IORTest.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "InterOp Naming Server"=".\InterOp-Naming\server.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Leader_Followers Client"=.\Leader_Followers\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Leader_Followers Server"=.\Leader_Followers\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "LongUpcalls AMI_Client"=.\LongUpcalls\ami_client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "LongUpcalls AMI_Server"=.\LongUpcalls\ami_server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "LongUpcalls Blocking_Client"=.\LongUpcalls\blocking_client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "LongUpcalls Blocking_Server"=.\LongUpcalls\blocking_server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MProfile Client"=.\MProfile\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MProfile Server"=.\MProfile\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MT Timeout Client"=.\MT_Timeout\MT_Timeout_Client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MT Timeout Server"=.\MT_Timeout\MT_Timeout_Server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MT_Client Client"=.\MT_Client\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MT_Client ORB Creation"=.\MT_Client\orb_creation.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MT_Client Server"=.\MT_Client\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MT_Server Client"=.\MT_Server\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "MT_Server Server"=.\MT_Server\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Multiple Client"=.\Multiple\Client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Multiple Inheritance Client"=.\Multiple_Inheritance\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Multiple Inheritance Server"=.\Multiple_Inheritance\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Multiple Server"=.\Multiple\Server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Muxing Client"=.\Muxing\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Muxing Server"=.\Muxing\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Native Exceptions Client"=.\Native_Exceptions\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Native Exceptions Server"=.\Native_Exceptions\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested Upcall MT_Client Client"=.\NestedUpcall\MT_Client_Test\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested Upcall MT_Client Server"=.\NestedUpcall\MT_Client_Test\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested Upcall Simple Client"=.\NestedUpcall\Simple\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested Upcall Simple Server"=.\NestedUpcall\Simple\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested Upcall Triangle Initiator"=.\NestedUpcall\Triangle_Test\initiator.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested Upcall Triangle Server_A"=.\NestedUpcall\Triangle_Test\server_A.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested Upcall Triangle Server_B"=.\NestedUpcall\Triangle_Test\server_B.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested_Event_Loop Client"=.\Nested_Event_Loop\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Nested_Event_Loop Server"=.\Nested_Event_Loop\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "ORB_destroy"=.\ORB_destroy\ORB_destroy.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "ORB_init"=.\ORB_init\ORB_init.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "ORT Server"=.\ORT\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "ORT client"=.\ORT\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Object_Loader Driver"=.\Object_Loader\driver.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "OctetSeq"=.\OctetSeq\OctetSeq.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "OctetSeq Client"=.\OctetSeq\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "OctetSeq Server"=.\OctetSeq\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Oneways_Invoking_Twoways Client"=.\Oneways_Invoking_Twoways\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Oneways_Invoking_Twoways Server"=.\Oneways_Invoking_Twoways\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Current"=.\POA\Current\Current.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Default_Servant"=.\POA\Default_Servant\Default_Servant.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Etherealization"=.\POA\Etherealization\Etherealization.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Excessive_Object_Deactivations"=.\POA\Excessive_Object_Deactivations\Excessive_Object_Deactivations.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Identity"=.\POA\Identity\Identity.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA MT_Servant_Locator"=.\POA\MT_Servant_Locator\MT_Servant_Locator.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Nested_Non_Servant_Upcalls"=.\POA\Nested_Non_Servant_Upcalls\Nested_Non_Servant_Upcalls.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Non_Servant_Upcalls"=.\POA\Non_Servant_Upcalls\Non_Servant_Upcalls.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Object_Reactivation"=.\POA\Object_Reactivation\Object_Reactivation.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA POA_Destruction"=.\POA\POA_Destruction\POA_Destruction.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Persistent ID Client"=.\POA\Persistent_ID\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Persistent ID Server"=.\POA\Persistent_ID\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Policies"=.\POA\Policies\Policies.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA Single_Threaded_POA"=.\POA\Single_Threaded_POA\Single_Threaded_POA.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "POA wait_for_completion"=.\POA\wait_for_completion\wait_for_completion.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Param_Test Client"=.\Param_Test\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Param_Test Server"=.\Param_Test\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Queued_Message_Test"=.\Queued_Message_Test\Queued_Message_Test.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Reliable_Oneways Client"=.\Reliable_Oneways\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Reliable_Oneways Server"=.\Reliable_Oneways\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Server_Leaks Client"=.\Server_Leaks\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Server_Leaks Server"=.\Server_Leaks\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Single_Read Client"=.\Single_Read\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Single_Read Server"=.\Single_Read\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Test_DLL"=.\Object_Loader\Test_DLL.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Timed_Buffered_Oneways Client"=.\Timed_Buffered_Oneways\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Timed_Buffered_Oneways Server"=.\Timed_Buffered_Oneways\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Timeout Client"=.\Timeout\client.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "Timeout Server"=.\Timeout\server.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "idl_test"=.\IDL_Test\idl_test.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "portspan"=.\ORB_init\Portspan\portspan.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "AMH_Exceptions_Test Client"=.\AMH_Exceptions\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMH_Exceptions_Test Server"=.\AMH_Exceptions\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMH_Oneway_Test Client"=.\AMH_Oneway\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMH_Oneway_Test Server"=.\AMH_Oneway\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI Timeout Client"=.\AMI_Timeouts\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI Timeout Server"=.\AMI_Timeouts\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI_Buffering Admin"=.\AMI_Buffering\admin.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI_Buffering Client"=.\AMI_Buffering\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI_Buffering Server"=.\AMI_Buffering\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI_Test_Client"=.\AMI\AMI_Test_Client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI_Test_Server"=.\AMI\AMI_Test_Server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "AMI_Test_Simple_Client"=.\AMI\AMI_Test_Simple_Client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Abstract Interface Client"=.\Abstract_Interface\Abstract_Interface_Client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Abstract Interface Server"=.\Abstract_Interface\Abstract_Interface_Server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "BiDir Client"=.\BiDirectional\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "BiDir Server"=.\BiDirectional\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "BiDirectional_NestedUpcall Client"=.\BiDirectional_NestedUpcall\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "BiDirectional_NestedUpcall Server"=.\BiDirectional_NestedUpcall\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Oneways Client"=.\Big_Oneways\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Oneways Server"=.\Big_Oneways\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Reply Client"=.\Big_Reply\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Reply Server"=.\Big_Reply\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Request_Muxing Client"=.\Big_Request_Muxing\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Request_Muxing Server"=.\Big_Request_Muxing\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Twoways Client"=.\Big_Twoways\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Big_Twoways Server"=.\Big_Twoways\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Blocking_Sync_None Client"=.\Blocking_Sync_None\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Blocking_Sync_None Server"=.\Blocking_Sync_None\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1020_Basic_Regression Client"=.\Bug_1020_Basic_Regression\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1020_Basic_Regression Server"=.\Bug_1020_Basic_Regression\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1020_Regression Client"=.\Bug_1020_Regression\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1020_Regression Server"=.\Bug_1020_Regression\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1361_Regression Client"=.\Bug_1361_Regression\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1361_Regression Server"=.\Bug_1361_Regression\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1361_Regression Shutdown"=.\Bug_1361_Regression\shutdown.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1482_Regression Client"=.\Bug_1482_Regression\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Bug_1482_Regression Server"=.\Bug_1482_Regression\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "CDR Basic Types"=.\CDR\basic_types.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "CDR Growth"=.\CDR\growth.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "CDR TC"=.\CDR\tc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Cache Grow Client"=.\Cache_Growth_Test\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Cache Grow Server"=.\Cache_Growth_Test\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Client_Leaks Child"=.\Client_Leaks\child.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Client_Leaks Client"=.\Client_Leaks\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Client_Leaks Server"=.\Client_Leaks\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Codec Client"=.\Codec\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Codeset Simple client"=.\CodeSets\simple\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name IBM1047_ISO8859 + End Project Dependency +}}} + +############################################################################### + +Project: "Codeset Simple server"=.\CodeSets\simple\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name IBM1047_ISO8859 + End Project Dependency +}}} + +############################################################################### + +Project: "Collocation"=.\Collocation\Collocation.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Collocation Diamond DLL + End Project Dependency +}}} + +############################################################################### + +Project: "Collocation Diamond DLL"=.\Collocation\Diamond.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Collocation Test Stubs DLL + End Project Dependency +}}} + +############################################################################### + +Project: "Collocation Test Stubs DLL"=.\Collocation\Collocation_Test_Stubs.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Collocation_Test"=.\Collocation_Tests\Collocation_Test.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Connect_Strategy_Test Client"=.\Connect_Strategy_Test\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Connect_Strategy_Test Server"=.\Connect_Strategy_Test\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Connection Purging Client"=.\Connection_Purging\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Connection Purging Server"=.\Connection_Purging\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Connection_Failure Client"=.\Connection_Failure\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Connection_Timeout Client"=.\Connection_Timeout\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Crash_On_Write Client"=.\Crash_On_Write\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Crash_On_Write Server"=.\Crash_On_Write\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Crashed_Callback Server"=.\Crashed_Callback\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Crashed_Callbacks Client"=.\Crashed_Callback\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "DLL_ORB Test_Client_Module"=.\DLL_ORB\Test_Client_Module.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "DLL_ORB Test_Server_Module"=.\DLL_ORB\Test_Server_Module.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "DLL_ORB client"=.\DLL_ORB\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Test_Client_Module + End Project Dependency +}}} + +############################################################################### + +Project: "DLL_ORB server"=.\DLL_ORB\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Test_Server_Module + End Project Dependency +}}} + +############################################################################### + +Project: "DSI_Gateway_Client"=.\DSI_Gateway\DSI_Gateway_Client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "DSI_Gateway_Server"=.\DSI_Gateway\DSI_Gateway_Server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "DSI_Gateway_Service"=.\DSI_Gateway\DSI_Gateway_Service.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "DynAny Basics"=.\DynAny_Test\basic_test.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Explicit_Event_Loop Client"=.\Explicit_Event_Loop\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Explicit_Event_Loop Server"=.\Explicit_Event_Loop\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Exposed_Policies Client"=.\Exposed_Policies\Client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Exposed_Policies Server"=.\Exposed_Policies\Server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Faults Client"=.\Faults\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Faults Middle Server"=.\Faults\middle.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Faults Ping"=.\Faults\ping.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Faults Pong"=.\Faults\pong.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Faults Server"=.\Faults\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "File_IO Client"=.\File_IO\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "File_IO Server"=.\File_IO\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Forwarding Client"=.\Forwarding\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Forwarding Server"=.\Forwarding\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Hello Client"=.\Hello\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Hello Server"=.\Hello\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "IBM1047_ISO8859"=.\CodeSets\libs\IBM1047_ISO8859\IBM1047_ISO8859.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "IORTest"=.\IORManipulation\IORTest.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "InterOp Naming Server"=".\InterOp-Naming\server.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Leader_Followers Client"=.\Leader_Followers\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Leader_Followers Server"=.\Leader_Followers\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "LongUpcalls AMI_Client"=.\LongUpcalls\ami_client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "LongUpcalls AMI_Server"=.\LongUpcalls\ami_server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "LongUpcalls Blocking_Client"=.\LongUpcalls\blocking_client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "LongUpcalls Blocking_Server"=.\LongUpcalls\blocking_server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MProfile Client"=.\MProfile\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MProfile Server"=.\MProfile\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MProfile_Connection_Timeout Client"=.\MProfile_Connection_Timeout\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MProfile_Connection_Timeout Server"=.\MProfile_Connection_Timeout\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT Timeout Client"=.\MT_Timeout\MT_Timeout_Client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT Timeout Server"=.\MT_Timeout\MT_Timeout_Server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT_BiDir Client"=.\MT_BiDir\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT_BiDir Server"=.\MT_BiDir\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT_Client Client"=.\MT_Client\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT_Client ORB Creation"=.\MT_Client\orb_creation.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT_Client Server"=.\MT_Client\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT_Server Client"=.\MT_Server\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "MT_Server Server"=.\MT_Server\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Manipulation"=.\Policies\Manipulation.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Multiple Client"=.\Multiple\Client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Multiple Inheritance Client"=.\Multiple_Inheritance\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Multiple Inheritance Server"=.\Multiple_Inheritance\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Multiple Server"=.\Multiple\Server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Muxed_GIOP_Versions Client"=.\Muxed_GIOP_Versions\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Muxed_GIOP_Versions Server"=.\Muxed_GIOP_Versions\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Muxing Client"=.\Muxing\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Muxing Server"=.\Muxing\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Native Exceptions Client"=.\Native_Exceptions\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Native Exceptions Server"=.\Native_Exceptions\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested Upcall MT_Client Client"=.\NestedUpcall\MT_Client_Test\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested Upcall MT_Client Server"=.\NestedUpcall\MT_Client_Test\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested Upcall Simple Client"=.\NestedUpcall\Simple\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested Upcall Simple Server"=.\NestedUpcall\Simple\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested Upcall Triangle Initiator"=.\NestedUpcall\Triangle_Test\initiator.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested Upcall Triangle Server_A"=.\NestedUpcall\Triangle_Test\server_A.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested Upcall Triangle Server_B"=.\NestedUpcall\Triangle_Test\server_B.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested_Event_Loop Client"=.\Nested_Event_Loop\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested_Event_Loop Server"=.\Nested_Event_Loop\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested_Upcall_Crash Client"=.\Nested_Upcall_Crash\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested_Upcall_Crash Scavenger"=.\Nested_Upcall_Crash\scavenger.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Nested_Upcall_Crash Server"=.\Nested_Upcall_Crash\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "No_Server_MT_Connect_Test Client"=.\No_Server_MT_Connect_Test\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "No_Server_MT_Connect_Test Server"=.\No_Server_MT_Connect_Test\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "ORB_destroy"=.\ORB_destroy\ORB_destroy.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "ORB_init"=.\ORB_init\ORB_init.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "ORB_shutdown Server"=.\ORB_shutdown\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "ORT Server"=.\ORT\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "ORT client"=.\ORT\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Object_Loader Driver"=.\Object_Loader\driver.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Objref_Sequence_Test Client"=.\Objref_Sequence_Test\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Objref_Sequence_Test Server"=.\Objref_Sequence_Test\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "OctetSeq"=.\OctetSeq\OctetSeq.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "OctetSeq Client"=.\OctetSeq\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "OctetSeq Server"=.\OctetSeq\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Oneway_Buffering Admin"=.\Oneway_Buffering\admin.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Oneway_Buffering Client"=.\Oneway_Buffering\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Oneway_Buffering Server"=.\Oneway_Buffering\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Oneways_Invoking_Twoways Client"=.\Oneways_Invoking_Twoways\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Oneways_Invoking_Twoways Server"=.\Oneways_Invoking_Twoways\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Current"=.\POA\Current\Current.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Default_Servant"=.\POA\Default_Servant\Default_Servant.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Etherealization"=.\POA\Etherealization\Etherealization.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Excessive_Object_Deactivations"=.\POA\Excessive_Object_Deactivations\Excessive_Object_Deactivations.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Identity"=.\POA\Identity\Identity.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA MT_Servant_Locator"=.\POA\MT_Servant_Locator\MT_Servant_Locator.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Nested_Non_Servant_Upcalls"=.\POA\Nested_Non_Servant_Upcalls\Nested_Non_Servant_Upcalls.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Non_Servant_Upcalls"=.\POA\Non_Servant_Upcalls\Non_Servant_Upcalls.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Object_Reactivation"=.\POA\Object_Reactivation\Object_Reactivation.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA POA_Destruction"=.\POA\POA_Destruction\POA_Destruction.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Persistent ID Client"=.\POA\Persistent_ID\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Persistent ID Server"=.\POA\Persistent_ID\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Policies"=.\POA\Policies\Policies.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA Single_Threaded_POA"=.\POA\Single_Threaded_POA\Single_Threaded_POA.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "POA wait_for_completion"=.\POA\wait_for_completion\wait_for_completion.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Param_Test Client"=.\Param_Test\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Param_Test Server"=.\Param_Test\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Queued_Message_Test"=.\Queued_Message_Test\Queued_Message_Test.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Reliable_Oneways Client"=.\Reliable_Oneways\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Reliable_Oneways Server"=.\Reliable_Oneways\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Server_Leaks Client"=.\Server_Leaks\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Server_Leaks Server"=.\Server_Leaks\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Single_Read Client"=.\Single_Read\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Single_Read Server"=.\Single_Read\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Stack Recursion Client"=.\Stack_Recursion\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Stack_Recursion Server"=.\Stack_Recursion\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Strategies client"=.\Strategies\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Strategies server"=.\Strategies\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Test_DLL"=.\Object_Loader\Test_DLL.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Timed_Buffered_Oneways Client"=.\Timed_Buffered_Oneways\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Timed_Buffered_Oneways Server"=.\Timed_Buffered_Oneways\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Timeout Client"=.\Timeout\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Timeout Server"=.\Timeout\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Two_Objects Client"=.\Two_Objects\client.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "Two_Objects Server"=.\Two_Objects\server.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "idl_test"=.\IDL_Test\idl_test.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "portspan"=.\ORB_init\Portspan\portspan.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + -- cgit v1.2.1