From bce764199e09ab81a248f9068cc0f4a09ca0de1f Mon Sep 17 00:00:00 2001 From: coryan Date: Wed, 28 Mar 2001 18:47:39 +0000 Subject: ChangeLogTag:Wed Mar 28 10:42:12 2001 Carlos O'Ryan --- TAO/ChangeLogs/ChangeLog-02a | 438 ++++++ .../orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp | 41 +- .../orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h | 3 + TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp | 97 +- TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h | 6 +- TAO/performance-tests/Latency/st_client.cpp | 13 +- TAO/tao/GIOP_Message_Base.cpp | 8 +- TAO/tao/GIOP_Message_Handler.cpp | 40 +- TAO/tao/GIOP_Message_Lite.cpp | 8 +- TAO/tao/IIOP_Connection_Handler.cpp | 42 +- TAO/tao/IIOP_Connection_Handler.h | 5 + TAO/tao/IIOP_Endpoint.cpp | 2 - TAO/tao/IIOP_Transport.cpp | 38 +- TAO/tao/IIOP_Transport.h | 21 +- TAO/tao/Makefile | 7 +- TAO/tao/ORB_Core.cpp | 21 +- TAO/tao/ORB_Core.h | 17 +- TAO/tao/ORB_Core.i | 5 + TAO/tao/Resource_Factory.h | 6 + TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp | 35 +- TAO/tao/Strategies/SHMIOP_Transport.cpp | 43 +- TAO/tao/Strategies/SHMIOP_Transport.h | 9 +- TAO/tao/Strategies/UIOP_Connection_Handler.cpp | 38 +- TAO/tao/Strategies/UIOP_Transport.cpp | 39 +- TAO/tao/Strategies/UIOP_Transport.h | 12 +- TAO/tao/Sync_Strategies.cpp | 225 +-- TAO/tao/Sync_Strategies.h | 92 +- TAO/tao/TAO.dsp | 48 + TAO/tao/TAO_Static.dsp | 48 + TAO/tao/Transport.cpp | 553 +++++++- TAO/tao/Transport.h | 116 +- TAO/tao/Transport.inl | 37 +- TAO/tao/Wait_On_Leader_Follower.cpp | 4 +- TAO/tao/default_resource.cpp | 39 + TAO/tao/default_resource.h | 13 +- TAO/tests/LongWrites/Coordinator.cpp | 12 +- TAO/tests/LongWrites/Coordinator.h | 17 +- TAO/tests/LongWrites/Makefile | 1486 +------------------- TAO/tests/LongWrites/Receiver.cpp | 29 +- TAO/tests/LongWrites/Receiver.h | 9 + TAO/tests/LongWrites/Sender.cpp | 79 +- TAO/tests/LongWrites/Sender.h | 37 +- TAO/tests/LongWrites/Test.idl | 10 +- TAO/tests/LongWrites/client.cpp | 49 +- TAO/tests/LongWrites/run_test.pl | 66 +- TAO/tests/LongWrites/server.cpp | 29 +- TAO/tests/Makefile | 4 +- TAO/tests/README | 4 + 48 files changed, 1856 insertions(+), 2144 deletions(-) diff --git a/TAO/ChangeLogs/ChangeLog-02a b/TAO/ChangeLogs/ChangeLog-02a index 9e05733023f..4f4053903f2 100644 --- a/TAO/ChangeLogs/ChangeLog-02a +++ b/TAO/ChangeLogs/ChangeLog-02a @@ -1,3 +1,441 @@ +Wed Mar 28 10:42:12 2001 Carlos O'Ryan + + * Another merge for the branch fixing bug 132 + + Tue Mar 20 09:34:53 2001 Carlos O'Ryan + + * tao/Transport.cpp: + Improved error checking for Queued_Message allocations. + + Sat Mar 17 17:52:27 2001 Carlos O'Ryan + + * tao/Transport.h: + * tao/Transport.cpp: + Removed the current_message_ field, using the head of the queue + works just as well, at least as long as we always push events to + the end of the queue. + + * tao/IIOP_Transport.h: + * tao/IIOP_Transport.cpp: + * tao/Reactive_Flushing_Strategy.cpp: + Use the Flushing Strategy to schedule output and cancel output + with the reactor. + + Sat Mar 17 15:34:14 2001 Carlos O'Ryan + + * tests/Big_Oneways/Session.h: + * tests/Big_Oneways/Session.cpp: + Fixed signed/unsigned warnings + + * tests/Big_Oneways/Coordinator.cpp: + Print error messages in all exception cases + + * tests/Big_Oneways/run_test.pl: + Run 3 peers to cause failures. + + Fri Mar 16 15:49:26 2001 Carlos O'Ryan + + * tao/IIOP_Transport.cpp: + Fixed debugging message for cancel_output. + + * tests/Big_Oneways/Big_Oneways.dsw: + * tests/Big_Oneways/client.dsp: + * tests/Big_Oneways/server.dsp: + Fixed project files, the first version commited missed some + changes. + + Thu Mar 15 10:46:52 2001 Carlos O'Ryan + + * tests/Big_Oneways/Makefile: + * tests/Big_Oneways/Test.idl: + * tests/Big_Oneways/run_test.pl: + * tests/Big_Oneways/Coordinator.h: + * tests/Big_Oneways/Coordinator.cpp: + * tests/Big_Oneways/Peer.h: + * tests/Big_Oneways/Peer.cpp: + * tests/Big_Oneways/Session.h: + * tests/Big_Oneways/Session.cpp: + * tests/Big_Oneways/client.cpp: + * tests/Big_Oneways/server.cpp: + Changed the test to work more predictably on multi-CPU boxes. + The sessions are configured at creation time, and they don't + start sending events until start() is called. + Instead of automatically destroy them on shutdown we wait until + they all stop and then explicitly use a destroy() method to take + them down. + + Tue Mar 13 15:08:06 2001 Carlos O'Ryan + + * tests/README: + * tests/Makefile: + * tests/Big_Oneways/README: + * tests/Big_Oneways/Test.idl: + * tests/Big_Oneways/Makefile: + * tests/Big_Oneways/Big_Oneways.dsw: + * tests/Big_Oneways/server.dsp: + * tests/Big_Oneways/client.dsp: + * tests/Big_Oneways/run_test.pl: + * tests/Big_Oneways/Coordinator.h: + * tests/Big_Oneways/Coordinator.cpp: + * tests/Big_Oneways/Peer.h: + * tests/Big_Oneways/Peer.cpp: + * tests/Big_Oneways/Session.h: + * tests/Big_Oneways/Session.cpp: + * tests/Big_Oneways/Session_Control.h: + * tests/Big_Oneways/Session_Control.cpp: + * tests/Big_Oneways/Session_Task.h: + * tests/Big_Oneways/Session_Task.cpp: + * tests/Big_Oneways/client.cpp: + * tests/Big_Oneways/server.cpp: + Add new stress test for the non-blocking I/O features in the + ORB. This test is more focussed than LongWrites, and its + shutdown sequence is better designed (LongWrites tends to crash + after running successfully.) + + * tao/GIOP_Message_Handler.cpp: + Fixed unsigned/signed warning + + Thu Mar 8 19:12:48 2001 Carlos O'Ryan + + * tao/GIOP_Message_Base.cpp: + * tao/GIOP_Message_Handler.h: + * tao/GIOP_Message_Handler.cpp: + Had to manually merge Bala's changes from Sat Feb 17 23:08:44 + 2001. + + * tao/IIOP_Connection_Handler.cpp: + Cosmetic fixes. + + * tao/IIOP_Transport.cpp: + Print debugging messages when output is scheduled, and alse when + it is canceled. + Do not register the handler more than once on the reactor. + + * tao/Queued_Message.inl: + The done() condition was reversed. + + * tao/Transport.cpp: + Add a ton of debugging mesages, including detailed messages of + outgoing and incoming data, information about each queued + message, etc. + + * tao/Transport.cpp (send_message_block_chain): + Always add the number of bytes transferred on each send() call, + even when it returns an error. + + * tao/Transport.cpp (send_message_i): + Use easier to read code when deciding what messages are queued. + Before calling schedule_output() and returning we must queue the + message, forgot to do that in the previous version. + + * tests/LongWrites/Receiver.cpp: + * tests/LongWrites/Sender.cpp: + * tests/LongWrites/Sender.h: + * tests/LongWrites/Sender_Task.cpp: + * tests/LongWrites/Sender_Task.h: + * tests/LongWrites/client.cpp: + I'm tweaking the test trying to make the termination condition + more reliable. Unfortunately after one of the clients finishes + the rest does not receive all the required messages. + I will probably have to change the protocol, which is probably a + good idea anyway, so we can control the number of threads too. + + * tests/LongWrites/run_test.pl: + In the haste to merge the fix_bug132 bug I forgot to incorporate + the support for the multiple test types. + + * tao/Makefile: + * tao/Domain/Makefile: + * tao/DynamicAny/Makefile: + * tao/DynamicInterface/Makefile: + * tao/IFR_Client/Makefile: + * tao/IORManipulation/Makefile: + * tao/IORTable/Makefile: + * tao/PortableServer/Makefile: + * tao/SmartProxies/Makefile: + * tao/Strategies/Makefile: + * tests/LongWrites/Makefile: + Update dependencies. + + Wed Mar 07 08:48:11 2001 Carlos O'Ryan + + * tao/Queued_Message.inl: + Both done() and mb() were using contents_, but the flow has + changed to use current_message_. + + * tao/Transport.cpp: + Simplify code flow in send_current_message() + Simplify code in dequeue_head() + + * tao/TAO.dsp: + * tao/TAO_Static.dsp: + Update project files so they work on the branch. + + Tue Mar 6 19:44:44 2001 Carlos O'Ryan + + * tao/GIOP_Message_Handler.cpp: + When printing an invalid GIOP magic number use hex values, not + the character representation, because the latter can print out + garbage. + + * tao/ORB_Core.cpp: + Print the return value of each handle_events() call, on an + attempt to figure out why it is spinning. + + * tao/Transport.cpp: + Print handle, return value and errno after each call to + send_current_message() + + * tao/Wait_On_Leader_Follower.cpp: + Don't enter the event loop if the reply has been received + already. + + Tue Mar 6 11:02:43 2001 Carlos O'Ryan + + * Merged in changes from the fix_bug132 branch. I need several + bug fixes from the main trunk. In my experience the easiest way + to do this is to create a new branch higher up in the main + trunk, close the old branch and propagate its changes to the new + one. + In this case we created fix_bug132_iter02 (today) merge the + changes from fix_bug132 into that branch, and close fix_bug132. + + Mon Mar 5 11:32:14 2001 Carlos O'Ryan + + * tao/Transport.cpp: + * tao/IIOP_Transport.cpp: + Add debugging messages + + * tests/LongWrites/Makefile: + Updates dependencies and object files for the client. + + Fri Mar 02 15:29:17 2001 Carlos O'Ryan + + * tao/Transport.h: + * tao/Transport.cpp: + Continue implementation of reactive output. + On this pass I fixed the code to deal with several error + conditions, invoke schedule_output() if the connection returns + an EWOULDBLOCK, also cancel the output if there is no data to + send. + Fix syncronization on send_queued_message() + Fix memory allocation for message blocks contained in + Queued_Message, they cannot be cloned() because that would + allocate from TSS. + + * tao/IIOP_Transport.h: + * tao/IIOP_Transport.cpp: + Implement schedule_output() and cancel_output() methods. + + * tao/Wait_On_Leader_Follower.cpp: + Do not re-insert the transport into the reactor on each wait, + once is enough. + + * tao/IIOP_Connection_Handler.h: + * tao/IIOP_Connection_Handler.cpp: + Implement a handle_output() callback, delegate on the + TAO_Transport + + * tao/IIOP_Endpoint.cpp: + Remove unused #include + + * tests/LongWrites/Coordinator.h: + * tests/LongWrites/Coordinator.cpp: + * tests/LongWrites/Receiver.h: + * tests/LongWrites/Receiver.cpp: + * tests/LongWrites/Sender.h: + * tests/LongWrites/Sender.cpp: + * tests/LongWrites/client.cpp: + * tests/LongWrites/client.dsp: + * tests/LongWrites/run_test.pl: + * tests/LongWrites/server.cpp: + * tests/LongWrites/svc.conf: + * tests/LongWrites/Sender_Task.h: + * tests/LongWrites/Sender_Task.cpp: + Add support for multi-threaded clients. + Try to count the number of incoming messages and only exit when + all have been received. + + * tests/Queued_Message_Test/Queued_Message_Test.dsp: + Removed a number of unused files from this unit test. + + Sun Feb 25 10:22:59 2001 Carlos O'Ryan + + * tao/Queued_Message.h: + * tao/Queued_Message.cpp: + * tao/Transport.cpp: + Instead of releasing the message blocks as soon as possible we + delay until the queued message is deallocated. This will make + it possible to release all the data in the same thread that + allocated it, preserving the support for TSS allocators. + + * tests/LongWrites/Test.idl: + * tests/LongWrites/Receiver.h: + * tests/LongWrites/Receiver.cpp: + * tests/LongWrites/Sender.h: + * tests/LongWrites/Sender.cpp: + * tests/LongWrites/client.cpp: + * tests/LongWrites/run_test.pl: + The test can now send big oneways, big twoways and big twoways + with big responses. + + Wed Feb 14 18:38:11 2001 Carlos O'Ryan + + * tao/Queued_Message.cpp: + Fixed queue manipulation logic + + * tests/Queued_Message_Test/Queued_Message_Test.cpp: + The test was miscounting remove operations from the queue. + + * tests/Queued_Message_Test/Queued_Message_Test.dsw: + * tests/Queued_Message_Test/Queued_Message_Test.dsp: + Add MSVC project files. + + Wed Feb 14 10:02:44 2001 Carlos O'Ryan + + * tao/Queued_Message.h: + * tao/Queued_Message.cpp: + Add flag to control message block ownership, used to minimize + memory allocations. + + * tao/Transport.cpp: + Use the ownership flags for the Queued_Message. + + * tests/Makefile: + * tests/Queued_Message_Test/Makefile: + * tests/Queued_Message_Test/Queued_Message_Test.cpp: + Add new unit test for the TAO_Queued_Message class. + + * tao/Makefile: + * tao/Domain/Makefile: + * tao/DynamicAny/Makefile: + * tao/DynamicInterface/Makefile: + * tao/IFR_Client/Makefile: + Update dependencies + + * orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp: + The ACE_SSL_SOCK_Stream does not support sendv() + + Mon Feb 12 15:44:54 2001 Carlos O'Ryan + + * tao/Makefile: + Update makefile to include new files + + * orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h: + * orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp: + * tao/Strategies/SHMIOP_Transport.h: + * tao/Strategies/SHMIOP_Transport.cpp: + * tao/Strategies/UIOP_Transport.h: + * tao/Strategies/UIOP_Transport.cpp: + Fixed all protocols to use the new send() method with iovec + parameters. + + * tao/GIOP_Message_Lite.cpp: + Use the send() method with iovec arguments. + + * tao/Sync_Strategies.h: + * tao/Sync_Strategies.cpp: + * tao/Transport.cpp: + More cleanup for the Sync_Strategies, the must_queue() method + does not require a Stub argument. + + Mon Feb 12 10:15:47 2001 Carlos O'Ryan + + * tao/Transport.h: + * tao/Transport.cpp: + Add new method to send a message block chain. + The template method to send data takes an iovec argument. + + * tao/IIOP_Transport.h: + * tao/IIOP_Transport.cpp: + Implement the iovec-based send() template method. + + * tao/Queued_Message.cpp: + The cleanup code was broken. + + * tao/GIOP_Message_Base.cpp: + Use the message block chain method to send short critical + messages. + + Fri Feb 09 10:50:47 2001 Carlos O'Ryan + + * tao/Queued_Message.h: + * tao/Queued_Message.inl: + * tao/Queued_Message.cpp: + Add new class to represent a queued message in the outgoing + path. This class has to keep more than just the message block, + it also takes care of timeouts and signaling any waiting thread + when the message is sent. + + * tao/Message_Sent_Callback.h: + * tao/Message_Sent_Callback.inl: + * tao/Message_Sent_Callback.cpp: + Define interface to signal threads waiting for a message to be + sent out, e.g. twoway requests blocked waiting for a queued + message. + + * tao/Flushing_Strategy.h: + * tao/Flushing_Strategy.cpp: + * tao/Block_Flushing_Strategy.h: + * tao/Block_Flushing_Strategy.cpp: + * tao/Reactive_Flushing_Strategy.h + * tao/Reactive_Flushing_Strategy.cpp: + New classes to control how the outgoing data is flushed, + either by blocking on write() or by using the reactor. + + * tao/Resource_Factory.h: + * tao/default_resource.h: + * tao/default_resource.cpp: + Add new methods to create the flushing strategy. + + * tao/ORB_Core.h: + * tao/ORB_Core.i: + * tao/ORB_Core.cpp: + Add accessor for the flushing strategy. Notice that the + strategy is stateless so a single instance (per-ORB) is needed. + + * tao/Sync_Strategies.h: + * tao/Sync_Strategies.cpp: + The Sync_Strategies have been simplified. They are now + stateless, and they only need to answer a couple of questions + (1) should a message be buffered, (2) should the ORB flush a + queue. + + * performance-tests/Latency/st_client.cpp: + Destroy the ORB on shutdown. + + * tao/TAO.dsp: + * tao/TAO_Static.dsp: + Add the new files to the TAO project files. + + * tao/Transport.h: + * tao/Transport.inl: + * tao/Transport.cpp: + Move much of the functionality of sending and outgoing message + queue up to the base transport class. Remove a lot of code + deailing with the previous (blocking) queues. + + * tao/IIOP_Transport.cpp: + * tao/IIOP_Connection_Handler.cpp: + * tao/Strategies/SHMIOP_Transport.cpp: + * tao/Strategies/SHMIOP_Connection_Handler.cpp: + * tao/Strategies/UIOP_Transport.cpp: + * tao/Strategies/UIOP_Connection_Handler.cpp: + * orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp: + * orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp: + Change the transport and connection handlers to use the new + outgoing message queue, the flushing strategy and the changes to + the SyncStrategy. + + * tao/GIOP_Message_Base.cpp: + Propagate a few interface changes. + + * tests/LongWrites/LongWrites.dsw: + * tests/LongWrites/client.dsp: + * tests/LongWrites/server.dsp: + * tests/LongWrites/run_test.pl: + Got the test to compile (and run) under NT. + Wed Mar 28 08:18:00 2001 Craig Rodrigues * orbsvcs/orbsvcs/AV/UDP.h: diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp index 3db2b19b2d3..0a023fab609 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.cpp @@ -66,27 +66,10 @@ TAO_SSLIOP_Connection_Handler::TAO_SSLIOP_Connection_Handler ( } -TAO_SSLIOP_Connection_Handler:: -~TAO_SSLIOP_Connection_Handler (void) +TAO_SSLIOP_Connection_Handler::~TAO_SSLIOP_Connection_Handler (void) { - if (this->transport () != 0) - { - // If the socket has not already been closed. - if (this->get_handle () != ACE_INVALID_HANDLE) - { - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (); - } - else - { - // Dequeue messages and delete message blocks. - this->transport ()->dequeue_all (); - } - } } - - int TAO_SSLIOP_Connection_Handler::open (void *) { @@ -217,9 +200,6 @@ TAO_SSLIOP_Connection_Handler::handle_close (ACE_HANDLE handle, // Close the handle.. if (this->get_handle () != ACE_INVALID_HANDLE) { - // Send the buffered messages first - this->transport ()->send_buffered_messages (); - // Purge the entry too this->transport ()->mark_invalid (); @@ -251,22 +231,19 @@ int TAO_SSLIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, const void *) { - // This method is called when buffering timer expires. - // - ACE_Time_Value *max_wait_time = 0; - - TAO_Stub *stub = 0; - int has_timeout; - this->orb_core ()->call_timeout_hook (stub, - has_timeout, - *max_wait_time); - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (max_wait_time); + if (this->transport ()->handle_output () == -1) + return -1; return 0; } +int +TAO_IIOP_Connection_Handler::handle_output (ACE_HANDLE) +{ + return this->transport ()->handle_output (); +} + int TAO_SSLIOP_Connection_Handler::add_transport_to_cache (void) { diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h index 7fe2df23e78..7ca64c64b02 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Connection_Handler.h @@ -101,6 +101,9 @@ public: virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0); + /// Documented in ACE_Event_Handler + virtual int handle_output (ACE_HANDLE); + /// Add ourselves to Cache. int add_transport_to_cache (void); diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp index 61ea81502fe..5b89ea5c2d5 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.cpp @@ -3,12 +3,9 @@ // $Id$ #include "SSLIOP_Transport.h" - #include "tao/debug.h" -ACE_RCSID (TAO_SSLIOP, - SSLIOP_Transport, - "$Id$") +ACE_RCSID (TAO_SSLIOP, SSLIOP_Transport, "$Id$") #include "SSLIOP_Connection_Handler.h" #include "SSLIOP_Profile.h" @@ -65,74 +62,16 @@ TAO_SSLIOP_Transport::event_handler_i (void) } ssize_t -TAO_SSLIOP_Transport::send_i (const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time, - size_t *bt) +TAO_SSLIOP_Transport::send_i (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { - // @@ This code should be refactored into ACE.cpp or something - // similar! - - // For the most part this was copied from GIOP::send_request and - // friends. - - size_t temp; - size_t &bytes_transferred = bt == 0 ? temp : *bt; - - iovec iov[IOV_MAX]; - int iovcnt = 0; - ssize_t n = 0; - - for (const ACE_Message_Block *i = message_block; - i != 0; - i = i->cont ()) - { - // Make sure there is something to send! - if (i->length () > 0) - { - iov[iovcnt].iov_base = i->rd_ptr (); - iov[iovcnt].iov_len = i->length (); - iovcnt++; - - // The buffer is full make a OS call. @@ TODO this should - // be optimized on a per-platform basis, for instance, some - // platforms do not implement writev() there we should copy - // the data into a buffer and call send_n(). In other cases - // there may be some limits on the size of the iovec, there - // we should set IOV_MAX to that limit. - if (iovcnt == IOV_MAX) - { - if (max_wait_time == 0) - n = this->connection_handler_->peer ().sendv_n (iov, - iovcnt); - else - // @@ No timeouts!!! - n = this->connection_handler_->peer ().sendv_n (iov, - iovcnt /*, - max_wait_time */); - - if (n == 0 || - n == -1) - return n; - - bytes_transferred += n; - iovcnt = 0; - } - } - } + ssize_t retval = this->connection_handler_->peer ().send (iov, iovcnt, + max_wait_time); + if (retval > 0) + bytes_transferred = retval; - // Check for remaining buffers to be sent! - if (iovcnt != 0) - { - n = this->connection_handler_->peer ().sendv_n (iov, - iovcnt); - if (n == 0 || - n == -1) - return n; - - bytes_transferred += n; - } - - return bytes_transferred; + return retval; } ssize_t @@ -184,6 +123,21 @@ TAO_SSLIOP_Transport::read_process_message (ACE_Time_Value *max_wait_time, int TAO_SSLIOP_Transport::register_handler_i (void) { + if (TAO_debug_level > 4) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d\n", + this->id ())); + } + if (this->connection_handler_->is_registered ()) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d" + ", already registered\n", + this->id ())); + return 0; + } + // @@ It seems like this method should go away, the right reactor is // picked at object creation time. ACE_Reactor *r = this->orb_core_->reactor (); @@ -237,7 +191,7 @@ TAO_SSLIOP_Transport::send_message (TAO_OutputCDR &stream, // versions seem to need it though. Leaving it costs little. // This guarantees to send all data (bytes) or return an error. - ssize_t n = this->send_or_buffer (stub, + ssize_t n = this->send_message_i (stub, twoway, stream.begin (), max_wait_time); @@ -615,4 +569,3 @@ TAO_SSLIOP_Transport::connection_handler (void) const return connection_handler_; } #endif - diff --git a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h index 891748a6283..a812197ef5e 100644 --- a/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h +++ b/TAO/orbsvcs/orbsvcs/SSLIOP/SSLIOP_Transport.h @@ -81,9 +81,9 @@ protected: virtual ACE_Event_Handler *event_handler_i (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (const ACE_Message_Block *mblk, - const ACE_Time_Value *s = 0, - size_t *bytes_transferred = 0); + virtual ssize_t send_i (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, diff --git a/TAO/performance-tests/Latency/st_client.cpp b/TAO/performance-tests/Latency/st_client.cpp index c750a23b227..52a2dd05216 100644 --- a/TAO/performance-tests/Latency/st_client.cpp +++ b/TAO/performance-tests/Latency/st_client.cpp @@ -129,11 +129,11 @@ main (int argc, char *argv[]) if (TAO_debug_level > 0 && i % 100 == 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) iteration = %d\n", i)); - if (period != -1) - { - ACE_Time_Value tv (0, period * 1000); - ACE_OS::sleep (tv); - } + if (period != -1) + { + ACE_Time_Value tv (0, period * 1000); + ACE_OS::sleep (tv); + } } ACE_hrtime_t test_end = ACE_OS::gethrtime (); @@ -161,6 +161,9 @@ main (int argc, char *argv[]) server->shutdown (ACE_TRY_ENV); ACE_TRY_CHECK; } + + orb->destroy (ACE_TRY_ENV); + ACE_TRY_CHECK; } ACE_CATCHANY { diff --git a/TAO/tao/GIOP_Message_Base.cpp b/TAO/tao/GIOP_Message_Base.cpp index 396e58cea40..26fd20d62b1 100644 --- a/TAO/tao/GIOP_Message_Base.cpp +++ b/TAO/tao/GIOP_Message_Base.cpp @@ -333,7 +333,6 @@ TAO_GIOP_Message_Base::process_request_message (TAO_Transport *transport, this->message_handler_.message_state ().byte_order, orb_core); - // input_cdr.skip_bytes (TAO_GIOP_MESSAGE_HEADER_LEN); // Send the message state for the service layer like FT to log the @@ -890,7 +889,8 @@ TAO_GIOP_Message_Base::send_error (TAO_Transport *transport) ACE_Message_Block message_block(&data_block); message_block.wr_ptr (TAO_GIOP_MESSAGE_HEADER_LEN); - int result = transport->send (&message_block); + size_t bt; + int result = transport->send_message_block_chain (&message_block, bt); if (result == -1) { if (TAO_debug_level > 0) @@ -1024,7 +1024,9 @@ TAO_GIOP_Message_Base:: ACE_Message_Block message_block(&data_block); message_block.wr_ptr (TAO_GIOP_MESSAGE_HEADER_LEN); - if (transport->send (&message_block) == -1 && errno != ENOENT) + size_t bt; + int result = transport->send_message_block_chain (&message_block, bt); + if (result == -1) { if (TAO_debug_level > 0) ACE_ERROR ((LM_ERROR, diff --git a/TAO/tao/GIOP_Message_Handler.cpp b/TAO/tao/GIOP_Message_Handler.cpp index 3e6695a6858..c24fb4b9334 100644 --- a/TAO/tao/GIOP_Message_Handler.cpp +++ b/TAO/tao/GIOP_Message_Handler.cpp @@ -19,7 +19,11 @@ TAO_GIOP_Message_Handler::TAO_GIOP_Message_Handler (TAO_ORB_Core * orb_core, : mesg_base_ (base), message_status_ (TAO_GIOP_WAITING_FOR_HEADER), message_size_ (ACE_CDR::DEFAULT_BUFSIZE), - current_buffer_ (orb_core->create_input_cdr_data_block (ACE_CDR::DEFAULT_BUFSIZE)), + current_buffer_ (ACE_CDR::DEFAULT_BUFSIZE), + // @@ This doesn't seem to work. The problem comes when we extract + // data portion from this buffer in the skeleton. Why?? Needs + // investigation. + // current_buffer_ (orb_core->create_input_cdr_data_block (ACE_CDR::DEFAULT_BUFSIZE)), supp_buffer_ (ACE_CDR::DEFAULT_BUFSIZE), message_state_ (orb_core), orb_core_ (orb_core) @@ -167,7 +171,8 @@ TAO_GIOP_Message_Handler::parse_magic_bytes (void) // For the present... if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) bad header, magic word [%c%c%c%c]\n"), + ACE_TEXT ("TAO (%P|%t) bad header, " + "magic word [%2.2x,%2.2x,%2.2x,%2.2x]\n"), buf[0], buf[1], buf[2], @@ -218,9 +223,9 @@ TAO_GIOP_Message_Handler::get_payload_size (void) if ((align_offset + x + TAO_GIOP_MESSAGE_HEADER_LEN) > this->message_size_) { - size_t size = ACE_CDR::MAX_ALIGNMENT + - x + - TAO_GIOP_MESSAGE_HEADER_LEN; + size_t size = ACE_CDR::MAX_ALIGNMENT + + x + + TAO_GIOP_MESSAGE_HEADER_LEN; // @@ This must come off the allocator. For some reason when I // use the allocator things go for a toss. Need to revisit @@ -504,14 +509,31 @@ TAO_GIOP_Message_Handler::read_messages (TAO_Transport *transport) return -1; } - // Now we have a succesful read. First adjust the write pointer - this->current_buffer_.wr_ptr (n); - - if (TAO_debug_level > 8) + if (TAO_debug_level > 6) { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - GIOP_Message_Handler::read_messages" + " received %d bytes\n", + n)); + + size_t len; + for (size_t offset = 0; offset < size_t(n); offset += len) + { + len = n - offset; + if (len > 512) + len = 512; + ACE_HEX_DUMP ((LM_DEBUG, + this->current_buffer_.wr_ptr () + offset, + len, + "TAO (%P|%t) - read_messages ")); + } ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - received %d bytes \n", n)); } + // Now we have a succesful read. First adjust the write pointer + this->current_buffer_.wr_ptr (n); + + return 0; } diff --git a/TAO/tao/GIOP_Message_Lite.cpp b/TAO/tao/GIOP_Message_Lite.cpp index 4ef083ccf55..5ada5f4765e 100644 --- a/TAO/tao/GIOP_Message_Lite.cpp +++ b/TAO/tao/GIOP_Message_Lite.cpp @@ -1,4 +1,4 @@ -//$Id$ +// $Id$ #include "tao/GIOP_Message_Lite.h" #include "tao/debug.h" @@ -16,6 +16,8 @@ # include "tao/GIOP_Message_Lite.i" #endif /* __ACE_INLINE__ */ +ACE_RCSID(tao, GIOP_Message_Lite, "$Id$") + static const size_t TAO_GIOP_LITE_HEADER_LEN = 5; static const size_t TAO_GIOP_LITE_MESSAGE_SIZE_OFFSET = 0; static const size_t TAO_GIOP_LITE_MESSAGE_TYPE_OFFSET = 4; @@ -1365,7 +1367,9 @@ TAO_GIOP_Message_Lite::send_error (TAO_Transport *transport) ACE_Message_Block message_block(&data_block); message_block.wr_ptr (TAO_GIOP_LITE_HEADER_LEN); - int result = transport->send (&message_block); + size_t bt; + int result = transport->send_message_block_chain (&message_block, + bt); if (result == -1) { if (TAO_debug_level > 0) diff --git a/TAO/tao/IIOP_Connection_Handler.cpp b/TAO/tao/IIOP_Connection_Handler.cpp index 51fa969eb97..5a91464338a 100644 --- a/TAO/tao/IIOP_Connection_Handler.cpp +++ b/TAO/tao/IIOP_Connection_Handler.cpp @@ -1,6 +1,5 @@ // $Id$ - #include "tao/IIOP_Connection_Handler.h" #include "tao/Timeprobe.h" #include "tao/debug.h" @@ -20,8 +19,6 @@ ACE_RCSID(tao, IIOP_Connect, "$Id$") - - TAO_IIOP_Connection_Handler::TAO_IIOP_Connection_Handler (ACE_Thread_Manager *t) : TAO_IIOP_SVC_HANDLER (t, 0 , 0), TAO_Connection_Handler (0), @@ -58,22 +55,8 @@ TAO_IIOP_Connection_Handler::TAO_IIOP_Connection_Handler (TAO_ORB_Core *orb_core TAO_IIOP_Connection_Handler::~TAO_IIOP_Connection_Handler (void) { - if (this->transport () != 0) { - // If the socket has not already been closed. - if (this->get_handle () != ACE_INVALID_HANDLE) - { - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (); - } - else - { - // Dequeue messages and delete message blocks. - this->transport ()->dequeue_all (); - } - } } - int TAO_IIOP_Connection_Handler::open (void*) { @@ -208,9 +191,6 @@ TAO_IIOP_Connection_Handler::handle_close (ACE_HANDLE handle, // Close the handle.. if (this->get_handle () != ACE_INVALID_HANDLE) { - // Send the buffered messages first - this->transport ()->send_buffered_messages (); - // Mark the entry as invalid this->transport ()->mark_invalid (); @@ -236,27 +216,25 @@ TAO_IIOP_Connection_Handler::fetch_handle (void) return this->get_handle (); } - int TAO_IIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, const void *) { - // This method is called when buffering timer expires. - // - ACE_Time_Value *max_wait_time = 0; - - TAO_Stub *stub = 0; - int has_timeout; - this->orb_core ()->call_timeout_hook (stub, - has_timeout, - *max_wait_time); - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (max_wait_time); + if (this->transport ()->handle_output () == -1) + { + return -1; + } return 0; } +int +TAO_IIOP_Connection_Handler::handle_output (ACE_HANDLE) +{ + return this->transport ()->handle_output (); +} + int TAO_IIOP_Connection_Handler::add_transport_to_cache (void) { diff --git a/TAO/tao/IIOP_Connection_Handler.h b/TAO/tao/IIOP_Connection_Handler.h index 786bb84a0e0..9c605f1abe7 100644 --- a/TAO/tao/IIOP_Connection_Handler.h +++ b/TAO/tao/IIOP_Connection_Handler.h @@ -1,4 +1,5 @@ // This may look like C, but it's really -*- C++ -*- + // =================================================================== /** * @file IIOP_Connection_Handler.h @@ -114,11 +115,15 @@ public: virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0); + /// Documented in ACE_Event_Handler + virtual int handle_output (ACE_HANDLE); + /// Add ourselves to Cache. int add_transport_to_cache (void); /// Process the int process_listen_point_list (IIOP::ListenPointList &listen_list); + protected: /// = Event Handler overloads diff --git a/TAO/tao/IIOP_Endpoint.cpp b/TAO/tao/IIOP_Endpoint.cpp index bbac4ef3f30..5b194b5d20b 100644 --- a/TAO/tao/IIOP_Endpoint.cpp +++ b/TAO/tao/IIOP_Endpoint.cpp @@ -3,12 +3,10 @@ #include "tao/IIOP_Endpoint.h" -#include "tao/IIOP_Connection_Handler.h" #include "tao/debug.h" ACE_RCSID(tao, IIOP_Endpoint, "$Id$") - #if !defined (__ACE_INLINE__) # include "tao/IIOP_Endpoint.i" #endif /* __ACE_INLINE__ */ diff --git a/TAO/tao/IIOP_Transport.cpp b/TAO/tao/IIOP_Transport.cpp index 16be7c5eb40..5ee3fe1743f 100644 --- a/TAO/tao/IIOP_Transport.cpp +++ b/TAO/tao/IIOP_Transport.cpp @@ -66,14 +66,16 @@ TAO_IIOP_Transport::event_handler_i (void) } ssize_t -TAO_IIOP_Transport::send_i (const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time, - size_t *bytes_transferred) +TAO_IIOP_Transport::send_i (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { - return ACE::send_n (this->connection_handler_->get_handle (), - message_block, - max_wait_time, - bytes_transferred); + ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt, + max_wait_time); + if (retval > 0) + bytes_transferred = retval; + + return retval; } ssize_t @@ -125,6 +127,21 @@ TAO_IIOP_Transport::read_process_message (ACE_Time_Value *max_wait_time, int TAO_IIOP_Transport::register_handler_i (void) { + if (TAO_debug_level > 4) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d\n", + this->id ())); + } + if (this->connection_handler_->is_registered ()) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d" + ", already registered\n", + this->id ())); + return 0; + } + // @@ It seems like this method should go away, the right reactor is // picked at object creation time. ACE_Reactor *r = this->orb_core_->reactor (); @@ -173,12 +190,8 @@ TAO_IIOP_Transport::send_message (TAO_OutputCDR &stream, if (this->messaging_object_->format_message (stream) != 0) return -1; - // Strictly speaking, should not need to loop here because the - // socket never gets set to a nonblocking mode ... some Linux - // versions seem to need it though. Leaving it costs little. - // This guarantees to send all data (bytes) or return an error. - ssize_t n = this->send_or_buffer (stub, + ssize_t n = this->send_message_i (stub, twoway, stream.begin (), max_wait_time); @@ -303,7 +316,6 @@ TAO_IIOP_Transport::tear_listen_point_list (TAO_InputCDR &cdr) return this->connection_handler_->process_listen_point_list (listen_list); } - int TAO_IIOP_Transport::process_message (void) { diff --git a/TAO/tao/IIOP_Transport.h b/TAO/tao/IIOP_Transport.h index f882ef18ce2..8525c109ded 100644 --- a/TAO/tao/IIOP_Transport.h +++ b/TAO/tao/IIOP_Transport.h @@ -64,30 +64,21 @@ public: protected: /** @name Overridden Template Methods * - * These are implementations of template methods declared by TAO_Transport. + * Please check the documentation in "tao/Transport.h" for more + * details. */ //@{ - /// Access connection_handler_ as an ACE_Event_Handler. - /// Must be called with transport's lock held. virtual ACE_Event_Handler *event_handler_i (void); - /// Write the complete Message_Block chain to the connection. - /// Must be called with transport's lock held. - virtual ssize_t send_i (const ACE_Message_Block *mblk, - const ACE_Time_Value *s = 0, - size_t *bytes_transferred = 0); + virtual ssize_t send_i (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0); - - /// Read len bytes from into buf. - /// Must be called with transport's lock held. virtual ssize_t recv_i (char *buf, size_t len, const ACE_Time_Value *s = 0); - /// Read and process the message from the connection. The processing - /// of the message is done by delegating the work to the underlying - /// messaging object virtual int read_process_message (ACE_Time_Value *max_time_value = 0, int block =0); @@ -129,11 +120,9 @@ public: TAO_Target_Specification &spec, TAO_OutputCDR &msg); - /// Initialising the messaging object virtual int messaging_init (CORBA::Octet major, CORBA::Octet minor); - /// Open the service context list and process it. virtual int tear_listen_point_list (TAO_InputCDR &cdr); //@} diff --git a/TAO/tao/Makefile b/TAO/tao/Makefile index d95897e1f8f..4125d329f3e 100644 --- a/TAO/tao/Makefile +++ b/TAO/tao/Makefile @@ -237,7 +237,12 @@ ORB_CORE_FILES = \ BiDir_Policy_i \ CodecFactory \ CodecFactory_ORBInitializer \ - CDR_Encaps_Codec + CDR_Encaps_Codec \ + Flushing_Strategy \ + Block_Flushing_Strategy \ + Reactive_Flushing_Strategy \ + Queued_Message \ + Message_Sent_Callback DYNAMIC_ANY_FILES = diff --git a/TAO/tao/ORB_Core.cpp b/TAO/tao/ORB_Core.cpp index ef5b2cbaea2..e2c5b63a693 100644 --- a/TAO/tao/ORB_Core.cpp +++ b/TAO/tao/ORB_Core.cpp @@ -35,6 +35,8 @@ #include "IORInfo.h" +#include "Flushing_Strategy.h" + #if defined(ACE_MVS) #include "ace/Codeset_IBM1047.h" #endif /* ACE_MVS */ @@ -43,10 +45,7 @@ # include "ORB_Core.i" #endif /* ! __ACE_INLINE__ */ -ACE_RCSID (TAO, - ORB_Core, - "$Id$") - +ACE_RCSID(tao, ORB_Core, "$Id$") // **************************************************************** @@ -158,6 +157,7 @@ TAO_ORB_Core::TAO_ORB_Core (const char *orbid) parser_registry_ (), transport_cache_ (), bidir_giop_policy_ (0) + , flushing_strategy_ (0) { #if defined(ACE_MVS) ACE_NEW (this->from_iso8859_, ACE_IBM1047_ISO8859); @@ -221,6 +221,8 @@ TAO_ORB_Core::TAO_ORB_Core (const char *orbid) TAO_ORB_Core::~TAO_ORB_Core (void) { + delete this->flushing_strategy_; + ACE_OS::free (this->orbid_); delete this->from_iso8859_; @@ -1041,6 +1043,9 @@ TAO_ORB_Core::init (int &argc, char *argv[], CORBA::Environment &ACE_TRY_ENV) // init the ORB core's pointer this->protocol_factories_ = trf->get_protocol_factories (); + // Initialize the flushing strategy + this->flushing_strategy_ = trf->create_flushing_strategy (); + // Now that we have a complete list of available protocols and their // related factory objects, set default policies and initialize the // registries! @@ -1945,9 +1950,15 @@ TAO_ORB_Core::run (ACE_Time_Value *tv, if (TAO_debug_level >= 3) ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - blocking on handle events\n"))); + ACE_TEXT ("TAO (%P|%t) - calling handle_events\n"))); + result = r->handle_events (tv); + if (TAO_debug_level >= 3) + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("TAO (%P|%t) - handle_events returns %d\n"), + result)); + if (result == -1) { // An error, terminate the loop diff --git a/TAO/tao/ORB_Core.h b/TAO/tao/ORB_Core.h index c27a6c4b305..859166d146e 100644 --- a/TAO/tao/ORB_Core.h +++ b/TAO/tao/ORB_Core.h @@ -82,6 +82,8 @@ class TAO_Message_State_Factory; class TAO_ServerRequest; class TAO_Protocols_Hooks; +class TAO_Flushing_Strategy; + #if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) class TAO_Eager_Buffering_Sync_Strategy; @@ -840,13 +842,21 @@ public: CORBA::Boolean bidir_giop_policy (void); void bidir_giop_policy (CORBA::Boolean); - - /// Return the table that maps object key/name to de-stringified /// object reference. It is needed for supporting local objects in /// the resolve_initial_references() mechanism. TAO_Object_Ref_Table &object_ref_table (void); + /// Return the flushing strategy + /** + * The flushing strategy is created by the resource factory, and it + * is used by the ORB to control the mechanism used to flush the + * outgoing data queues. + * The flushing strategies are stateless, therefore, there is only + * one per ORB. + */ + TAO_Flushing_Strategy *flushing_strategy (void); + protected: /// Destructor is protected since the ORB Core is a reference @@ -1185,6 +1195,9 @@ protected: /// Bir Dir GIOP policy value CORBA::Boolean bidir_giop_policy_; + + /// Hold the flushing strategy + TAO_Flushing_Strategy *flushing_strategy_; }; // **************************************************************** diff --git a/TAO/tao/ORB_Core.i b/TAO/tao/ORB_Core.i index b84892c001d..06aa46dbb36 100644 --- a/TAO/tao/ORB_Core.i +++ b/TAO/tao/ORB_Core.i @@ -47,6 +47,11 @@ TAO_ORB_Core::object_ref_table (void) return this->object_ref_table_; } +ACE_INLINE TAO_Flushing_Strategy * +TAO_ORB_Core::flushing_strategy (void) +{ + return this->flushing_strategy_; +} ACE_INLINE CORBA::Boolean TAO_ORB_Core::service_profile_selection (TAO_MProfile &mprofile, diff --git a/TAO/tao/Resource_Factory.h b/TAO/tao/Resource_Factory.h index 94d5d114952..2e434c08eb6 100644 --- a/TAO/tao/Resource_Factory.h +++ b/TAO/tao/Resource_Factory.h @@ -32,6 +32,8 @@ class TAO_Connector_Registry; class TAO_Reactor_Registry; class TAO_Priority_Mapping; +class TAO_Flushing_Strategy; + // **************************************************************** class TAO_Export TAO_Protocol_Item @@ -181,6 +183,10 @@ public: /// Creates the lock for the lock needed in the Cache Map virtual ACE_Lock *create_cached_connection_lock (void); + /// Creates the flushing strategy. The new instance is owned by the + /// caller. + virtual TAO_Flushing_Strategy *create_flushing_strategy (void) = 0; + protected: /** * Loads the default protocols. This method is used so that the diff --git a/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp b/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp index 14236742606..a2aa21eda6b 100644 --- a/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp +++ b/TAO/tao/Strategies/SHMIOP_Connection_Handler.cpp @@ -22,8 +22,6 @@ ACE_RCSID(Strategies, SHMIOP_Connect, "$Id$") - - TAO_SHMIOP_Connection_Handler::TAO_SHMIOP_Connection_Handler (ACE_Thread_Manager *t) : TAO_SHMIOP_SVC_HANDLER (t, 0 , 0), TAO_Connection_Handler (0), @@ -57,23 +55,8 @@ TAO_SHMIOP_Connection_Handler::TAO_SHMIOP_Connection_Handler (TAO_ORB_Core *orb_ TAO_SHMIOP_Connection_Handler::~TAO_SHMIOP_Connection_Handler (void) { - if (this->transport () != 0) - { - // If the socket has not already been closed. - if (this->get_handle () != ACE_INVALID_HANDLE) - { - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (); - } - else - { - // Dequeue messages and delete message blocks. - this->transport ()->dequeue_all (); - } - } } - int TAO_SHMIOP_Connection_Handler::open (void*) { @@ -211,9 +194,6 @@ TAO_SHMIOP_Connection_Handler::handle_close (ACE_HANDLE handle, // Close the handle.. if (this->get_handle () != ACE_INVALID_HANDLE) { - // Send the buffered messages first - this->transport ()->send_buffered_messages (); - // Mark the entry as invalid this->transport ()->mark_invalid (); @@ -237,28 +217,17 @@ TAO_SHMIOP_Connection_Handler::fetch_handle (void) return this->get_handle (); } - int TAO_SHMIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, const void *) { - // This method is called when buffering timer expires. - // - ACE_Time_Value *max_wait_time = 0; - - TAO_Stub *stub = 0; - int has_timeout; - this->orb_core ()->call_timeout_hook (stub, - has_timeout, - *max_wait_time); - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (max_wait_time); + if (this->transport ()->handle_output () == -1) + return -1; return 0; } - int TAO_SHMIOP_Connection_Handler::add_transport_to_cache (void) { diff --git a/TAO/tao/Strategies/SHMIOP_Transport.cpp b/TAO/tao/Strategies/SHMIOP_Transport.cpp index 0702b07e05f..148dd75a02e 100644 --- a/TAO/tao/Strategies/SHMIOP_Transport.cpp +++ b/TAO/tao/Strategies/SHMIOP_Transport.cpp @@ -1,14 +1,10 @@ // This may look like C, but it's really -*- C++ -*- // $Id$ - #include "SHMIOP_Transport.h" #if defined (TAO_HAS_SHMIOP) && (TAO_HAS_SHMIOP != 0) -ACE_RCSID (Strategies, SHMIOP_Transport, "$Id$") - - #include "SHMIOP_Connection_Handler.h" #include "SHMIOP_Profile.h" #include "tao/Timeprobe.h" @@ -27,6 +23,7 @@ ACE_RCSID (Strategies, SHMIOP_Transport, "$Id$") # include "SHMIOP_Transport.i" #endif /* ! __ACE_INLINE__ */ +ACE_RCSID (Strategies, SHMIOP_Transport, "$Id$") TAO_SHMIOP_Transport::TAO_SHMIOP_Transport (TAO_SHMIOP_Connection_Handler *handler, TAO_ORB_Core *orb_core, @@ -62,12 +59,23 @@ TAO_SHMIOP_Transport::event_handler_i (void) } ssize_t -TAO_SHMIOP_Transport::send_i (const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time, - size_t *) +TAO_SHMIOP_Transport::send_i (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { - return this->connection_handler_->peer ().send (message_block, - max_wait_time); + bytes_transferred = 0; + for (int i = 0; i < iovcnt; ++i) + { + ssize_t retval = + this->connection_handler_->peer ().send (iov[i].iov_base, + iov[i].iov_len, + max_wait_time); + if (retval > 0) + bytes_transferred += retval; + if (retval <= 0) + return retval; + } + return bytes_transferred; } ssize_t @@ -119,6 +127,21 @@ TAO_SHMIOP_Transport::read_process_message (ACE_Time_Value *max_wait_time, int TAO_SHMIOP_Transport::register_handler_i (void) { + if (TAO_debug_level > 4) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d\n", + this->id ())); + } + if (this->connection_handler_->is_registered ()) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d" + ", already registered\n", + this->id ())); + return 0; + } + // @@ It seems like this method should go away, the right reactor is // picked at object creation time. ACE_Reactor *r = this->orb_core_->reactor (); @@ -172,7 +195,7 @@ TAO_SHMIOP_Transport::send_message (TAO_OutputCDR &stream, // versions seem to need it though. Leaving it costs little. // This guarantees to send all data (bytes) or return an error. - ssize_t n = this->send_or_buffer (stub, + ssize_t n = this->send_message_i (stub, twoway, stream.begin (), max_wait_time); diff --git a/TAO/tao/Strategies/SHMIOP_Transport.h b/TAO/tao/Strategies/SHMIOP_Transport.h index 5c6f4e84176..e99ed9d6380 100644 --- a/TAO/tao/Strategies/SHMIOP_Transport.h +++ b/TAO/tao/Strategies/SHMIOP_Transport.h @@ -1,5 +1,5 @@ // This may look like C, but it's really -*- C++ -*- -// $Id$ + // =================================================================== /** * @file SHMIOP_Transport.h @@ -10,6 +10,7 @@ * @author Modified by Balachandran Natarajan */ // =================================================================== + #ifndef TAO_SHMIOP_TRANSPORT_H #define TAO_SHMIOP_TRANSPORT_H #include "ace/pre.h" @@ -65,9 +66,9 @@ protected: virtual ACE_Event_Handler *event_handler_i (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (const ACE_Message_Block *mblk, - const ACE_Time_Value *s = 0, - size_t *bytes_transferred = 0); + virtual ssize_t send_i (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, diff --git a/TAO/tao/Strategies/UIOP_Connection_Handler.cpp b/TAO/tao/Strategies/UIOP_Connection_Handler.cpp index 378855bbadb..0141c6a0916 100644 --- a/TAO/tao/Strategies/UIOP_Connection_Handler.cpp +++ b/TAO/tao/Strategies/UIOP_Connection_Handler.cpp @@ -4,6 +4,8 @@ #if TAO_HAS_UIOP == 1 +#include "UIOP_Transport.h" +#include "UIOP_Endpoint.h" #include "tao/debug.h" #include "tao/ORB_Core.h" #include "tao/ORB.h" @@ -11,8 +13,8 @@ #include "tao/Timeprobe.h" #include "tao/Server_Strategy_Factory.h" #include "tao/Messaging_Policy_i.h" -#include "UIOP_Endpoint.h" #include "tao/Base_Transport_Property.h" +#include "tao/GIOP_Message_Lite.h" #if !defined (__ACE_INLINE__) # include "UIOP_Connection_Handler.inl" @@ -22,8 +24,6 @@ ACE_RCSID(Strategies, UIOP_Connect, "$Id$") #include "tao/GIOP_Message_Lite.h" - - TAO_UIOP_Connection_Handler::TAO_UIOP_Connection_Handler (ACE_Thread_Manager *t) : TAO_UIOP_SVC_HANDLER (t, 0 , 0), TAO_Connection_Handler (0), @@ -60,23 +60,8 @@ TAO_UIOP_Connection_Handler::TAO_UIOP_Connection_Handler (TAO_ORB_Core *orb_core TAO_UIOP_Connection_Handler::~TAO_UIOP_Connection_Handler (void) { - if (this->transport () != 0) { - // If the socket has not already been closed. - if (this->get_handle () != ACE_INVALID_HANDLE) - { - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (); - } - else - { - // Dequeue messages and delete message blocks. - this->transport ()->dequeue_all (); - } - } } - - int TAO_UIOP_Connection_Handler::open (void*) { @@ -193,9 +178,6 @@ TAO_UIOP_Connection_Handler::handle_close (ACE_HANDLE handle, // Close the handle.. if (this->get_handle () != ACE_INVALID_HANDLE) { - // Send the buffered messages first - this->transport ()->send_buffered_messages (); - // Mark the entry as invalid this->transport ()->mark_invalid (); @@ -224,23 +206,13 @@ int TAO_UIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &, const void *) { - // This method is called when buffering timer expires. - // - ACE_Time_Value *max_wait_time = 0; - - TAO_Stub *stub = 0; - int has_timeout; - this->orb_core ()->call_timeout_hook (stub, - has_timeout, - *max_wait_time); - // Cannot deal with errors, and therefore they are ignored. - this->transport ()->send_buffered_messages (max_wait_time); + if (this->transport ()->handle_output () == -1) + return -1; return 0; } - int TAO_UIOP_Connection_Handler::add_transport_to_cache (void) { diff --git a/TAO/tao/Strategies/UIOP_Transport.cpp b/TAO/tao/Strategies/UIOP_Transport.cpp index 5a438d9f994..c5f7486220e 100644 --- a/TAO/tao/Strategies/UIOP_Transport.cpp +++ b/TAO/tao/Strategies/UIOP_Transport.cpp @@ -5,10 +5,6 @@ #if TAO_HAS_UIOP == 1 - -ACE_RCSID (Strategies, UIOP_Transport, "$Id$") - - #include "UIOP_Connection_Handler.h" #include "UIOP_Profile.h" #include "tao/Timeprobe.h" @@ -26,7 +22,7 @@ ACE_RCSID (Strategies, UIOP_Transport, "$Id$") # include "UIOP_Transport.i" #endif /* ! __ACE_INLINE__ */ - +ACE_RCSID (Strategies, UIOP_Transport, "$Id$") TAO_UIOP_Transport::TAO_UIOP_Transport (TAO_UIOP_Connection_Handler *handler, TAO_ORB_Core *orb_core, @@ -62,14 +58,16 @@ TAO_UIOP_Transport::event_handler_i (void) } ssize_t -TAO_UIOP_Transport::send_i (const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time, - size_t *bytes_transferred) +TAO_UIOP_Transport::send_i (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *max_wait_time) { - return ACE::send_n (this->connection_handler_->get_handle (), - message_block, - max_wait_time, - bytes_transferred); + ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt, + max_wait_time); + if (retval > 0) + bytes_transferred = retval; + + return retval; } ssize_t @@ -120,6 +118,21 @@ TAO_UIOP_Transport::read_process_message (ACE_Time_Value *max_wait_time, int TAO_UIOP_Transport::register_handler_i (void) { + if (TAO_debug_level > 4) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d\n", + this->id ())); + } + if (this->connection_handler_->is_registered ()) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - IIOP_Transport::register_handler %d" + ", already registered\n", + this->id ())); + return 0; + } + // @@ It seems like this method should go away, the right reactor is // picked at object creation time. ACE_Reactor *r = this->orb_core_->reactor (); @@ -173,7 +186,7 @@ TAO_UIOP_Transport::send_message (TAO_OutputCDR &stream, // versions seem to need it though. Leaving it costs little. // This guarantees to send all data (bytes) or return an error. - ssize_t n = this->send_or_buffer (stub, + ssize_t n = this->send_message_i (stub, twoway, stream.begin (), max_wait_time); diff --git a/TAO/tao/Strategies/UIOP_Transport.h b/TAO/tao/Strategies/UIOP_Transport.h index b95eeec6e89..b9181e12080 100644 --- a/TAO/tao/Strategies/UIOP_Transport.h +++ b/TAO/tao/Strategies/UIOP_Transport.h @@ -1,13 +1,13 @@ // This may look like C, but it's really -*- C++ -*- -// + // =================================================================== /** * @file UIOP_Transport.h * * $Id$ * - * @author Originally by Fred Kuhns and Ossama - * Othman + * @author Originally by Fred Kuhns + * @author Ossama Othman * @author Modified by Balachandran Natarajan */ // =================================================================== @@ -70,9 +70,9 @@ protected: virtual ACE_Event_Handler *event_handler_i (void); /// Write the complete Message_Block chain to the connection. - virtual ssize_t send_i (const ACE_Message_Block *mblk, - const ACE_Time_Value *s = 0, - size_t *bytes_transferred = 0); + virtual ssize_t send_i (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, diff --git a/TAO/tao/Sync_Strategies.cpp b/TAO/tao/Sync_Strategies.cpp index d09bcd1a5a5..b74e06bc096 100644 --- a/TAO/tao/Sync_Strategies.cpp +++ b/TAO/tao/Sync_Strategies.cpp @@ -10,133 +10,53 @@ # include "tao/Sync_Strategies.i" #endif /* ! __ACE_INLINE__ */ -TAO_Sync_Strategy::~TAO_Sync_Strategy (void) -{ -} +ACE_RCSID(tao, Sync_Strategies, "$Id$") -ssize_t -TAO_Transport_Sync_Strategy::send (TAO_Transport &transport, - TAO_Stub &, - const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time) +TAO_Sync_Strategy::~TAO_Sync_Strategy (void) { - // Immediate delegation to the transport. - return transport.send (message_block, - max_wait_time); } -#if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) +// **************************************************************** -ssize_t -TAO_Delayed_Buffering_Sync_Strategy::send (TAO_Transport &transport, - TAO_Stub &stub, - const ACE_Message_Block *mb, - const ACE_Time_Value *max_wait_time) +int +TAO_Transport_Sync_Strategy:: + must_queue (int) { - ACE_Message_Block *message_block = - ACE_const_cast (ACE_Message_Block *, mb); - - ssize_t result = 0; - - // Get the message queue from the transport. - TAO_Transport_Buffering_Queue &buffering_queue = - transport.buffering_queue (); - - // Check if there are messages already in the queue. - if (!buffering_queue.is_empty ()) - return TAO_Eager_Buffering_Sync_Strategy::send (transport, - stub, - message_block, - max_wait_time); - - // - // Otherwise there were no queued messages. We first try to send - // the message right away. - // - - // Actual network send. - size_t bytes_transferred = 0; - result = transport.send (message_block, - max_wait_time, - &bytes_transferred); - - // Cannot send completely: timed out. - if (result == -1 && - errno == ETIME) - { - if (bytes_transferred > 0) - { - // If successful in sending some of the data, reset the - // message block appropriately. - transport.reset_sent_message (message_block, - bytes_transferred); - } - - // Queue the rest. - return bytes_transferred + - TAO_Eager_Buffering_Sync_Strategy::send (transport, - stub, - message_block, - max_wait_time); - } - - // EOF or other errors. - if (result == -1 || - result == 0) - return -1; - - // Everything was successfully delivered. - return result; + return 0; } -ssize_t -TAO_Eager_Buffering_Sync_Strategy::send (TAO_Transport &transport, - TAO_Stub &stub, - const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time) +int +TAO_Transport_Sync_Strategy:: + buffering_constraints_reached (TAO_Stub *, + size_t , + size_t , + int &, + ACE_Time_Value &) { - ssize_t result = 0; - - // Get the message queue from the transport. - TAO_Transport_Buffering_Queue &buffering_queue = - transport.buffering_queue (); - - // Copy the message. - ACE_Message_Block *copy = message_block->clone (); - - // Enqueue current message. - result = buffering_queue.enqueue_tail (copy); - - // Enqueuing error. - if (result == -1) - { - // Eliminate the copy. - copy->release (); + return 0; +} - // Return error. - return -1; - } +#if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) - // Check if upper bound has been reached. - if (this->buffering_constraints_reached (transport, - stub, - buffering_queue)) - { - return transport.send_buffered_messages (max_wait_time); - } +// **************************************************************** - // Hoping that this return value is meaningful or at least - // acceptable. - return message_block->total_length (); +int +TAO_Eager_Buffering_Sync_Strategy:: + must_queue (int) +{ + return 1; } int -TAO_Eager_Buffering_Sync_Strategy::buffering_constraints_reached (TAO_Transport &transport, - TAO_Stub &stub, - TAO_Transport_Buffering_Queue &buffering_queue) +TAO_Eager_Buffering_Sync_Strategy:: + buffering_constraints_reached (TAO_Stub *stub, + size_t msg_count, + size_t total_bytes, + int &set_timer, + ACE_Time_Value &interval) { TAO_Buffering_Constraint_Policy *buffering_constraint_policy = - stub.buffering_constraint (); + stub->buffering_constraint (); if (buffering_constraint_policy == 0) return 1; @@ -147,80 +67,53 @@ TAO_Eager_Buffering_Sync_Strategy::buffering_constraints_reached (TAO_Transport TAO::BufferingConstraint buffering_constraint; buffering_constraint_policy->get_buffering_constraint (buffering_constraint); - this->timer_check (transport, - buffering_constraint); + this->timer_check (buffering_constraint, set_timer, interval); if (buffering_constraint.mode == TAO::BUFFER_FLUSH) return 1; if (ACE_BIT_ENABLED (buffering_constraint.mode, - TAO::BUFFER_MESSAGE_COUNT) && - buffering_queue.message_count () >= buffering_constraint.message_count) + TAO::BUFFER_MESSAGE_COUNT) + && msg_count >= buffering_constraint.message_count) return 1; if (ACE_BIT_ENABLED (buffering_constraint.mode, - TAO::BUFFER_MESSAGE_BYTES) && - buffering_queue.message_length () >= buffering_constraint.message_bytes) + TAO::BUFFER_MESSAGE_BYTES) + && total_bytes >= buffering_constraint.message_bytes) return 1; return 0; } void -TAO_Eager_Buffering_Sync_Strategy::timer_check (TAO_Transport &transport, - const TAO::BufferingConstraint &buffering_constraint) +TAO_Eager_Buffering_Sync_Strategy:: + timer_check (const TAO::BufferingConstraint &buffering_constraint, + int &set_timer, + ACE_Time_Value &interval) { - if (transport.buffering_timer_id () != 0) + if (!ACE_BIT_ENABLED (buffering_constraint.mode, + TAO::BUFFER_TIMEOUT)) { - // - // There is a timeout set by us, though we are not sure if we - // still need the timeout or if the timeout value is correct or - // not. - // - - // Get our reactor. - ACE_Reactor *reactor = transport.orb_core ()->reactor (); - - if (!ACE_BIT_ENABLED (buffering_constraint.mode, - TAO::BUFFER_TIMEOUT)) - { - // Timeouts are no longer needed. Cancel existing one. - reactor->cancel_timer (transport.buffering_timer_id ()); - transport.buffering_timer_id (0); - } - else - { - ACE_Time_Value timeout = - this->time_conversion (buffering_constraint.timeout); - - if (transport.buffering_timeout_value () == timeout) - { - // Timeout value is the same, nothing to be done. - } - else - { - // Timeout value has changed, reset the old timer. - reactor->reset_timer_interval (transport.buffering_timer_id (), - timeout); - } - } + set_timer = 0; + return; } - else if (ACE_BIT_ENABLED (buffering_constraint.mode, - TAO::BUFFER_TIMEOUT)) - { - // We didn't have timeouts before, but we want them now. - ACE_Time_Value timeout = - this->time_conversion (buffering_constraint.timeout); - long timer_id = transport.register_for_timer_event (0, timeout, timeout); + ACE_Time_Value timeout = + this->time_conversion (buffering_constraint.timeout); - transport.buffering_timer_id (timer_id); - transport.buffering_timeout_value (timeout); + if (interval == timeout) + { + set_timer = 0; + return; } + + set_timer = 1; + interval = timeout; } ACE_Time_Value -TAO_Eager_Buffering_Sync_Strategy::time_conversion (const TimeBase::TimeT &time) +TAO_Eager_Buffering_Sync_Strategy:: + time_conversion (const TimeBase::TimeT &time) { TimeBase::TimeT seconds = time / 10000000u; TimeBase::TimeT microseconds = (time % 10000000u) / 10; @@ -228,4 +121,14 @@ TAO_Eager_Buffering_Sync_Strategy::time_conversion (const TimeBase::TimeT &time) ACE_U64_TO_U32 (microseconds)); } +// **************************************************************** + +int +TAO_Delayed_Buffering_Sync_Strategy:: + must_queue (int queue_empty) +{ + // If the queue is empty we want to send immediately + return !queue_empty; +} + #endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ diff --git a/TAO/tao/Sync_Strategies.h b/TAO/tao/Sync_Strategies.h index 5b273dac3e5..b5f2ae4b2ee 100644 --- a/TAO/tao/Sync_Strategies.h +++ b/TAO/tao/Sync_Strategies.h @@ -27,24 +27,57 @@ #include "tao/Transport.h" #include "tao/TAOC.h" +/// Define the interface for the Queueing Strategy +/** + * The low-level I/O components in the ORB use this strategy to + * determine when messages must be queued, immediately sent or + * flushed. + * + * The strategy isolates this low-level components from the higher + * level strategies used by the application developer. + * + * @todo The class name (Sync_Strategy) is inherited from the policies + * (SyncScopePolicy), but Queueing_Strategy probably captures its + * intent better. It should be changed in a future revision of the + * ORB. + */ class TAO_Export TAO_Sync_Strategy { public: + /// Destructor virtual ~TAO_Sync_Strategy (void); - virtual ssize_t send (TAO_Transport &transport, - TAO_Stub &stub, - const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time) = 0; + /// Return 1 if a message must be queued + virtual int must_queue (int queue_empty) = 0; + + /// Return 1 if it is time to start + /** + * @param stub The object used to make the request, this is used to + * obtain the policies currently in effect for the request + * @param msg_count The number of messages currently queued + * @param total_bytes Number of bytes currently queued + * @param set_timer Returns 1 if a timer should be set to drain the + * queue + * @param interval If set_timer returns 1, this parameter contains + * the timer interval + */ + virtual int buffering_constraints_reached (TAO_Stub *stub, + size_t msg_count, + size_t total_bytes, + int &set_timer, + ACE_Time_Value &interval) = 0; }; class TAO_Export TAO_Transport_Sync_Strategy : public TAO_Sync_Strategy { public: - ssize_t send (TAO_Transport &transport, - TAO_Stub &stub, - const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time); + virtual int must_queue (int queue_empty); + + virtual int buffering_constraints_reached (TAO_Stub *stub, + size_t msg_count, + size_t total_bytes, + int &set_timer, + ACE_Time_Value &interval); }; #if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) @@ -52,28 +85,39 @@ public: class TAO_Export TAO_Eager_Buffering_Sync_Strategy : public TAO_Sync_Strategy { public: - ssize_t send (TAO_Transport &transport, - TAO_Stub &stub, - const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time); - - virtual int buffering_constraints_reached (TAO_Transport &transport, - TAO_Stub &stub, - TAO_Transport_Buffering_Queue &buffering_queue); - - void timer_check (TAO_Transport &transport, - const TAO::BufferingConstraint &buffering_constraint); - + virtual int must_queue (int queue_empty); + + virtual int buffering_constraints_reached (TAO_Stub *stub, + size_t msg_count, + size_t total_bytes, + int &set_timer, + ACE_Time_Value &interval); + +private: + /// Check if the buffering constraint includes any timeouts and + /// compute the right timeout interval if needed. + /** + * @param buffering_constraint The constraints defined by the + * application + * @param set_timer Return 1 if the timer should be set + * @param interval Return the timer interval value + */ + void timer_check (const TAO::BufferingConstraint &buffering_constraint, + int &set_timer, + ACE_Time_Value &interval); + + /// Convert from standard CORBA time units to seconds/microseconds. ACE_Time_Value time_conversion (const TimeBase::TimeT &time); }; +/// Delay the buffering decision until the transport blocks +/** + * If the queue is empty the transport will try to send immediately. + */ class TAO_Export TAO_Delayed_Buffering_Sync_Strategy : public TAO_Eager_Buffering_Sync_Strategy { public: - ssize_t send (TAO_Transport &transport, - TAO_Stub &stub, - const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time); + virtual int must_queue (int queue_empty); }; #endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ diff --git a/TAO/tao/TAO.dsp b/TAO/tao/TAO.dsp index b8e62d48e3f..ff600e2e15e 100644 --- a/TAO/tao/TAO.dsp +++ b/TAO/tao/TAO.dsp @@ -219,6 +219,10 @@ SOURCE=.\Bind_Dispatcher_Guard.cpp # End Source File # Begin Source File +SOURCE=.\Block_Flushing_Strategy.cpp +# End Source File +# Begin Source File + SOURCE=.\BoundsC.cpp # End Source File # Begin Source File @@ -379,6 +383,10 @@ SOURCE=.\FILE_Parser.cpp # End Source File # Begin Source File +SOURCE=.\Flushing_Strategy.cpp +# End Source File +# Begin Source File + SOURCE=.\GIOP_Message_Base.cpp # End Source File # Begin Source File @@ -515,6 +523,10 @@ SOURCE=.\Marshal.cpp # End Source File # Begin Source File +SOURCE=.\Message_Sent_Callback.cpp +# End Source File +# Begin Source File + SOURCE=.\Messaging_ORBInitializer.cpp # End Source File # Begin Source File @@ -675,6 +687,14 @@ SOURCE=.\Protocols_Hooks.cpp # End Source File # Begin Source File +SOURCE=.\Queued_Message.cpp +# End Source File +# Begin Source File + +SOURCE=.\Reactive_Flushing_Strategy.cpp +# End Source File +# Begin Source File + SOURCE=.\Reactor_Registry.cpp # End Source File # Begin Source File @@ -935,6 +955,10 @@ SOURCE=.\Bind_Dispatcher_Guard.h # End Source File # Begin Source File +SOURCE=.\Block_Flushing_Strategy.h +# End Source File +# Begin Source File + SOURCE=.\BoundsC.h # End Source File # Begin Source File @@ -1107,6 +1131,10 @@ SOURCE=.\FILE_Parser.h # End Source File # Begin Source File +SOURCE=.\Flushing_Strategy.h +# End Source File +# Begin Source File + SOURCE=.\giop.h # End Source File # Begin Source File @@ -1263,6 +1291,14 @@ SOURCE=.\marshal.h # End Source File # Begin Source File +SOURCE=.\Message_Sent_Callback.h +# End Source File +# Begin Source File + +SOURCE=.\Message_Sent_Callback.inl +# End Source File +# Begin Source File + SOURCE=.\Messaging_ORBInitializer.h # End Source File # Begin Source File @@ -1443,6 +1479,18 @@ SOURCE=.\Protocols_Hooks.h # End Source File # Begin Source File +SOURCE=.\Queued_Message.h +# End Source File +# Begin Source File + +SOURCE=.\Queued_Message.inl +# End Source File +# Begin Source File + +SOURCE=.\Reactive_Flushing_Strategy.h +# End Source File +# Begin Source File + SOURCE=.\Reactor_Registry.h # End Source File # Begin Source File diff --git a/TAO/tao/TAO_Static.dsp b/TAO/tao/TAO_Static.dsp index ec3f8b8cd25..800b8052230 100644 --- a/TAO/tao/TAO_Static.dsp +++ b/TAO/tao/TAO_Static.dsp @@ -151,6 +151,10 @@ SOURCE=.\Bind_Dispatcher_Guard.h # End Source File # Begin Source File +SOURCE=.\Block_Flushing_Strategy.h +# End Source File +# Begin Source File + SOURCE=.\BoundsC.h # End Source File # Begin Source File @@ -307,6 +311,10 @@ SOURCE=.\FILE_Parser.h # End Source File # Begin Source File +SOURCE=.\Flushing_Strategy.h +# End Source File +# Begin Source File + SOURCE=.\giop.h # End Source File # Begin Source File @@ -459,6 +467,10 @@ SOURCE=.\marshal.h # End Source File # Begin Source File +SOURCE=.\Message_Sent_Callback.h +# End Source File +# Begin Source File + SOURCE=.\Messaging_ORBInitializer.h # End Source File # Begin Source File @@ -639,6 +651,14 @@ SOURCE=.\Protocols_Hooks.h # End Source File # Begin Source File +SOURCE=.\Queued_Message.h +# End Source File +# Begin Source File + +SOURCE=.\Reactive_Flushing_Strategy.h +# End Source File +# Begin Source File + SOURCE=.\Reactor_Registry.h # End Source File # Begin Source File @@ -1171,6 +1191,10 @@ SOURCE=.\marshal.i # End Source File # Begin Source File +SOURCE=.\Message_Sent_Callback.inl +# End Source File +# Begin Source File + SOURCE=.\Messaging_Policy_i.i # End Source File # Begin Source File @@ -1307,6 +1331,10 @@ SOURCE=.\Profile.i # End Source File # Begin Source File +SOURCE=.\Queued_Message.inl +# End Source File +# Begin Source File + SOURCE=.\Reactor_Registry.i # End Source File # Begin Source File @@ -1547,6 +1575,10 @@ SOURCE=.\Bind_Dispatcher_Guard.cpp # End Source File # Begin Source File +SOURCE=.\Block_Flushing_Strategy.cpp +# End Source File +# Begin Source File + SOURCE=.\BoundsC.cpp # End Source File # Begin Source File @@ -1695,6 +1727,10 @@ SOURCE=.\FILE_Parser.cpp # End Source File # Begin Source File +SOURCE=.\Flushing_Strategy.cpp +# End Source File +# Begin Source File + SOURCE=.\GIOP_Message_Base.cpp # End Source File # Begin Source File @@ -1831,6 +1867,10 @@ SOURCE=.\Marshal.cpp # End Source File # Begin Source File +SOURCE=.\Message_Sent_Callback.cpp +# End Source File +# Begin Source File + SOURCE=.\Messaging_ORBInitializer.cpp # End Source File # Begin Source File @@ -1991,6 +2031,14 @@ SOURCE=.\Protocols_Hooks.cpp # End Source File # Begin Source File +SOURCE=.\Queued_Message.cpp +# End Source File +# Begin Source File + +SOURCE=.\Reactive_Flushing_Strategy.cpp +# End Source File +# Begin Source File + SOURCE=.\Reactor_Registry.cpp # End Source File # Begin Source File diff --git a/TAO/tao/Transport.cpp b/TAO/tao/Transport.cpp index 325b65e3945..730cc32fad5 100644 --- a/TAO/tao/Transport.cpp +++ b/TAO/tao/Transport.cpp @@ -11,6 +11,11 @@ #include "Stub.h" #include "Sync_Strategies.h" #include "Connection_Handler.h" +#include "Queued_Message.h" +#include "Flushing_Strategy.h" +#include "debug.h" + +#include "ace/Message_Block.h" #if !defined (__ACE_INLINE__) # include "Transport.inl" @@ -54,9 +59,9 @@ TAO_Transport::TAO_Transport (CORBA::ULong tag, , tag_ (tag) , orb_core_ (orb_core) , cache_map_entry_ (0) - , buffering_queue_ (0) - , buffering_timer_id_ (0) , bidirectional_flag_ (-1) + , head_ (0) + , tail_ (0) , id_ ((long) this) { TAO_Client_Strategy_Factory *cf = @@ -81,29 +86,65 @@ TAO_Transport::~TAO_Transport (void) delete this->tms_; this->tms_ = 0; - delete this->buffering_queue_; + TAO_Queued_Message *i = this->head_; + while (i != 0) + { + // @@ This is a good point to insert a flag to indicate that a + // CloseConnection message was successfully received. + i->connection_closed (); + + TAO_Queued_Message *tmp = i; + i = i->next (); + + tmp->destroy (); + } delete this->handler_lock_; } -ssize_t -TAO_Transport::send_or_buffer (TAO_Stub *stub, - int two_way, - const ACE_Message_Block *message_block, - const ACE_Time_Value *max_wait_time) +int +TAO_Transport::handle_output () { - - if (stub == 0 || two_way) + if (TAO_debug_level > 4) { - return this->send (message_block, max_wait_time); + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::handle_output\n", + this->id ())); } - TAO_Sync_Strategy &sync_strategy = stub->sync_strategy (); + int retval; + do + { + // The reactor is asking us to send more data, first check if + // there is a current message that needs more sending: + retval = this->send_current_message (); + + if (TAO_debug_level > 4) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::handle_output, " + "send_current_message returns %d/%d\n", + this->id (), + retval, errno)); + } - return sync_strategy.send (*this, - *stub, - message_block, - max_wait_time); + if (retval == 1) + { + // ... there is no current message or it was completely + // sent, time to check the queue.... + // ... no more messages in the queue, cancel output... + TAO_Flushing_Strategy *flushing_strategy = + this->orb_core ()->flushing_strategy (); + + flushing_strategy->cancel_output (this); + return 0; + } + // ... on Win32 we must continue until we get EWOULDBLOCK ... + } + while (retval > 0); + + // Any errors are returned directly to the Reactor + return retval; } void @@ -118,6 +159,7 @@ TAO_Transport::provide_handle (ACE_Handle_Set &handle_set) handle_set.set_bit (eh->get_handle ()); } +#if 0 ssize_t TAO_Transport::send_buffered_messages (const ACE_Time_Value *max_wait_time) { @@ -195,73 +237,376 @@ TAO_Transport::reset_sent_message (ACE_Message_Block *message_block, bytes_delivered, 0); } +#endif /* 0 */ -void -TAO_Transport::reset_queued_message (ACE_Message_Block *message_block, - size_t bytes_delivered) +static void +dump_iov (iovec *iov, int iovcnt, int id, size_t current_transfer) { - this->reset_message (message_block, - bytes_delivered, - 1); + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_message_block_chain" + " sending %d buffers\n", + id, iovcnt)); + for (int i = 0; i != iovcnt && 0 < current_transfer; ++i) + { + size_t iov_len = iov[i].iov_len; + + // Possibly a partially sent iovec entry. + if (current_transfer < iov_len) + iov_len = current_transfer; + + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_message_block_chain" + " buffer %d/%d has %d bytes\n", + id, + i, iovcnt, + iov_len)); + size_t len; + for (size_t offset = 0; offset < iov_len; offset += len) + { + len = iov_len - offset; + if (len > 512) + len = 512; + ACE_HEX_DUMP ((LM_DEBUG, + ACE_static_cast(char*,iov[i].iov_base) + offset, + len, + "TAO (%P|%t) - Transport::send_message_block_chain ")); + } + current_transfer -= iov_len; + } + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_mesage_block_chain" + " end of data\n", + id)); } -void -TAO_Transport::reset_message (ACE_Message_Block *message_block, - size_t bytes_delivered, - int queued_message) +int +TAO_Transport::send_message_block_chain (const ACE_Message_Block *message_block, + size_t &bytes_transferred, + ACE_Time_Value *timeout) { - while (bytes_delivered != 0) + bytes_transferred = 0; + + iovec iov[IOV_MAX]; + int iovcnt = 0; + + while (message_block != 0) { - // Our current message block chain. - ACE_Message_Block *current_message_block = message_block; + size_t message_block_length = + message_block->length (); - int completely_delivered_current_message_block_chain = 0; + // Check if this block has any data to be sent. + if (message_block_length > 0) + { + // Collect the data in the iovec. + iov[iovcnt].iov_base = message_block->rd_ptr (); + iov[iovcnt].iov_len = message_block_length; + + // Increment iovec counter. + iovcnt++; + + // The buffer is full make a OS call. @@ TODO find a way to + // find IOV_MAX for platforms that do not define it rather + // than simply setting IOV_MAX to some arbitrary value such + // as 16. + if (iovcnt == IOV_MAX) + { + size_t current_transfer = 0; + + ssize_t result = + this->send (iov, iovcnt, current_transfer, timeout); + + if (TAO_debug_level > 6) + { + dump_iov (iov, iovcnt, this->id (), current_transfer); + } + + // Add to total bytes transferred. + bytes_transferred += current_transfer; + + // Errors. + if (result == -1 || result == 0) + return result; + + // Reset iovec counter. + iovcnt = 0; + } + } + + // Select the next message block in the chain. + message_block = message_block->cont (); + } - while (current_message_block != 0 && - bytes_delivered != 0) + // Check for remaining buffers to be sent. This will happen when + // IOV_MAX is not a multiple of the number of message blocks. + if (iovcnt != 0) + { + size_t current_transfer = 0; + + ssize_t result = + this->send (iov, iovcnt, current_transfer, timeout); + + if (TAO_debug_level > 6) { - size_t current_message_block_length = - current_message_block->length (); + dump_iov (iov, iovcnt, this->id (), current_transfer); + } - int completely_delivered_current_message_block = - bytes_delivered >= current_message_block_length; + // Add to total bytes transferred. + bytes_transferred += current_transfer; - size_t adjustment_size = - ACE_MIN (current_message_block_length, bytes_delivered); + // Errors. + if (result == -1 || result == 0) + return result; + } - // Reset according to send size. - current_message_block->rd_ptr (adjustment_size); + // Return total bytes transferred. + return bytes_transferred; +} - // If queued message, adjust the queue. - if (queued_message) - // Hand adjust . - this->buffering_queue_->message_length ( - this->buffering_queue_->message_length () - adjustment_size); +int +TAO_Transport::send_current_message (void) +{ + ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->queue_mutex_, -1); - // Adjust . - bytes_delivered -= adjustment_size; + if (this->head_ == 0) + return 1; - if (completely_delivered_current_message_block) - { - // Next message block in the continuation chain. - current_message_block = current_message_block->cont (); + size_t bytes_transferred; + + ssize_t retval = + this->send_message_block_chain (this->head_->mb (), + bytes_transferred); + if (retval == 0) + { + // The connection was closed, return -1 to have the Reactor + // close this transport and event handler + return -1; + } + + // Because there can be a partial transfer we need to adjust the + // number of bytes sent. + this->head_->bytes_transferred (bytes_transferred); + if (this->head_->done ()) + { + // Remove the current message.... + TAO_Queued_Message *head = this->head_; + head->remove_from_list (this->head_, this->tail_); + + head->destroy (); + } + + if (retval == -1) + { + // ... timeouts and flow control are not real errors, the + // connection is still valid and we must continue sending the + // current message ... + if (errno == EWOULDBLOCK || errno == ETIME) + return 0; + + return -1; + } + + if (this->head_ == 0) + return 1; + return 0; +} + +int +TAO_Transport::send_message_i (TAO_Stub *stub, + int twoway_flag, + const ACE_Message_Block *message_block, + ACE_Time_Value *max_wait_time) +{ + TAO_Flushing_Strategy *flushing_strategy = + this->orb_core ()->flushing_strategy (); + + ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->queue_mutex_, -1); + + int queue_empty = (this->head_ == 0); + + // Let's figure out if the message should be queued without trying + // to send first: + int must_queue = 0; + if (this->head_ != 0) + must_queue = 1; + else if (!twoway_flag + && stub->sync_strategy ().must_queue (queue_empty)) + { + must_queue = 1; + } + + TAO_Queued_Message *queued_message = 0; + if (must_queue) + { + // ... simply queue the message ... + + if (TAO_debug_level > 6) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_message_i, " + "message is queued\n", + this->id ())); + } + + queued_message = + this->copy_message_block (message_block); + + queued_message->push_back (this->head_, this->tail_); + } + else + { + // ... in this case we must try to send the message first ... + + if (TAO_debug_level > 6) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_message_i, " + "trying to send the message\n", + this->id ())); + } - if (current_message_block == 0) - completely_delivered_current_message_block_chain = 1; + size_t byte_count; + + // @@ I don't think we want to hold the mutex here, however if + // we release it we need to recheck the status of the transport + // after we return... once I understand the final form for this + // code I will re-visit this decision + ssize_t n = this->send_message_block_chain (message_block, + byte_count, + max_wait_time); + if (n == 0) + return -1; // EOF + else if (n == -1) + { + // ... if this is just an EWOULDBLOCK we must schedule the + // message for later ... + if (errno != EWOULDBLOCK) + { + return -1; } } - if (completely_delivered_current_message_block_chain) + // ... let's figure out if the complete message was sent ... + if (message_block->total_length () == byte_count) + { + // Done, just return. Notice that there are no allocations + // or copies up to this point (though some fancy calling + // back and forth). + // This is the common case for the critical path, it should + // be fast. + return 0; + } + + // ... the message was only partially sent, schedule reactive + // output... + flushing_strategy->schedule_output (this); + + // ... and set it as the current message ... + if (twoway_flag) + { + // ... we are going to block, so there is no need to clone + // the message block... + // @@ It seems wasteful to allocate a TAO_Queued_Message in + // this case, but it is simpler to do it this way. + ACE_NEW_RETURN (queued_message, + TAO_Queued_Message ( + ACE_const_cast(ACE_Message_Block*,message_block), + 0), + -1); + } + else + { + queued_message = + this->copy_message_block (message_block); + if (queued_message == 0) + return -1; + } + + if (TAO_debug_level > 6) { - // Go to the next message block chain. - message_block = message_block->next (); + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_message_i, " + " queued anyway, %d bytes sent\n", + this->id (), + byte_count)); + + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_message_i, " + " queued message contains %d bytes, %d transferred\n", + this->id (), + queued_message->mb ()->total_length (), + byte_count)); + } + + queued_message->bytes_transferred (byte_count); + + if (TAO_debug_level > 6) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::send_message_i, " + " queued message still has %d bytes to go\n", + this->id (), + queued_message->mb ()->total_length ())); + } + + // ... insert at the head of the queue, we can use push_back() + // because the queue is empty ... + queued_message->push_back (this->head_, this->tail_); + } + + // ... two choices, this is a twoway request or not, if it is + // then we must only return once the complete message has been + // sent: + + if (twoway_flag) + { + // Release the mutex, other threads may modify the queue as we + // block for a long time writing out data. + ace_mon.release (); + int result = flushing_strategy->flush_message (this, queued_message); + queued_message->destroy (); + return result; + } + + // ... this is not a twoway. We must check if the buffering + // constraints have been reached, if so, then we should start + // flushing out data.... - // If queued message, adjust the queue. - if (queued_message) - // Release this . - this->dequeue_head (); + // First let's compute the size of the queue: + size_t msg_count = 0; + size_t total_bytes = 0; + for (TAO_Queued_Message *i = this->head_; i != 0; i = i->next ()) + { + msg_count++; + total_bytes += i->mb ()->total_length (); + } + + int set_timer; + ACE_Time_Value interval; + + if (stub->sync_strategy ().buffering_constraints_reached (stub, + msg_count, + total_bytes, + set_timer, + interval)) + { + ace_mon.release (); + // @@ memory management of the queued messages is getting tricky. + int result = flushing_strategy->flush_message (this, + this->tail_); + return result; + } + else + { + // ... it is not time to flush yet, but maybe we need to set a + // timer ... + if (set_timer) + { + // @@ We need to schedule the timer. We should also be + // careful not to schedule one if there is one scheduled + // already. } } + return 0; } int @@ -314,14 +659,6 @@ TAO_Transport::connection_handler_closing (void) TAO_Transport::release(this); } -#if 0 -TAO_Connection_Handler* -TAO_Transport::connection_handler (void) const -{ - return 0; -} -#endif - TAO_Transport* TAO_Transport::_duplicate (TAO_Transport* transport) { @@ -400,10 +737,30 @@ TAO_Transport::close_connection (void) this->orb_core_->transport_cache ().purge_entry (this->cache_map_entry_); } +TAO_Queued_Message * +TAO_Transport::copy_message_block (const ACE_Message_Block *message_block) +{ + size_t length = message_block->total_length (); + + // @@ Use Auto_Ptr<> to cleanup the message block, should the second + // allocation fail + ACE_Message_Block *copy; + ACE_NEW_RETURN (copy, ACE_Message_Block (length), 0); + for (const ACE_Message_Block *i = message_block; + i != 0; + i = i->cont ()) + copy->copy (i->rd_ptr (), i->length ()); + + TAO_Queued_Message *msg; + ACE_NEW_RETURN (msg, TAO_Queued_Message (copy, 1), 0); + + return msg; +} + ssize_t -TAO_Transport::send (const ACE_Message_Block *mblk, - const ACE_Time_Value *timeout, - size_t *bytes_transferred) +TAO_Transport::send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout) { ACE_MT (ACE_GUARD_RETURN (ACE_Lock, guard, @@ -423,7 +780,7 @@ TAO_Transport::send (const ACE_Message_Block *mblk, } // now call the template method - return this->send_i (mblk, timeout, bytes_transferred); + return this->send_i (iov, iovcnt, bytes_transferred, timeout); } ssize_t @@ -491,3 +848,55 @@ TAO_Transport::id (int id) { this->id_ = id; } + +int +TAO_Transport::schedule_output (void) +{ + ACE_MT (ACE_GUARD_RETURN (ACE_Lock, + guard, + *this->handler_lock_, + -1)); + + 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) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::schedule_output\n", + this->id ())); + } + + return reactor->schedule_wakeup (eh, ACE_Event_Handler::WRITE_MASK); +} + +int +TAO_Transport::cancel_output (void) +{ + ACE_MT (ACE_GUARD_RETURN (ACE_Lock, + guard, + *this->handler_lock_, + -1)); + + 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) + { + ACE_DEBUG ((LM_DEBUG, + "TAO (%P|%t) - Transport[%d]::cancel output\n", + this->id ())); + } + + return reactor->cancel_wakeup (eh, ACE_Event_Handler::WRITE_MASK); +} diff --git a/TAO/tao/Transport.h b/TAO/tao/Transport.h index 4feb9dccaed..f51102285cc 100644 --- a/TAO/tao/Transport.h +++ b/TAO/tao/Transport.h @@ -9,7 +9,6 @@ * Define the interface for the Transport component in TAO's * pluggable protocol framework. * - * * @author Fred Kuhns */ //============================================================================= @@ -23,6 +22,7 @@ #include "Exception.h" #include "Transport_Descriptor_Interface.h" #include "Transport_Cache_Manager.h" +#include "ace/Strategies.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once @@ -35,10 +35,7 @@ class TAO_Transport_Mux_Strategy; class TAO_Wait_Strategy; class TAO_Connection_Handler; -#include "ace/Message_Queue.h" -#include "ace/Strategies.h" - -typedef ACE_Message_Queue TAO_Transport_Buffering_Queue; +class TAO_Queued_Message; class TAO_Export TAO_Synch_Refcountable : private ACE_Refcountable { @@ -56,7 +53,6 @@ protected: TAO_SYNCH_MUTEX mutex_; }; - /** * @class TAO_Transport * @@ -94,10 +90,10 @@ protected: * transport may already be sending another message in a reactive * fashion. * - * Consequently, the Transport must also keep a - * current_message, if the current message is not null any - * new messages must be queued. Only once the current message is - * completely sent we can take a message out of the queue. + * Consequently, the Transport must also know if the head of the queue + * has been partially sent. In that case new messages can only follow + * the head. Only once the head is completely sent we can start + * sending new messages. * *

Waiting threads:

One or more threads can be blocked * waiting for the connection to completely send the message. @@ -145,11 +141,6 @@ protected: */ class TAO_Export TAO_Transport : private TAO_Synch_Refcountable { - - friend class TAO_Transport_Sync_Strategy; - friend class TAO_Eager_Buffering_Sync_Strategy; - friend class TAO_Delayed_Buffering_Sync_Strategy; - public: /// default creator, requres the tag value be supplied. TAO_Transport (CORBA::ULong tag, @@ -192,6 +183,17 @@ public: */ TAO_Wait_Strategy *wait_strategy (void) const; + /// Callback method to reactively drain the outgoing data queue + int handle_output (void); + + /** + * Return the TSS leader follower condition variable used in the + * Wait Strategy. Muxed Leader Follower implementation returns a + * valid condition variable, others return 0. + */ + virtual TAO_SYNCH_CONDITION *leader_follower_condition_variable (void); + +#if 0 /// Send a request or queue it for later. /** * If the right policies are set queue the request for later. @@ -235,6 +237,10 @@ public: // @@ lockme ssize_t send_buffered_messages (const ACE_Time_Value *max_wait_time = 0); + /// Send any messages that have been buffered. + ssize_t send_buffered_messages (const ACE_Time_Value *max_wait_time = 0); +#endif /* 0 */ + /** * Initialising the messaging object. This would be used by the * connector side. On the acceptor side the connection handler @@ -340,9 +346,9 @@ public: * down). In that case, it returns -1 and sets errno to * ENOENT. */ - ssize_t send (const ACE_Message_Block *mblk, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0); + ssize_t send (iovec *iov, int iovcnt, + size_t &bytes_transferred, + const ACE_Time_Value *timeout = 0); /// Read len bytes from into buf. /** @@ -429,9 +435,9 @@ protected: * bytes already on the OS I/O subsystem. * */ - virtual ssize_t send_i (const ACE_Message_Block *mblk, - const ACE_Time_Value *timeout = 0, - size_t *bytes_transferred = 0) = 0; + 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. /** @@ -589,8 +595,6 @@ public: */ virtual int reactor_signalling (void); - //@} - /// Method for the connection handler to signify that it /// is being closed and destroyed. virtual void connection_handler_closing (void); @@ -598,14 +602,18 @@ public: /// Register the associated connection handler with the reactor /// for a timer. /** - * At this point, only TAO_Eager_Buffering_Sync_Strategy::timer_check() - * uses this, and it's unclear whether it needs to stay around. But, it's here - * because it uses the associated protocol-specific connection handler, and accesses - * to that must be serialized on the internal lock. - * - * @param arg argument passed to the handle_timeout() method of the event handler + * At this point, only + * TAO_Eager_Buffering_Sync_Strategy::timer_check() + * uses this, and it's unclear whether it needs to stay around. + * But, it's here because it uses the associated protocol-specific + * connection handler, and accesses to that must be serialized on + * the internal lock. + * + * @param arg argument passed to the handle_timeout() method of the + * event handler * @param delay time interval after which the timer will expire - * @param interval time interval after which the timer will be automatically rescheduled + * @param interval time interval after which the timer will be + * automatically rescheduled * @return -1 on failure, a Reactor timer_id value on success * * @see ACE_Reactor::schedule_timer() @@ -615,7 +623,6 @@ public: const ACE_Time_Value &delay, const ACE_Time_Value &interval = ACE_Time_Value::zero); - // Maintain reference counting with these static TAO_Transport* _duplicate (TAO_Transport* transport); static void release (TAO_Transport* transport); @@ -624,15 +631,35 @@ public: int recache_transport (TAO_Transport_Descriptor_Interface* desc); /// Set/Get the Cache Map entry - void cache_map_entry ( - TAO_Transport_Cache_Manager::HASH_MAP_ENTRY *entry); + void cache_map_entry (TAO_Transport_Cache_Manager::HASH_MAP_ENTRY *entry); + TAO_Transport_Cache_Manager::HASH_MAP_ENTRY *cache_map_entry (void); + + /// 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); + + /// Sent the contents of , blocking if required by + /// the twoway flag or by the current policies in the stub. + int send_message_i (TAO_Stub *stub, + int twoway_flag, + const ACE_Message_Block *message_block, + ACE_Time_Value *max_wait_time); // TAO_Transport_Cache_Manager::HASH_MAP_ENTRY *& cache_map_entry (void); + /// Cache management void mark_invalid (void); + /// Cache management int make_idle (void); + /// Schedule handle_output() callbacks + int schedule_output (void); + + /// Cancel handle_output() callbacks + int cancel_output (void); + protected: // @@ see if one of these calls send_message() /// Remove the first message from the outgoing queue. @@ -654,6 +681,20 @@ protected: int queued_message); private: + + /// Try to send the current message. + /** + * As the outgoing data is drained this method is invoked to send as + * much of the current message as possible. + * + * Returns 0 if there is more data to send, -1 if there was an error + * and 1 if the message was completely sent. + */ + int send_current_message (void); + + /// Copy the contents of a message block into a Queued_Message + TAO_Queued_Message *copy_message_block (const ACE_Message_Block *mb); + /// Prohibited ACE_UNIMPLEMENTED_FUNC (TAO_Transport (const TAO_Transport&)) ACE_UNIMPLEMENTED_FUNC (void operator= (const TAO_Transport&)) @@ -676,6 +717,7 @@ protected: /// Strategy for waiting for the reply after sending the request. TAO_Wait_Strategy *ws_; +#if 0 /// Queue for buffering transport messages. TAO_Transport_Buffering_Queue *buffering_queue_; @@ -684,6 +726,7 @@ protected: /// Buffering timeout value. ACE_Time_Value buffering_timeout_value_; +#endif /* 0 */ /// Use to check if bidirectional info has been synchronized with /// the peer. @@ -707,6 +750,13 @@ protected: */ int bidirectional_flag_; + /// Synchronize access to the outgoing data queue + TAO_SYNCH_MUTEX queue_mutex_; + + /// Implement the outgoing data queue + TAO_Queued_Message *head_; + TAO_Queued_Message *tail_; + /// Lock that insures that activities that *might* use handler-related /// resources (such as a connection handler) get serialized. /** diff --git a/TAO/tao/Transport.inl b/TAO/tao/Transport.inl index 53059e65190..797ed0618d3 100644 --- a/TAO/tao/Transport.inl +++ b/TAO/tao/Transport.inl @@ -1,5 +1,11 @@ // $Id$ +ACE_INLINE CORBA::ULong +TAO_Transport::tag (void) const +{ + return this->tag_; +} + ACE_INLINE TAO_ORB_Core * TAO_Transport::orb_core (void) const { @@ -19,12 +25,7 @@ TAO_Transport::wait_strategy (void) const return this->ws_; } -ACE_INLINE CORBA::ULong -TAO_Transport::tag (void) const -{ - return this->tag_; -} - +#if 0 ACE_INLINE long TAO_Transport::buffering_timer_id (void) const { @@ -77,6 +78,19 @@ TAO_Transport::dequeue_head (void) message_block->release (); } +ACE_INLINE void +TAO_Transport::dequeue_all (void) +{ + // Flush all queued messages. + if (this->buffering_queue_) + { + while (!this->buffering_queue_->is_empty ()) + this->dequeue_head (); + } +} + +#endif /* 0 */ + ACE_INLINE int TAO_Transport::bidirectional_flag (void) const { @@ -89,17 +103,6 @@ TAO_Transport::bidirectional_flag (int flag) this->bidirectional_flag_ = flag; } -ACE_INLINE void -TAO_Transport::dequeue_all (void) -{ - // Flush all queued messages. - if (this->buffering_queue_) - { - while (!this->buffering_queue_->is_empty ()) - this->dequeue_head (); - } -} - /*ACE_INLINE TAO_Transport_Cache_Manager::HASH_MAP_ENTRY * TAO_Transport::cache_map_entry (void) { diff --git a/TAO/tao/Wait_On_Leader_Follower.cpp b/TAO/tao/Wait_On_Leader_Follower.cpp index 6355fde2f19..6a6bcd49fd5 100644 --- a/TAO/tao/Wait_On_Leader_Follower.cpp +++ b/TAO/tao/Wait_On_Leader_Follower.cpp @@ -36,7 +36,9 @@ TAO_Wait_On_Leader_Follower::sending_request (TAO_ORB_Core *orb_core, // Register the handler. // @@ We could probably move this somewhere else, and remove this // function totally. (Alex). - this->transport_->register_handler (); + // @@ The handler is registered already, when the connection is + // created! + // this->transport_->register_handler (); // Send the request. return this->TAO_Wait_Strategy::sending_request (orb_core, diff --git a/TAO/tao/default_resource.cpp b/TAO/tao/default_resource.cpp index 091158a3f3b..20ac7511edd 100644 --- a/TAO/tao/default_resource.cpp +++ b/TAO/tao/default_resource.cpp @@ -11,6 +11,9 @@ #include "tao/Single_Reactor.h" #include "tao/Priority_Mapping.h" +#include "tao/Reactive_Flushing_Strategy.h" +#include "tao/Block_Flushing_Strategy.h" + #include "ace/TP_Reactor.h" #include "ace/Dynamic_Service.h" #include "ace/Arg_Shifter.h" @@ -33,6 +36,7 @@ TAO_Default_Resource_Factory::TAO_Default_Resource_Factory (void) reactor_mask_signals_ (1), dynamically_allocated_reactor_ (0), cached_connection_lock_type_ (TAO_THREAD_LOCK) + , flushing_strategy_type_ (TAO_REACTIVE_FLUSHING) { } @@ -194,6 +198,7 @@ TAO_Default_Resource_Factory::init (int argc, char **argv) this->add_to_ior_parser_names (argv[curarg]); } } + else if (ACE_OS::strcasecmp (argv[curarg], "-ORBConnectionCacheLock") == 0) { @@ -210,6 +215,7 @@ TAO_Default_Resource_Factory::init (int argc, char **argv) this->cached_connection_lock_type_ = TAO_NULL_LOCK; } } + else if (ACE_OS::strcasecmp (argv[curarg], "-ORBConnectionLock") == 0) { @@ -230,6 +236,7 @@ TAO_Default_Resource_Factory::init (int argc, char **argv) this->cached_connection_lock_type_ = TAO_NULL_LOCK; } } + else if (ACE_OS::strcasecmp (argv[curarg], "-ORBConnectorLock") == 0) { @@ -251,6 +258,23 @@ TAO_Default_Resource_Factory::init (int argc, char **argv) } } + else if (ACE_OS::strcasecmp (argv[curarg], + "-ORBFlushingStrategy") == 0) + { + curarg++; + if (curarg < argc) + { + char *name = argv[curarg]; + + if (ACE_OS::strcasecmp (name, + "reactive") == 0) + this->flushing_strategy_type_ = TAO_REACTIVE_FLUSHING; + else if (ACE_OS::strcasecmp (name, + "blocking") == 0) + this->flushing_strategy_type_ = TAO_BLOCKING_FLUSHING; + } + } + return 0; } @@ -699,6 +723,21 @@ TAO_Default_Resource_Factory::create_cached_connection_lock (void) return the_lock; } +TAO_Flushing_Strategy * +TAO_Default_Resource_Factory::create_flushing_strategy (void) +{ + TAO_Flushing_Strategy *strategy = 0; + if (this->flushing_strategy_type_ == TAO_REACTIVE_FLUSHING) + ACE_NEW_RETURN (strategy, + TAO_Reactive_Flushing_Strategy, + 0); + else + ACE_NEW_RETURN (strategy, + TAO_Block_Flushing_Strategy, + 0); + return strategy; +} + TAO_Priority_Mapping * TAO_Default_Resource_Factory::get_priority_mapping (void) { diff --git a/TAO/tao/default_resource.h b/TAO/tao/default_resource.h index 300a823ac47..0d61930b49d 100644 --- a/TAO/tao/default_resource.h +++ b/TAO/tao/default_resource.h @@ -6,7 +6,8 @@ * * $Id$ * - * @author Chris CleelandCarlos O'Ryan + * @author Chris Cleeland + * @author Carlos O'Ryan */ //============================================================================= @@ -91,6 +92,7 @@ public: virtual double purge_percentage (void) const; virtual TAO_Priority_Mapping *get_priority_mapping (void); virtual ACE_Lock *create_cached_connection_lock (void); + virtual TAO_Flushing_Strategy *create_flushing_strategy (void); protected: /// Obtain the reactor implementation @@ -161,6 +163,15 @@ private: /// Type of lock used by the cached connector. Lock_Type cached_connection_lock_type_; + + enum Flushing_Strategy_Type + { + TAO_REACTIVE_FLUSHING, + TAO_BLOCKING_FLUSHING + }; + + /// Type of flushing strategy configured + int flushing_strategy_type_; }; #if defined (__ACE_INLINE__) diff --git a/TAO/tests/LongWrites/Coordinator.cpp b/TAO/tests/LongWrites/Coordinator.cpp index 8520ae19963..d9e382e42d0 100644 --- a/TAO/tests/LongWrites/Coordinator.cpp +++ b/TAO/tests/LongWrites/Coordinator.cpp @@ -5,8 +5,11 @@ ACE_RCSID(LongWrites, Coordinator, "$Id$") -Coordinator::Coordinator (void) - : shutdown_called_ (0) +Coordinator::Coordinator (CORBA::ULong initial_payload_size, + CORBA::Long test_iterations) + : initial_payload_size_ (initial_payload_size) + , test_iterations_ (test_iterations) + , shutdown_called_ (0) , pairs_count_ (0) , pairs_length_ (16) { @@ -59,12 +62,13 @@ Coordinator::start (CORBA::Environment &ACE_TRY_ENV) } } - CORBA::ULong event_size = 256 * 1024; + CORBA::ULong event_size = this->initial_payload_size_; ACE_DEBUG ((LM_DEBUG, "Running with payload = %d\n", event_size)); for (size_t j = 0; j != this->pairs_count_; ++j) { - this->pairs_[j].sender->send_events (100, event_size, + this->pairs_[j].sender->send_events (this->test_iterations_, + event_size, ACE_TRY_ENV); ACE_CHECK; } diff --git a/TAO/tests/LongWrites/Coordinator.h b/TAO/tests/LongWrites/Coordinator.h index db00336489a..9fe37a8e699 100644 --- a/TAO/tests/LongWrites/Coordinator.h +++ b/TAO/tests/LongWrites/Coordinator.h @@ -22,7 +22,8 @@ class Coordinator { public: /// Constructor - Coordinator (void); + Coordinator (CORBA::ULong initial_payload_size, + CORBA::Long test_iterations); /// Destructor virtual ~Coordinator (void); @@ -46,13 +47,27 @@ public: }; private: + /// Initial payload size + CORBA::ULong initial_payload_size_; + + /// Number of iterations performed by each server. + CORBA::Long test_iterations_; + + /// Synchronize internal data structure ACE_SYNCH_MUTEX mutex_; + /// Set to 1 once the test has shutdown int shutdown_called_; + /** @name List of pairs + * + * Implement a simple list of pairs + */ + //@{ size_t pairs_count_; size_t pairs_length_; Pair* pairs_; + //@} }; #if defined(_MSC_VER) && (_MSC_VER >= 1200) diff --git a/TAO/tests/LongWrites/Makefile b/TAO/tests/LongWrites/Makefile index 28a98f85d48..3eb7de95bae 100644 --- a/TAO/tests/LongWrites/Makefile +++ b/TAO/tests/LongWrites/Makefile @@ -18,9 +18,9 @@ IDL_FILES = Test IDL_SRC = TestC.cpp TestS.cpp BIN = server client -SRC = $(addsuffix .cpp, $(BIN) Receiver Sender Coordinator) $(IDL_SRC) +SRC = $(addsuffix .cpp, $(BIN) Receiver Sender Sender_Task Coordinator) $(IDL_SRC) -CLIENT_OBJS = client.o TestC.o TestS.o Receiver.o Sender.o +CLIENT_OBJS = client.o TestC.o TestS.o Receiver.o Sender.o Sender_Task.o SERVER_OBJS = server.o TestC.o TestS.o Coordinator.o TAO_IDLFLAGS += -Ge 1 @@ -54,1486 +54,4 @@ realclean: clean # DO NOT DELETE THIS LINE -- g++dep uses it. # DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -.obj/server.o .obj/server.so .shobj/server.o .shobj/server.so: server.cpp Coordinator.h \ - $(ACE_ROOT)/ace/pre.h TestS.h \ - TestC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/ACE_export.h \ - $(ACE_ROOT)/ace/svc_export.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(TAO_ROOT)/tao/corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.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/Malloc.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(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/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(TAO_ROOT)/tao/try_macros.h \ - $(TAO_ROOT)/tao/orbconf.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(TAO_ROOT)/tao/varbase.h \ - $(TAO_ROOT)/tao/TAO_Export.h \ - $(TAO_ROOT)/tao/Environment.h \ - $(TAO_ROOT)/tao/ORB.h \ - $(TAO_ROOT)/tao/Exception.h \ - $(ACE_ROOT)/ace/SString.h \ - $(TAO_ROOT)/tao/Services.h \ - $(TAO_ROOT)/tao/Sequence.h \ - $(TAO_ROOT)/tao/Managed_Types.h \ - $(TAO_ROOT)/tao/Sequence_T.h \ - $(TAO_ROOT)/tao/Sequence_T.cpp \ - $(TAO_ROOT)/tao/Sequence_T.i \ - $(TAO_ROOT)/tao/CORBA_String.h \ - $(TAO_ROOT)/tao/PolicyC.h \ - $(TAO_ROOT)/tao/CurrentC.h \ - $(TAO_ROOT)/tao/Object.h \ - $(TAO_ROOT)/tao/Abstract_Servant_Base.h \ - $(TAO_ROOT)/tao/Object_Proxy_Broker.h \ - $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/Encodable.h \ - $(TAO_ROOT)/tao/CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(TAO_ROOT)/tao/Typecode.h \ - $(TAO_ROOT)/tao/Any.h \ - $(TAO_ROOT)/tao/NVList.h \ - $(TAO_ROOT)/tao/Principal.h \ - $(TAO_ROOT)/tao/OctetSeqC.h \ - $(TAO_ROOT)/tao/TAO_Server_Request.h \ - $(TAO_ROOT)/tao/Tagged_Profile.h \ - $(TAO_ROOT)/tao/IOPC.h \ - $(TAO_ROOT)/tao/GIOPC.h \ - $(TAO_ROOT)/tao/Object_KeyC.h \ - $(TAO_ROOT)/tao/Service_Context.h \ - $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/LocalObject.h \ - $(TAO_ROOT)/tao/Stub.h \ - $(TAO_ROOT)/tao/Pluggable.h \ - $(TAO_ROOT)/tao/MProfile.h \ - $(TAO_ROOT)/tao/Profile.h \ - $(TAO_ROOT)/tao/Tagged_Components.h \ - $(TAO_ROOT)/tao/CONV_FRAMEC.h \ - $(TAO_ROOT)/tao/GIOP_Message_State.h \ - $(TAO_ROOT)/tao/ORB_Core.h \ - $(TAO_ROOT)/tao/Policy_Manager.h \ - $(TAO_ROOT)/tao/Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(TAO_ROOT)/tao/Protocol_Factory.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ - $(TAO_ROOT)/tao/TAO_Singleton.h \ - $(TAO_ROOT)/tao/TAO_Singleton.cpp \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(TAO_ROOT)/tao/TAO_Singleton.inl \ - $(TAO_ROOT)/tao/Adapter.h \ - $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ - $(TAO_ROOT)/tao/PortableInterceptorC.h \ - $(TAO_ROOT)/tao/DynamicC.h \ - $(TAO_ROOT)/tao/MessagingC.h \ - $(TAO_ROOT)/tao/ValueBase.h \ - $(TAO_ROOT)/tao/ValueFactory.h \ - $(TAO_ROOT)/tao/TimeBaseC.h \ - $(TAO_ROOT)/tao/PollableC.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(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.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(TAO_ROOT)/tao/Parser_Registry.h \ - $(TAO_ROOT)/tao/Service_Callbacks.h \ - $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ - $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(TAO_ROOT)/tao/Cache_Entries.h \ - $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ - $(TAO_ROOT)/tao/Endpoint.h \ - $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ - $(TAO_ROOT)/tao/Object_Ref_Table.h \ - $(TAO_ROOT)/tao/Interceptor_List.h \ - $(TAO_ROOT)/tao/RT_Policy_i.h \ - $(TAO_ROOT)/tao/RTCORBAC.h \ - $(TAO_ROOT)/tao/Protocols_Hooks.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Singleton.i \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/Client_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Server_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Invocation.h \ - $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/TAOC.h \ - $(TAO_ROOT)/tao/Priority_Mapping_Manager.h \ - $(TAO_ROOT)/tao/Priority_Mapping.h \ - $(TAO_ROOT)/tao/operation_details.h \ - $(TAO_ROOT)/tao/target_specification.h \ - $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \ - $(TAO_ROOT)/tao/ObjectIDList.h \ - $(TAO_ROOT)/tao/DomainC.h \ - $(TAO_ROOT)/tao/ClientRequestInfo.h \ - $(TAO_ROOT)/tao/StringSeqC.h \ - $(TAO_ROOT)/tao/WrongTransactionC.h \ - $(TAO_ROOT)/tao/BoundsC.h \ - $(TAO_ROOT)/tao/PortableInterceptor.h \ - $(TAO_ROOT)/tao/BiDirPolicyC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServer.h \ - $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \ - $(TAO_ROOT)/tao/PortableServer/RTPortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \ - $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \ - $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \ - TestS_T.h TestS_T.cpp TestS_T.i \ - $(ACE_ROOT)/ace/Get_Opt.h - -.obj/client.o .obj/client.so .shobj/client.o .shobj/client.so: client.cpp Sender.h \ - $(ACE_ROOT)/ace/pre.h TestS.h \ - TestC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/ACE_export.h \ - $(ACE_ROOT)/ace/svc_export.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(TAO_ROOT)/tao/corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.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/Malloc.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(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/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(TAO_ROOT)/tao/try_macros.h \ - $(TAO_ROOT)/tao/orbconf.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(TAO_ROOT)/tao/varbase.h \ - $(TAO_ROOT)/tao/TAO_Export.h \ - $(TAO_ROOT)/tao/Environment.h \ - $(TAO_ROOT)/tao/ORB.h \ - $(TAO_ROOT)/tao/Exception.h \ - $(ACE_ROOT)/ace/SString.h \ - $(TAO_ROOT)/tao/Services.h \ - $(TAO_ROOT)/tao/Sequence.h \ - $(TAO_ROOT)/tao/Managed_Types.h \ - $(TAO_ROOT)/tao/Sequence_T.h \ - $(TAO_ROOT)/tao/Sequence_T.cpp \ - $(TAO_ROOT)/tao/Sequence_T.i \ - $(TAO_ROOT)/tao/CORBA_String.h \ - $(TAO_ROOT)/tao/PolicyC.h \ - $(TAO_ROOT)/tao/CurrentC.h \ - $(TAO_ROOT)/tao/Object.h \ - $(TAO_ROOT)/tao/Abstract_Servant_Base.h \ - $(TAO_ROOT)/tao/Object_Proxy_Broker.h \ - $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/Encodable.h \ - $(TAO_ROOT)/tao/CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(TAO_ROOT)/tao/Typecode.h \ - $(TAO_ROOT)/tao/Any.h \ - $(TAO_ROOT)/tao/NVList.h \ - $(TAO_ROOT)/tao/Principal.h \ - $(TAO_ROOT)/tao/OctetSeqC.h \ - $(TAO_ROOT)/tao/TAO_Server_Request.h \ - $(TAO_ROOT)/tao/Tagged_Profile.h \ - $(TAO_ROOT)/tao/IOPC.h \ - $(TAO_ROOT)/tao/GIOPC.h \ - $(TAO_ROOT)/tao/Object_KeyC.h \ - $(TAO_ROOT)/tao/Service_Context.h \ - $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/LocalObject.h \ - $(TAO_ROOT)/tao/Stub.h \ - $(TAO_ROOT)/tao/Pluggable.h \ - $(TAO_ROOT)/tao/MProfile.h \ - $(TAO_ROOT)/tao/Profile.h \ - $(TAO_ROOT)/tao/Tagged_Components.h \ - $(TAO_ROOT)/tao/CONV_FRAMEC.h \ - $(TAO_ROOT)/tao/GIOP_Message_State.h \ - $(TAO_ROOT)/tao/ORB_Core.h \ - $(TAO_ROOT)/tao/Policy_Manager.h \ - $(TAO_ROOT)/tao/Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(TAO_ROOT)/tao/Protocol_Factory.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ - $(TAO_ROOT)/tao/TAO_Singleton.h \ - $(TAO_ROOT)/tao/TAO_Singleton.cpp \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(TAO_ROOT)/tao/TAO_Singleton.inl \ - $(TAO_ROOT)/tao/Adapter.h \ - $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ - $(TAO_ROOT)/tao/PortableInterceptorC.h \ - $(TAO_ROOT)/tao/DynamicC.h \ - $(TAO_ROOT)/tao/MessagingC.h \ - $(TAO_ROOT)/tao/ValueBase.h \ - $(TAO_ROOT)/tao/ValueFactory.h \ - $(TAO_ROOT)/tao/TimeBaseC.h \ - $(TAO_ROOT)/tao/PollableC.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(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.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(TAO_ROOT)/tao/Parser_Registry.h \ - $(TAO_ROOT)/tao/Service_Callbacks.h \ - $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ - $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(TAO_ROOT)/tao/Cache_Entries.h \ - $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ - $(TAO_ROOT)/tao/Endpoint.h \ - $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ - $(TAO_ROOT)/tao/Object_Ref_Table.h \ - $(TAO_ROOT)/tao/Interceptor_List.h \ - $(TAO_ROOT)/tao/RT_Policy_i.h \ - $(TAO_ROOT)/tao/RTCORBAC.h \ - $(TAO_ROOT)/tao/Protocols_Hooks.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Singleton.i \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/Client_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Server_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Invocation.h \ - $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/TAOC.h \ - $(TAO_ROOT)/tao/Priority_Mapping_Manager.h \ - $(TAO_ROOT)/tao/Priority_Mapping.h \ - $(TAO_ROOT)/tao/operation_details.h \ - $(TAO_ROOT)/tao/target_specification.h \ - $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \ - $(TAO_ROOT)/tao/ObjectIDList.h \ - $(TAO_ROOT)/tao/DomainC.h \ - $(TAO_ROOT)/tao/ClientRequestInfo.h \ - $(TAO_ROOT)/tao/StringSeqC.h \ - $(TAO_ROOT)/tao/WrongTransactionC.h \ - $(TAO_ROOT)/tao/BoundsC.h \ - $(TAO_ROOT)/tao/PortableInterceptor.h \ - $(TAO_ROOT)/tao/BiDirPolicyC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServer.h \ - $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \ - $(TAO_ROOT)/tao/PortableServer/RTPortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \ - $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \ - $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \ - TestS_T.h TestS_T.cpp TestS_T.i Receiver.h \ - $(ACE_ROOT)/ace/Get_Opt.h - -.obj/Receiver.o .obj/Receiver.so .shobj/Receiver.o .shobj/Receiver.so: Receiver.cpp Receiver.h \ - $(ACE_ROOT)/ace/pre.h TestS.h \ - TestC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/ACE_export.h \ - $(ACE_ROOT)/ace/svc_export.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(TAO_ROOT)/tao/corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.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/Malloc.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(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/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(TAO_ROOT)/tao/try_macros.h \ - $(TAO_ROOT)/tao/orbconf.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(TAO_ROOT)/tao/varbase.h \ - $(TAO_ROOT)/tao/TAO_Export.h \ - $(TAO_ROOT)/tao/Environment.h \ - $(TAO_ROOT)/tao/ORB.h \ - $(TAO_ROOT)/tao/Exception.h \ - $(ACE_ROOT)/ace/SString.h \ - $(TAO_ROOT)/tao/Services.h \ - $(TAO_ROOT)/tao/Sequence.h \ - $(TAO_ROOT)/tao/Managed_Types.h \ - $(TAO_ROOT)/tao/Sequence_T.h \ - $(TAO_ROOT)/tao/Sequence_T.cpp \ - $(TAO_ROOT)/tao/Sequence_T.i \ - $(TAO_ROOT)/tao/CORBA_String.h \ - $(TAO_ROOT)/tao/PolicyC.h \ - $(TAO_ROOT)/tao/CurrentC.h \ - $(TAO_ROOT)/tao/Object.h \ - $(TAO_ROOT)/tao/Abstract_Servant_Base.h \ - $(TAO_ROOT)/tao/Object_Proxy_Broker.h \ - $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/Encodable.h \ - $(TAO_ROOT)/tao/CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(TAO_ROOT)/tao/Typecode.h \ - $(TAO_ROOT)/tao/Any.h \ - $(TAO_ROOT)/tao/NVList.h \ - $(TAO_ROOT)/tao/Principal.h \ - $(TAO_ROOT)/tao/OctetSeqC.h \ - $(TAO_ROOT)/tao/TAO_Server_Request.h \ - $(TAO_ROOT)/tao/Tagged_Profile.h \ - $(TAO_ROOT)/tao/IOPC.h \ - $(TAO_ROOT)/tao/GIOPC.h \ - $(TAO_ROOT)/tao/Object_KeyC.h \ - $(TAO_ROOT)/tao/Service_Context.h \ - $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/LocalObject.h \ - $(TAO_ROOT)/tao/Stub.h \ - $(TAO_ROOT)/tao/Pluggable.h \ - $(TAO_ROOT)/tao/MProfile.h \ - $(TAO_ROOT)/tao/Profile.h \ - $(TAO_ROOT)/tao/Tagged_Components.h \ - $(TAO_ROOT)/tao/CONV_FRAMEC.h \ - $(TAO_ROOT)/tao/GIOP_Message_State.h \ - $(TAO_ROOT)/tao/ORB_Core.h \ - $(TAO_ROOT)/tao/Policy_Manager.h \ - $(TAO_ROOT)/tao/Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(TAO_ROOT)/tao/Protocol_Factory.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ - $(TAO_ROOT)/tao/TAO_Singleton.h \ - $(TAO_ROOT)/tao/TAO_Singleton.cpp \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(TAO_ROOT)/tao/TAO_Singleton.inl \ - $(TAO_ROOT)/tao/Adapter.h \ - $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ - $(TAO_ROOT)/tao/PortableInterceptorC.h \ - $(TAO_ROOT)/tao/DynamicC.h \ - $(TAO_ROOT)/tao/MessagingC.h \ - $(TAO_ROOT)/tao/ValueBase.h \ - $(TAO_ROOT)/tao/ValueFactory.h \ - $(TAO_ROOT)/tao/TimeBaseC.h \ - $(TAO_ROOT)/tao/PollableC.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(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.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(TAO_ROOT)/tao/Parser_Registry.h \ - $(TAO_ROOT)/tao/Service_Callbacks.h \ - $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ - $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(TAO_ROOT)/tao/Cache_Entries.h \ - $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ - $(TAO_ROOT)/tao/Endpoint.h \ - $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ - $(TAO_ROOT)/tao/Object_Ref_Table.h \ - $(TAO_ROOT)/tao/Interceptor_List.h \ - $(TAO_ROOT)/tao/RT_Policy_i.h \ - $(TAO_ROOT)/tao/RTCORBAC.h \ - $(TAO_ROOT)/tao/Protocols_Hooks.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Singleton.i \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/Client_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Server_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Invocation.h \ - $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/TAOC.h \ - $(TAO_ROOT)/tao/Priority_Mapping_Manager.h \ - $(TAO_ROOT)/tao/Priority_Mapping.h \ - $(TAO_ROOT)/tao/operation_details.h \ - $(TAO_ROOT)/tao/target_specification.h \ - $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \ - $(TAO_ROOT)/tao/ObjectIDList.h \ - $(TAO_ROOT)/tao/DomainC.h \ - $(TAO_ROOT)/tao/ClientRequestInfo.h \ - $(TAO_ROOT)/tao/StringSeqC.h \ - $(TAO_ROOT)/tao/WrongTransactionC.h \ - $(TAO_ROOT)/tao/BoundsC.h \ - $(TAO_ROOT)/tao/PortableInterceptor.h \ - $(TAO_ROOT)/tao/BiDirPolicyC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServer.h \ - $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \ - $(TAO_ROOT)/tao/PortableServer/RTPortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \ - $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \ - $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \ - TestS_T.h TestS_T.cpp TestS_T.i - -.obj/Sender.o .obj/Sender.so .shobj/Sender.o .shobj/Sender.so: Sender.cpp Sender.h \ - $(ACE_ROOT)/ace/pre.h TestS.h \ - TestC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/ACE_export.h \ - $(ACE_ROOT)/ace/svc_export.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(TAO_ROOT)/tao/corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.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/Malloc.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(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/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(TAO_ROOT)/tao/try_macros.h \ - $(TAO_ROOT)/tao/orbconf.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(TAO_ROOT)/tao/varbase.h \ - $(TAO_ROOT)/tao/TAO_Export.h \ - $(TAO_ROOT)/tao/Environment.h \ - $(TAO_ROOT)/tao/ORB.h \ - $(TAO_ROOT)/tao/Exception.h \ - $(ACE_ROOT)/ace/SString.h \ - $(TAO_ROOT)/tao/Services.h \ - $(TAO_ROOT)/tao/Sequence.h \ - $(TAO_ROOT)/tao/Managed_Types.h \ - $(TAO_ROOT)/tao/Sequence_T.h \ - $(TAO_ROOT)/tao/Sequence_T.cpp \ - $(TAO_ROOT)/tao/Sequence_T.i \ - $(TAO_ROOT)/tao/CORBA_String.h \ - $(TAO_ROOT)/tao/PolicyC.h \ - $(TAO_ROOT)/tao/CurrentC.h \ - $(TAO_ROOT)/tao/Object.h \ - $(TAO_ROOT)/tao/Abstract_Servant_Base.h \ - $(TAO_ROOT)/tao/Object_Proxy_Broker.h \ - $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/Encodable.h \ - $(TAO_ROOT)/tao/CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(TAO_ROOT)/tao/Typecode.h \ - $(TAO_ROOT)/tao/Any.h \ - $(TAO_ROOT)/tao/NVList.h \ - $(TAO_ROOT)/tao/Principal.h \ - $(TAO_ROOT)/tao/OctetSeqC.h \ - $(TAO_ROOT)/tao/TAO_Server_Request.h \ - $(TAO_ROOT)/tao/Tagged_Profile.h \ - $(TAO_ROOT)/tao/IOPC.h \ - $(TAO_ROOT)/tao/GIOPC.h \ - $(TAO_ROOT)/tao/Object_KeyC.h \ - $(TAO_ROOT)/tao/Service_Context.h \ - $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/LocalObject.h \ - $(TAO_ROOT)/tao/Stub.h \ - $(TAO_ROOT)/tao/Pluggable.h \ - $(TAO_ROOT)/tao/MProfile.h \ - $(TAO_ROOT)/tao/Profile.h \ - $(TAO_ROOT)/tao/Tagged_Components.h \ - $(TAO_ROOT)/tao/CONV_FRAMEC.h \ - $(TAO_ROOT)/tao/GIOP_Message_State.h \ - $(TAO_ROOT)/tao/ORB_Core.h \ - $(TAO_ROOT)/tao/Policy_Manager.h \ - $(TAO_ROOT)/tao/Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(TAO_ROOT)/tao/Protocol_Factory.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ - $(TAO_ROOT)/tao/TAO_Singleton.h \ - $(TAO_ROOT)/tao/TAO_Singleton.cpp \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(TAO_ROOT)/tao/TAO_Singleton.inl \ - $(TAO_ROOT)/tao/Adapter.h \ - $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ - $(TAO_ROOT)/tao/PortableInterceptorC.h \ - $(TAO_ROOT)/tao/DynamicC.h \ - $(TAO_ROOT)/tao/MessagingC.h \ - $(TAO_ROOT)/tao/ValueBase.h \ - $(TAO_ROOT)/tao/ValueFactory.h \ - $(TAO_ROOT)/tao/TimeBaseC.h \ - $(TAO_ROOT)/tao/PollableC.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(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.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(TAO_ROOT)/tao/Parser_Registry.h \ - $(TAO_ROOT)/tao/Service_Callbacks.h \ - $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ - $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(TAO_ROOT)/tao/Cache_Entries.h \ - $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ - $(TAO_ROOT)/tao/Endpoint.h \ - $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ - $(TAO_ROOT)/tao/Object_Ref_Table.h \ - $(TAO_ROOT)/tao/Interceptor_List.h \ - $(TAO_ROOT)/tao/RT_Policy_i.h \ - $(TAO_ROOT)/tao/RTCORBAC.h \ - $(TAO_ROOT)/tao/Protocols_Hooks.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Singleton.i \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/Client_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Server_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Invocation.h \ - $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/TAOC.h \ - $(TAO_ROOT)/tao/Priority_Mapping_Manager.h \ - $(TAO_ROOT)/tao/Priority_Mapping.h \ - $(TAO_ROOT)/tao/operation_details.h \ - $(TAO_ROOT)/tao/target_specification.h \ - $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \ - $(TAO_ROOT)/tao/ObjectIDList.h \ - $(TAO_ROOT)/tao/DomainC.h \ - $(TAO_ROOT)/tao/ClientRequestInfo.h \ - $(TAO_ROOT)/tao/StringSeqC.h \ - $(TAO_ROOT)/tao/WrongTransactionC.h \ - $(TAO_ROOT)/tao/BoundsC.h \ - $(TAO_ROOT)/tao/PortableInterceptor.h \ - $(TAO_ROOT)/tao/BiDirPolicyC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServer.h \ - $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \ - $(TAO_ROOT)/tao/PortableServer/RTPortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \ - $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \ - $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \ - TestS_T.h TestS_T.cpp TestS_T.i - -.obj/Coordinator.o .obj/Coordinator.so .shobj/Coordinator.o .shobj/Coordinator.so: Coordinator.cpp Coordinator.h \ - $(ACE_ROOT)/ace/pre.h TestS.h \ - TestC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/ACE_export.h \ - $(ACE_ROOT)/ace/svc_export.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(TAO_ROOT)/tao/corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.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/Malloc.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(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/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(TAO_ROOT)/tao/try_macros.h \ - $(TAO_ROOT)/tao/orbconf.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(TAO_ROOT)/tao/varbase.h \ - $(TAO_ROOT)/tao/TAO_Export.h \ - $(TAO_ROOT)/tao/Environment.h \ - $(TAO_ROOT)/tao/ORB.h \ - $(TAO_ROOT)/tao/Exception.h \ - $(ACE_ROOT)/ace/SString.h \ - $(TAO_ROOT)/tao/Services.h \ - $(TAO_ROOT)/tao/Sequence.h \ - $(TAO_ROOT)/tao/Managed_Types.h \ - $(TAO_ROOT)/tao/Sequence_T.h \ - $(TAO_ROOT)/tao/Sequence_T.cpp \ - $(TAO_ROOT)/tao/Sequence_T.i \ - $(TAO_ROOT)/tao/CORBA_String.h \ - $(TAO_ROOT)/tao/PolicyC.h \ - $(TAO_ROOT)/tao/CurrentC.h \ - $(TAO_ROOT)/tao/Object.h \ - $(TAO_ROOT)/tao/Abstract_Servant_Base.h \ - $(TAO_ROOT)/tao/Object_Proxy_Broker.h \ - $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/Encodable.h \ - $(TAO_ROOT)/tao/CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(TAO_ROOT)/tao/Typecode.h \ - $(TAO_ROOT)/tao/Any.h \ - $(TAO_ROOT)/tao/NVList.h \ - $(TAO_ROOT)/tao/Principal.h \ - $(TAO_ROOT)/tao/OctetSeqC.h \ - $(TAO_ROOT)/tao/TAO_Server_Request.h \ - $(TAO_ROOT)/tao/Tagged_Profile.h \ - $(TAO_ROOT)/tao/IOPC.h \ - $(TAO_ROOT)/tao/GIOPC.h \ - $(TAO_ROOT)/tao/Object_KeyC.h \ - $(TAO_ROOT)/tao/Service_Context.h \ - $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/LocalObject.h \ - $(TAO_ROOT)/tao/Stub.h \ - $(TAO_ROOT)/tao/Pluggable.h \ - $(TAO_ROOT)/tao/MProfile.h \ - $(TAO_ROOT)/tao/Profile.h \ - $(TAO_ROOT)/tao/Tagged_Components.h \ - $(TAO_ROOT)/tao/CONV_FRAMEC.h \ - $(TAO_ROOT)/tao/GIOP_Message_State.h \ - $(TAO_ROOT)/tao/ORB_Core.h \ - $(TAO_ROOT)/tao/Policy_Manager.h \ - $(TAO_ROOT)/tao/Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(TAO_ROOT)/tao/Protocol_Factory.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ - $(TAO_ROOT)/tao/TAO_Singleton.h \ - $(TAO_ROOT)/tao/TAO_Singleton.cpp \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(TAO_ROOT)/tao/TAO_Singleton.inl \ - $(TAO_ROOT)/tao/Adapter.h \ - $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ - $(TAO_ROOT)/tao/PortableInterceptorC.h \ - $(TAO_ROOT)/tao/DynamicC.h \ - $(TAO_ROOT)/tao/MessagingC.h \ - $(TAO_ROOT)/tao/ValueBase.h \ - $(TAO_ROOT)/tao/ValueFactory.h \ - $(TAO_ROOT)/tao/TimeBaseC.h \ - $(TAO_ROOT)/tao/PollableC.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(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.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(TAO_ROOT)/tao/Parser_Registry.h \ - $(TAO_ROOT)/tao/Service_Callbacks.h \ - $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ - $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(TAO_ROOT)/tao/Cache_Entries.h \ - $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ - $(TAO_ROOT)/tao/Endpoint.h \ - $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ - $(TAO_ROOT)/tao/Object_Ref_Table.h \ - $(TAO_ROOT)/tao/Interceptor_List.h \ - $(TAO_ROOT)/tao/RT_Policy_i.h \ - $(TAO_ROOT)/tao/RTCORBAC.h \ - $(TAO_ROOT)/tao/Protocols_Hooks.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Singleton.i \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/Client_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Server_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Invocation.h \ - $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/TAOC.h \ - $(TAO_ROOT)/tao/Priority_Mapping_Manager.h \ - $(TAO_ROOT)/tao/Priority_Mapping.h \ - $(TAO_ROOT)/tao/operation_details.h \ - $(TAO_ROOT)/tao/target_specification.h \ - $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \ - $(TAO_ROOT)/tao/ObjectIDList.h \ - $(TAO_ROOT)/tao/DomainC.h \ - $(TAO_ROOT)/tao/ClientRequestInfo.h \ - $(TAO_ROOT)/tao/StringSeqC.h \ - $(TAO_ROOT)/tao/WrongTransactionC.h \ - $(TAO_ROOT)/tao/BoundsC.h \ - $(TAO_ROOT)/tao/PortableInterceptor.h \ - $(TAO_ROOT)/tao/BiDirPolicyC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServer.h \ - $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \ - $(TAO_ROOT)/tao/PortableServer/RTPortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \ - $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \ - $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \ - TestS_T.h TestS_T.cpp TestS_T.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/ACE_export.h \ - $(ACE_ROOT)/ace/svc_export.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(TAO_ROOT)/tao/corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.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/Malloc.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(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/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(TAO_ROOT)/tao/try_macros.h \ - $(TAO_ROOT)/tao/orbconf.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(TAO_ROOT)/tao/varbase.h \ - $(TAO_ROOT)/tao/TAO_Export.h \ - $(TAO_ROOT)/tao/Environment.h \ - $(TAO_ROOT)/tao/ORB.h \ - $(TAO_ROOT)/tao/Exception.h \ - $(ACE_ROOT)/ace/SString.h \ - $(TAO_ROOT)/tao/Services.h \ - $(TAO_ROOT)/tao/Sequence.h \ - $(TAO_ROOT)/tao/Managed_Types.h \ - $(TAO_ROOT)/tao/Sequence_T.h \ - $(TAO_ROOT)/tao/Sequence_T.cpp \ - $(TAO_ROOT)/tao/Sequence_T.i \ - $(TAO_ROOT)/tao/CORBA_String.h \ - $(TAO_ROOT)/tao/PolicyC.h \ - $(TAO_ROOT)/tao/CurrentC.h \ - $(TAO_ROOT)/tao/Object.h \ - $(TAO_ROOT)/tao/Abstract_Servant_Base.h \ - $(TAO_ROOT)/tao/Object_Proxy_Broker.h \ - $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/Encodable.h \ - $(TAO_ROOT)/tao/CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(TAO_ROOT)/tao/Typecode.h \ - $(TAO_ROOT)/tao/Any.h \ - $(TAO_ROOT)/tao/NVList.h \ - $(TAO_ROOT)/tao/Principal.h \ - $(TAO_ROOT)/tao/OctetSeqC.h \ - $(TAO_ROOT)/tao/TAO_Server_Request.h \ - $(TAO_ROOT)/tao/Tagged_Profile.h \ - $(TAO_ROOT)/tao/IOPC.h \ - $(TAO_ROOT)/tao/GIOPC.h \ - $(TAO_ROOT)/tao/Object_KeyC.h \ - $(TAO_ROOT)/tao/Service_Context.h \ - $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/LocalObject.h \ - $(TAO_ROOT)/tao/Stub.h \ - $(TAO_ROOT)/tao/Pluggable.h \ - $(TAO_ROOT)/tao/MProfile.h \ - $(TAO_ROOT)/tao/Profile.h \ - $(TAO_ROOT)/tao/Tagged_Components.h \ - $(TAO_ROOT)/tao/CONV_FRAMEC.h \ - $(TAO_ROOT)/tao/GIOP_Message_State.h \ - $(TAO_ROOT)/tao/ORB_Core.h \ - $(TAO_ROOT)/tao/Policy_Manager.h \ - $(TAO_ROOT)/tao/Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(TAO_ROOT)/tao/Protocol_Factory.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ - $(TAO_ROOT)/tao/TAO_Singleton.h \ - $(TAO_ROOT)/tao/TAO_Singleton.cpp \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(TAO_ROOT)/tao/TAO_Singleton.inl \ - $(TAO_ROOT)/tao/Adapter.h \ - $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ - $(TAO_ROOT)/tao/PortableInterceptorC.h \ - $(TAO_ROOT)/tao/DynamicC.h \ - $(TAO_ROOT)/tao/MessagingC.h \ - $(TAO_ROOT)/tao/ValueBase.h \ - $(TAO_ROOT)/tao/ValueFactory.h \ - $(TAO_ROOT)/tao/TimeBaseC.h \ - $(TAO_ROOT)/tao/PollableC.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(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.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(TAO_ROOT)/tao/Parser_Registry.h \ - $(TAO_ROOT)/tao/Service_Callbacks.h \ - $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ - $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(TAO_ROOT)/tao/Cache_Entries.h \ - $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ - $(TAO_ROOT)/tao/Endpoint.h \ - $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ - $(TAO_ROOT)/tao/Object_Ref_Table.h \ - $(TAO_ROOT)/tao/Interceptor_List.h \ - $(TAO_ROOT)/tao/RT_Policy_i.h \ - $(TAO_ROOT)/tao/RTCORBAC.h \ - $(TAO_ROOT)/tao/Protocols_Hooks.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Singleton.i \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/Client_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Server_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Invocation.h \ - $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/TAOC.h \ - $(TAO_ROOT)/tao/Priority_Mapping_Manager.h \ - $(TAO_ROOT)/tao/Priority_Mapping.h \ - $(TAO_ROOT)/tao/operation_details.h \ - $(TAO_ROOT)/tao/target_specification.h \ - $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \ - $(TAO_ROOT)/tao/ObjectIDList.h \ - $(TAO_ROOT)/tao/DomainC.h \ - $(TAO_ROOT)/tao/ClientRequestInfo.h \ - $(TAO_ROOT)/tao/StringSeqC.h \ - $(TAO_ROOT)/tao/WrongTransactionC.h \ - $(TAO_ROOT)/tao/BoundsC.h \ - $(TAO_ROOT)/tao/PortableInterceptor.h \ - $(TAO_ROOT)/tao/BiDirPolicyC.h \ - $(TAO_ROOT)/tao/RequestInfo_Util.h \ - TestC.i - -.obj/TestS.o .obj/TestS.so .shobj/TestS.o .shobj/TestS.so: TestS.cpp TestS.h TestC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/pre.h \ - $(ACE_ROOT)/ace/ACE_export.h \ - $(ACE_ROOT)/ace/svc_export.h \ - $(ACE_ROOT)/ace/ace_wchar.h \ - $(ACE_ROOT)/ace/ace_wchar.inl \ - $(ACE_ROOT)/ace/OS_Errno.h \ - $(ACE_ROOT)/ace/OS_Export.h \ - $(ACE_ROOT)/ace/post.h \ - $(TAO_ROOT)/tao/corbafwd.h \ - $(ACE_ROOT)/ace/CDR_Base.h \ - $(ACE_ROOT)/ace/Basic_Types.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/OS_Dirent.h \ - $(ACE_ROOT)/ace/OS_String.h \ - $(ACE_ROOT)/ace/OS_Memory.h \ - $(ACE_ROOT)/ace/OS_TLI.h \ - $(ACE_ROOT)/ace/Min_Max.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/Trace.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/Malloc.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/OS_Log_Msg_Attributes.h \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.cpp \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread_Adapter.h \ - $(ACE_ROOT)/ace/Base_Thread_Adapter.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Malloc_Allocator.h \ - $(ACE_ROOT)/ace/Malloc_Base.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.cpp \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.cpp \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers_T.h \ - $(ACE_ROOT)/ace/Containers_T.cpp \ - $(ACE_ROOT)/ace/Containers_T.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(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/Message_Block_T.h \ - $(ACE_ROOT)/ace/Message_Block_T.cpp \ - $(ACE_ROOT)/ace/Message_Block_T.i \ - $(TAO_ROOT)/tao/try_macros.h \ - $(TAO_ROOT)/tao/orbconf.h \ - $(ACE_ROOT)/ace/CORBA_macros.h \ - $(TAO_ROOT)/tao/varbase.h \ - $(TAO_ROOT)/tao/TAO_Export.h \ - $(TAO_ROOT)/tao/Environment.h \ - $(TAO_ROOT)/tao/ORB.h \ - $(TAO_ROOT)/tao/Exception.h \ - $(ACE_ROOT)/ace/SString.h \ - $(TAO_ROOT)/tao/Services.h \ - $(TAO_ROOT)/tao/Sequence.h \ - $(TAO_ROOT)/tao/Managed_Types.h \ - $(TAO_ROOT)/tao/Sequence_T.h \ - $(TAO_ROOT)/tao/Sequence_T.cpp \ - $(TAO_ROOT)/tao/Sequence_T.i \ - $(TAO_ROOT)/tao/CORBA_String.h \ - $(TAO_ROOT)/tao/PolicyC.h \ - $(TAO_ROOT)/tao/CurrentC.h \ - $(TAO_ROOT)/tao/Object.h \ - $(TAO_ROOT)/tao/Abstract_Servant_Base.h \ - $(TAO_ROOT)/tao/Object_Proxy_Broker.h \ - $(TAO_ROOT)/tao/Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/Encodable.h \ - $(TAO_ROOT)/tao/CDR.h \ - $(ACE_ROOT)/ace/CDR_Stream.h \ - $(TAO_ROOT)/tao/Typecode.h \ - $(TAO_ROOT)/tao/Any.h \ - $(TAO_ROOT)/tao/NVList.h \ - $(TAO_ROOT)/tao/Principal.h \ - $(TAO_ROOT)/tao/OctetSeqC.h \ - $(TAO_ROOT)/tao/TAO_Server_Request.h \ - $(TAO_ROOT)/tao/Tagged_Profile.h \ - $(TAO_ROOT)/tao/IOPC.h \ - $(TAO_ROOT)/tao/GIOPC.h \ - $(TAO_ROOT)/tao/Object_KeyC.h \ - $(TAO_ROOT)/tao/Service_Context.h \ - $(TAO_ROOT)/tao/Remote_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/LocalObject.h \ - $(TAO_ROOT)/tao/Stub.h \ - $(TAO_ROOT)/tao/Pluggable.h \ - $(TAO_ROOT)/tao/MProfile.h \ - $(TAO_ROOT)/tao/Profile.h \ - $(TAO_ROOT)/tao/Tagged_Components.h \ - $(TAO_ROOT)/tao/CONV_FRAMEC.h \ - $(TAO_ROOT)/tao/GIOP_Message_State.h \ - $(TAO_ROOT)/tao/ORB_Core.h \ - $(TAO_ROOT)/tao/Policy_Manager.h \ - $(TAO_ROOT)/tao/Resource_Factory.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(TAO_ROOT)/tao/Protocol_Factory.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/TAO_Singleton_Manager.h \ - $(TAO_ROOT)/tao/TAO_Singleton.h \ - $(TAO_ROOT)/tao/TAO_Singleton.cpp \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.cpp \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(TAO_ROOT)/tao/TAO_Singleton.inl \ - $(TAO_ROOT)/tao/Adapter.h \ - $(TAO_ROOT)/tao/PolicyFactory_Registry.h \ - $(TAO_ROOT)/tao/PortableInterceptorC.h \ - $(TAO_ROOT)/tao/DynamicC.h \ - $(TAO_ROOT)/tao/MessagingC.h \ - $(TAO_ROOT)/tao/ValueBase.h \ - $(TAO_ROOT)/tao/ValueFactory.h \ - $(TAO_ROOT)/tao/TimeBaseC.h \ - $(TAO_ROOT)/tao/PollableC.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(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.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.cpp \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(TAO_ROOT)/tao/Parser_Registry.h \ - $(TAO_ROOT)/tao/Service_Callbacks.h \ - $(TAO_ROOT)/tao/Fault_Tolerance_Service.h \ - $(TAO_ROOT)/tao/Transport_Cache_Manager.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Functor.h \ - $(ACE_ROOT)/ace/Functor_T.h \ - $(ACE_ROOT)/ace/Functor_T.cpp \ - $(ACE_ROOT)/ace/Functor_T.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \ - $(TAO_ROOT)/tao/Cache_Entries.h \ - $(TAO_ROOT)/tao/Transport_Descriptor_Interface.h \ - $(TAO_ROOT)/tao/Endpoint.h \ - $(TAO_ROOT)/tao/Cleanup_Func_Registry.h \ - $(TAO_ROOT)/tao/Object_Ref_Table.h \ - $(TAO_ROOT)/tao/Interceptor_List.h \ - $(TAO_ROOT)/tao/RT_Policy_i.h \ - $(TAO_ROOT)/tao/RTCORBAC.h \ - $(TAO_ROOT)/tao/Protocols_Hooks.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.cpp \ - $(ACE_ROOT)/ace/Singleton.i \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/Client_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Server_Strategy_Factory.h \ - $(TAO_ROOT)/tao/Invocation.h \ - $(TAO_ROOT)/tao/Synch_Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/Reply_Dispatcher.h \ - $(TAO_ROOT)/tao/TAOC.h \ - $(TAO_ROOT)/tao/Priority_Mapping_Manager.h \ - $(TAO_ROOT)/tao/Priority_Mapping.h \ - $(TAO_ROOT)/tao/operation_details.h \ - $(TAO_ROOT)/tao/target_specification.h \ - $(TAO_ROOT)/tao/Invocation_Endpoint_Selectors.h \ - $(TAO_ROOT)/tao/ObjectIDList.h \ - $(TAO_ROOT)/tao/DomainC.h \ - $(TAO_ROOT)/tao/ClientRequestInfo.h \ - $(TAO_ROOT)/tao/StringSeqC.h \ - $(TAO_ROOT)/tao/WrongTransactionC.h \ - $(TAO_ROOT)/tao/BoundsC.h \ - $(TAO_ROOT)/tao/PortableInterceptor.h \ - $(TAO_ROOT)/tao/BiDirPolicyC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServer.h \ - $(TAO_ROOT)/tao/PortableServer/portableserver_export.h \ - $(TAO_ROOT)/tao/PortableServer/RTPortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/PortableServerC.h \ - $(TAO_ROOT)/tao/PortableServer/Servant_Base.h \ - $(TAO_ROOT)/tao/PortableServer/Collocated_Object.h \ - $(TAO_ROOT)/tao/PortableServer/ThruPOA_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/Direct_Object_Proxy_Impl.h \ - $(TAO_ROOT)/tao/PortableServer/ServerRequestInfo.h \ - TestS_T.h TestS_T.cpp TestS_T.i \ - $(TAO_ROOT)/tao/PortableServer/Object_Adapter.h \ - $(TAO_ROOT)/tao/PortableServer/Key_Adapters.h \ - $(ACE_ROOT)/ace/Map.h \ - $(ACE_ROOT)/ace/Map_T.h \ - $(ACE_ROOT)/ace/Pair.h \ - $(ACE_ROOT)/ace/Pair_T.h \ - $(ACE_ROOT)/ace/Pair_T.cpp \ - $(ACE_ROOT)/ace/Pair_T.i \ - $(ACE_ROOT)/ace/Active_Map_Manager.h \ - $(ACE_ROOT)/ace/Active_Map_Manager_T.h \ - $(ACE_ROOT)/ace/Active_Map_Manager_T.cpp \ - $(ACE_ROOT)/ace/Active_Map_Manager_T.i \ - $(ACE_ROOT)/ace/Map_T.cpp \ - $(ACE_ROOT)/ace/Map_T.i \ - $(TAO_ROOT)/tao/PortableServer/poa_macros.h \ - $(TAO_ROOT)/tao/PortableServer/Active_Object_Map.h \ - $(TAO_ROOT)/tao/PortableServer/Operation_Table.h \ - $(TAO_ROOT)/tao/RequestInfo_Util.h \ - TestS.i - # IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/TAO/tests/LongWrites/Receiver.cpp b/TAO/tests/LongWrites/Receiver.cpp index 6425de4a18a..7d7f23ea44c 100644 --- a/TAO/tests/LongWrites/Receiver.cpp +++ b/TAO/tests/LongWrites/Receiver.cpp @@ -11,6 +11,13 @@ Receiver::Receiver (void) { } +CORBA::ULong +Receiver::message_count (void) +{ + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, 0); + return this->message_count_; +} + void Receiver::dump_results () { @@ -31,5 +38,25 @@ Receiver::receive_data (const Test::Payload &payload, this->message_count_++; this->byte_count_ += payload.length (); - ACE_DEBUG ((LM_DEBUG, "Receiver::receive_data\n")); + if (this->message_count_ % 100 == 0) + { + ACE_DEBUG ((LM_DEBUG, "(%P|%t) Receiver::receive_data %d\n", + this->message_count_)); + } +} + +void +Receiver::receive_data_oneway (const Test::Payload &payload, + CORBA::Environment &ACE_TRY_ENV) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + this->receive_data (payload, ACE_TRY_ENV); +} + +Test::Payload * +Receiver::return_data (const Test::Payload &payload, + CORBA::Environment &) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return new Test::Payload (payload); } diff --git a/TAO/tests/LongWrites/Receiver.h b/TAO/tests/LongWrites/Receiver.h index 5242259d81f..8a0b50d1d05 100644 --- a/TAO/tests/LongWrites/Receiver.h +++ b/TAO/tests/LongWrites/Receiver.h @@ -27,6 +27,9 @@ public: /// Constructor Receiver (void); + /// Return the number of messages received so far + CORBA::ULong message_count (void); + /// Print out the results void dump_results (void); @@ -34,6 +37,12 @@ public: virtual void receive_data (const Test::Payload &payload, CORBA::Environment &ACE_TRY_ENV) ACE_THROW_SPEC ((CORBA::SystemException)); + virtual void receive_data_oneway (const Test::Payload &payload, + CORBA::Environment &ACE_TRY_ENV) + ACE_THROW_SPEC ((CORBA::SystemException)); + virtual Test::Payload *return_data (const Test::Payload &payload, + CORBA::Environment &ACE_TRY_ENV) + ACE_THROW_SPEC ((CORBA::SystemException)); private: ACE_SYNCH_MUTEX mutex_; diff --git a/TAO/tests/LongWrites/Sender.cpp b/TAO/tests/LongWrites/Sender.cpp index 3d7926feb3b..4381c6b5a39 100644 --- a/TAO/tests/LongWrites/Sender.cpp +++ b/TAO/tests/LongWrites/Sender.cpp @@ -5,10 +5,13 @@ ACE_RCSID(LongWrites, Sender, "$Id$") -Sender::Sender (void) - : receiver_count_ (0) +Sender::Sender (int test_type) + : test_type_ (test_type) + , receiver_count_ (0) , receiver_length_ (16) , shutdown_called_ (0) + , event_count_ (0) + , sender_task_ (this) { ACE_NEW (this->receivers_, Test::Receiver_var[this->receiver_length_]); } @@ -18,6 +21,17 @@ Sender::~Sender (void) delete[] this->receivers_; } +int +Sender::test_done (CORBA::ULong message_count) +{ + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, 0); + return + (this->event_count_ != 0 + && this->receiver_count_ != 0 + && this->shutdown_called_ != 0 + && (4 * this->receiver_count_ + * this->event_count_ <= message_count)); +} int Sender::shutdown_called (void) @@ -28,9 +42,10 @@ Sender::shutdown_called (void) void Sender::add_receiver (Test::Receiver_ptr receiver, - CORBA::Environment &) + CORBA::Environment &) ACE_THROW_SPEC ((CORBA::SystemException)) { + ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->mutex_); if (this->receiver_count_ == this->receiver_length_) { this->receiver_length_ *= 2; @@ -47,35 +62,79 @@ Sender::add_receiver (Test::Receiver_ptr receiver, void Sender::send_events (CORBA::Long event_count, - CORBA::ULong event_size, - CORBA::Environment &ACE_TRY_ENV) + CORBA::ULong event_size, + CORBA::Environment &ACE_TRY_ENV) ACE_THROW_SPEC ((CORBA::SystemException)) { + { + ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->mutex_); + this->event_count_ = event_count; + } + + ACE_DEBUG ((LM_DEBUG, + "(%P|%t) Sender::send_events - starting threads\n")); + + this->sender_task_.run_test (4, event_count, event_size); + + ACE_DEBUG ((LM_DEBUG, + "(%P|%t) Sender::send_events - threads are active\n")); +} + +int +Sender::run_test (CORBA::Long event_count, + CORBA::ULong event_size) +{ + ACE_DECLARE_NEW_CORBA_ENV; + Test::Payload payload(event_size); payload.length(event_size); + for (CORBA::ULong j = 0; j != event_size; ++j) + { + payload[j] = CORBA::Octet(j % 256); + } for (CORBA::Long i = 0; i != event_count; ++i) { - ACE_DEBUG ((LM_DEBUG, "(%P|%t) - running iteration %d\n", i)); for (size_t j = 0; j != this->receiver_count_; ++j) { ACE_TRY { - this->receivers_[j]->receive_data (payload, - ACE_TRY_ENV); - ACE_TRY_CHECK; + if (this->test_type_ == Sender::TEST_ONEWAY) + { + this->receivers_[j]->receive_data_oneway (payload, + ACE_TRY_ENV); + ACE_TRY_CHECK; + } + else if (this->test_type_ == Sender::TEST_WRITE) + { + this->receivers_[j]->receive_data (payload, + ACE_TRY_ENV); + ACE_TRY_CHECK; + } + else + { + Test::Payload_var retval = + this->receivers_[j]->return_data (payload, + ACE_TRY_ENV); + ACE_TRY_CHECK; + } + } + ACE_CATCH (CORBA::TRANSIENT, ignored) + { } ACE_CATCHANY { + return -1; } ACE_ENDTRY; } } + return 0; } void Sender::shutdown (CORBA::Environment &) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_DEBUG ((LM_DEBUG, "(%P|%t) shutting down\n")); ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->mutex_); + ACE_DEBUG ((LM_DEBUG, "(%P|%t) shutting down\n")); this->shutdown_called_ = 1; } diff --git a/TAO/tests/LongWrites/Sender.h b/TAO/tests/LongWrites/Sender.h index 0bcbea6d50e..219d108174a 100644 --- a/TAO/tests/LongWrites/Sender.h +++ b/TAO/tests/LongWrites/Sender.h @@ -7,6 +7,7 @@ #include "ace/pre.h" #include "TestS.h" +#include "Sender_Task.h" #if defined (_MSC_VER) # if (_MSC_VER >= 1200) @@ -22,14 +23,36 @@ class Sender { public: /// Constructor - Sender (void); + Sender (int test_type); /// Destructor virtual ~Sender (void); + /// Control the type of test + enum { + /// Run the test using receive_data_oneway() operations + TEST_ONEWAY, + /// Run the test using receive_data() operations + TEST_WRITE, + /// Run the test using return_data() operations + TEST_READ_WRITE, + }; + + /// Run the test in a separate thread + int run_test (CORBA::Long event_count, + CORBA::ULong event_size); + + /// Return 1 after is invoked and all the messages are + /// received. + int test_done (CORBA::ULong message_count); + /// Return 1 after is invoked int shutdown_called (void); + /// Return 1 if the test is finished, assuming + /// messages have been received by the local Receiver + int iteration_done (CORBA::ULong messsage_count); + // = The skeleton methods virtual void add_receiver (Test::Receiver_ptr receiver, CORBA::Environment &ACE_TRY_ENV) @@ -42,13 +65,25 @@ public: ACE_THROW_SPEC ((CORBA::SystemException)); private: + /// The type of test + int test_type_; + + /// Synchronize the internal state ACE_SYNCH_MUTEX mutex_; + /// Keep track of all the receivers size_t receiver_count_; size_t receiver_length_; Test::Receiver_var *receivers_; + /// Set to 1 if the shutdown() operations was called. int shutdown_called_; + + /// Setup event count + CORBA::ULong event_count_; + + /// Used to run the threads + Sender_Task sender_task_; }; #if defined(_MSC_VER) && (_MSC_VER >= 1200) diff --git a/TAO/tests/LongWrites/Test.idl b/TAO/tests/LongWrites/Test.idl index 43d2eb7c3a3..de5dcee47ae 100644 --- a/TAO/tests/LongWrites/Test.idl +++ b/TAO/tests/LongWrites/Test.idl @@ -8,7 +8,13 @@ module Test interface Receiver { /// Receive a big payload - oneway void receive_data (in Payload the_payload); + oneway void receive_data_oneway (in Payload the_payload); + + /// Receive a big payload, using a twoway + void receive_data (in Payload the_payload); + + /// Return the same data, useful to check the server side + Payload return_data (in Payload the_payload); }; interface Sender { @@ -20,7 +26,7 @@ module Test in unsigned long event_size); /// Shutdown the sender - oneway void shutdown(); + void shutdown(); }; interface Coordinator { diff --git a/TAO/tests/LongWrites/client.cpp b/TAO/tests/LongWrites/client.cpp index 5557ded8776..2c890404d66 100644 --- a/TAO/tests/LongWrites/client.cpp +++ b/TAO/tests/LongWrites/client.cpp @@ -8,23 +8,39 @@ ACE_RCSID(LongWrites, client, "$Id$") const char *ior = "file://test.ior"; +int test_type = Sender::TEST_ONEWAY; + int parse_args (int argc, char *argv[]) { - ACE_Get_Opt get_opts (argc, argv, "k:"); + ACE_Get_Opt get_opts (argc, argv, "k:t:"); int c; while ((c = get_opts ()) != -1) switch (c) { case 'k': - ior = get_opts.optarg; - break; + ior = get_opts.optarg; + break; + case 't': + if (ACE_OS_String::strcasecmp(get_opts.optarg, "ONEWAY") == 0) + test_type = Sender::TEST_ONEWAY; + else if (ACE_OS_String::strcasecmp(get_opts.optarg, "WRITE") == 0) + test_type = Sender::TEST_WRITE; + else if (ACE_OS_String::strcasecmp(get_opts.optarg, "READ_WRITE") == 0) + test_type = Sender::TEST_READ_WRITE; + else + ACE_ERROR_RETURN ((LM_ERROR, + "Unknown test type %s\n", + get_opts.optarg), 1); + break; + case '?': default: ACE_ERROR_RETURN ((LM_ERROR, "usage: %s " - "-k " + "-k " + "-t " "\n", argv [0]), -1); @@ -90,7 +106,7 @@ main (int argc, char *argv[]) Sender *sender_impl; ACE_NEW_RETURN (sender_impl, - Sender, + Sender (test_type), 1); PortableServer::ServantBase_var sender_owner_transfer(sender_impl); @@ -105,18 +121,38 @@ main (int argc, char *argv[]) ACE_TRY_ENV); ACE_TRY_CHECK; - while (!sender_impl->shutdown_called ()) + for (int i = 0; i != 600; ++i) { ACE_Time_Value tv(1, 0); orb->run (tv, ACE_TRY_ENV); ACE_TRY_CHECK; + + CORBA::ULong message_count = + receiver_impl->message_count (); + if (sender_impl->test_done (message_count)) + break; } + ACE_DEBUG ((LM_DEBUG, "(%P|%t) - client event loop done\n")); + + ACE_Thread_Manager::instance ()->wait (); + + ACE_DEBUG ((LM_DEBUG, + "(%P|%t) client - threads finished\n")); root_poa->destroy (1, 1, ACE_TRY_ENV); ACE_TRY_CHECK; orb->destroy (ACE_TRY_ENV); ACE_TRY_CHECK; + + CORBA::ULong message_count = + receiver_impl->message_count (); + if (!sender_impl->test_done (message_count)) + { + ACE_ERROR ((LM_ERROR, + "ERROR: missing messages, only received %d\n", + message_count)); + } } ACE_CATCHANY { @@ -126,5 +162,6 @@ main (int argc, char *argv[]) } ACE_ENDTRY; + ACE_DEBUG ((LM_DEBUG, "(%P|%t) - client finished\n")); return 0; } diff --git a/TAO/tests/LongWrites/run_test.pl b/TAO/tests/LongWrites/run_test.pl index 71eafcca0b4..8b6f21474a8 100755 --- a/TAO/tests/LongWrites/run_test.pl +++ b/TAO/tests/LongWrites/run_test.pl @@ -7,54 +7,76 @@ eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' use lib '../../../bin'; use PerlACE::Run_Test; +use Getopt::Std; + +local ($opt_i, $opt_p); + +if (!getopts ('i:p:')) { + print "Usage: run_test.pl [-p payload_size] [-i iterations]\n"; + exit 1; +} + +my $server_args = ""; +if (defined $opt_i) { + $server_args .= " -i ".$opt_i; +} +if (defined $opt_p) { + $server_args .= " -p ".$opt_p; +} $iorfile = PerlACE::LocalFile ("server.ior"); -unlink $iorfile; -$SV = new PerlACE::Process ("server", "-o $iorfile"); -$CL1 = new PerlACE::Process ("client", " -k file://$iorfile "); -$CL2 = new PerlACE::Process ("client", " -k file://$iorfile "); -$CL3 = new PerlACE::Process ("client", " -k file://$iorfile "); +foreach my $i ("ONEWAY") { # , "WRITE", "READ_WRITE") { + + print "================ Running test $i ================\n"; + + + unlink $iorfile; + $SV = new PerlACE::Process ("server", "-o $iorfile $server_args"); + $CL1 = new PerlACE::Process ("client", " -k file://$iorfile -t $i"); + $CL2 = new PerlACE::Process ("client", " -k file://$iorfile -t $i"); + $CL3 = new PerlACE::Process ("client", " -k file://$iorfile -t $i"); -$SV->Spawn (); + $SV->Spawn (); -if (PerlACE::waitforfile_timed ($iorfile, 5) == -1) { + if (PerlACE::waitforfile_timed ($iorfile, 5) == -1) { print STDERR "ERROR: cannot find file <$iorfile>\n"; $SV->Kill (); $SV->TimedWait (1); exit 1; -} + } -$CL1->Spawn (60); -$CL2->Spawn (60); -$CL3->Spawn (60); + $CL1->Spawn (1200); + $CL2->Spawn (1200); + $CL3->Spawn (1200); -$client1 = $CL1->WaitKill (60); + $client1 = $CL1->WaitKill (60); -if ($client1 != 0) { + if ($client1 != 0) { print STDERR "ERROR: client 1 returned $client1\n"; $status = 1; -} + } -$client2 = $CL2->WaitKill (60); + $client2 = $CL2->WaitKill (60); -if ($client2 != 0) { + if ($client2 != 0) { print STDERR "ERROR: client 2 returned $client2\n"; $status = 1; -} + } -$client3 = $CL3->WaitKill (60); + $client3 = $CL3->WaitKill (60); -if ($client3 != 0) { + if ($client3 != 0) { print STDERR "ERROR: client 3 returned $client3\n"; $status = 1; -} + } -$server = $SV->TerminateWaitKill (5); + $server = $SV->TerminateWaitKill (5); -if ($server != 0) { + if ($server != 0) { print STDERR "ERROR: server returned $server\n"; $status = 1; + } } unlink $iorfile; diff --git a/TAO/tests/LongWrites/server.cpp b/TAO/tests/LongWrites/server.cpp index b57cafb201c..b431d67845b 100644 --- a/TAO/tests/LongWrites/server.cpp +++ b/TAO/tests/LongWrites/server.cpp @@ -8,23 +8,37 @@ ACE_RCSID(LongWrites, server, "$Id$") const char *ior_output_file = "test.ior"; +CORBA::ULong initial_event_size = 64 * 1024; +CORBA::Long test_iterations = 50; + int parse_args (int argc, char *argv[]) { - ACE_Get_Opt get_opts (argc, argv, "o:"); + ACE_Get_Opt get_opts (argc, argv, "o:p:i:"); int c; while ((c = get_opts ()) != -1) switch (c) { case 'o': - ior_output_file = get_opts.optarg; - break; + ior_output_file = get_opts.optarg; + break; + + case 'p': + initial_event_size = ACE_OS::atoi (get_opts.optarg); + break; + + case 'i': + test_iterations = ACE_OS::atoi (get_opts.optarg); + break; + case '?': default: ACE_ERROR_RETURN ((LM_ERROR, "usage: %s " - "-o " + "-o " + "-p " + "-i " "\n", argv [0]), -1); @@ -64,7 +78,8 @@ main (int argc, char *argv[]) Coordinator *coordinator_impl; ACE_NEW_RETURN (coordinator_impl, - Coordinator, + Coordinator (initial_event_size, + test_iterations), 1); PortableServer::ServantBase_var coordinator_owner_transfer(coordinator_impl); @@ -73,7 +88,7 @@ main (int argc, char *argv[]) ACE_TRY_CHECK; CORBA::String_var ior = - orb->object_to_string (coordinator.in (), ACE_TRY_ENV); + orb->object_to_string (coordinator.in (), ACE_TRY_ENV); ACE_TRY_CHECK; // If the ior_output_file exists, output the ior to it @@ -82,7 +97,7 @@ main (int argc, char *argv[]) ACE_ERROR_RETURN ((LM_ERROR, "Cannot open output file for writing IOR: %s", ior_output_file), - 1); + 1); ACE_OS::fprintf (output_file, "%s", ior.in ()); ACE_OS::fclose (output_file); diff --git a/TAO/tests/Makefile b/TAO/tests/Makefile index af18faeee15..f4655508ae2 100644 --- a/TAO/tests/Makefile +++ b/TAO/tests/Makefile @@ -60,7 +60,9 @@ DIRS = CDR \ Client_Leaks \ Server_Leaks \ Muxing \ - Hello + Hello \ + Queued_Message_Test \ + Big_Oneways ifndef TAO_ROOT TAO_ROOT = $(ACE_ROOT)/TAO diff --git a/TAO/tests/README b/TAO/tests/README index 3363e0f6ac0..fb242b1bd58 100644 --- a/TAO/tests/README +++ b/TAO/tests/README @@ -13,6 +13,10 @@ how to run the following tests: This is a simple test for AMI callback model in combination with timeouts (relative roundtrip timeout policy). + . Big_Oneways + + Stress test non-blocking I/O features in the ORB. + . Bidirectional This is a test that exercises the birectional GIOP connection -- cgit v1.2.1