Synch_Queued_Message.cpp

Go to the documentation of this file.
00001 // "Synch_Queued_Message.cpp,v 1.20 2006/05/16 12:29:30 jwillemsen Exp"
00002 
00003 #include "tao/Synch_Queued_Message.h"
00004 #include "tao/debug.h"
00005 #include "tao/ORB_Core.h"
00006 
00007 #include "ace/Malloc_T.h"
00008 #include "ace/Message_Block.h"
00009 
00010 ACE_RCSID (tao,
00011            Synch_Queued_Message,
00012            "Synch_Queued_Message.cpp,v 1.20 2006/05/16 12:29:30 jwillemsen Exp")
00013 
00014 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00015 
00016 TAO_Synch_Queued_Message::TAO_Synch_Queued_Message (
00017   const ACE_Message_Block *contents,
00018   TAO_ORB_Core *oc,
00019   ACE_Allocator *alloc,
00020   bool is_heap_allocated)
00021   : TAO_Queued_Message (oc, alloc, is_heap_allocated)
00022   , contents_ (const_cast<ACE_Message_Block*> (contents))
00023   , current_block_ (contents_)
00024 {
00025 }
00026 
00027 TAO_Synch_Queued_Message::~TAO_Synch_Queued_Message (void)
00028 {
00029 
00030 }
00031 
00032 const ACE_Message_Block *
00033 TAO_Synch_Queued_Message::current_block (void) const
00034 {
00035   return this->current_block_;
00036 }
00037 
00038 size_t
00039 TAO_Synch_Queued_Message::message_length (void) const
00040 {
00041   if (this->current_block_ == 0)
00042     {
00043       return 0;
00044     }
00045 
00046   return this->current_block_->total_length ();
00047 }
00048 
00049 int
00050 TAO_Synch_Queued_Message::all_data_sent (void) const
00051 {
00052   return this->current_block_ == 0;
00053 }
00054 
00055 void
00056 TAO_Synch_Queued_Message::fill_iov (int iovcnt_max,
00057                                     int &iovcnt,
00058                                     iovec iov[]) const
00059 {
00060   ACE_ASSERT (iovcnt_max > iovcnt);
00061 
00062   for (const ACE_Message_Block *message_block = this->current_block_;
00063        message_block != 0 && iovcnt < iovcnt_max;
00064        message_block = message_block->cont ())
00065     {
00066       size_t const message_block_length = message_block->length ();
00067 
00068       // Check if this block has any data to be sent.
00069       if (message_block_length > 0)
00070         {
00071               // Collect the data in the iovec.
00072           iov[iovcnt].iov_base = message_block->rd_ptr ();
00073           iov[iovcnt].iov_len  = static_cast<u_long> (message_block_length);
00074 
00075           // Increment iovec counter.
00076           ++iovcnt;
00077         }
00078     }
00079 }
00080 
00081 void
00082 TAO_Synch_Queued_Message::bytes_transferred (size_t &byte_count)
00083 {
00084   this->state_changed_i (TAO_LF_Event::LFS_ACTIVE);
00085 
00086   while (this->current_block_ != 0 && byte_count > 0)
00087     {
00088       size_t const l = this->current_block_->length ();
00089 
00090       if (byte_count < l)
00091         {
00092           this->current_block_->rd_ptr (byte_count);
00093           byte_count = 0;
00094           return;
00095         }
00096 
00097       byte_count -= l;
00098       this->current_block_->rd_ptr (l);
00099       this->current_block_ = this->current_block_->cont ();
00100 
00101       while (this->current_block_ != 0
00102              && this->current_block_->length () == 0)
00103         {
00104           this->current_block_ = this->current_block_->cont ();
00105         }
00106     }
00107 
00108   if (this->current_block_ == 0)
00109     this->state_changed (TAO_LF_Event::LFS_SUCCESS,
00110                          this->orb_core_->leader_follower ());
00111 }
00112 
00113 TAO_Queued_Message *
00114 TAO_Synch_Queued_Message::clone (ACE_Allocator *alloc)
00115 {
00116   TAO_Synch_Queued_Message *qm = 0;
00117 
00118   // Clone the message block.
00119   // NOTE: We wantedly do the cloning from <current_block_> instead of
00120   // starting from <contents_> since we dont want to clone blocks that
00121   // have already been sent on the wire. Waste of memory and
00122   // associated copying.
00123   ACE_Message_Block *mb = this->current_block_->clone ();
00124 
00125   if (alloc)
00126     {
00127       ACE_NEW_MALLOC_RETURN (qm,
00128                              static_cast<TAO_Synch_Queued_Message *> (
00129                                alloc->malloc (sizeof (TAO_Synch_Queued_Message))),
00130                              TAO_Synch_Queued_Message (mb,
00131                                                        this->orb_core_,
00132                                                        alloc),
00133                              0);
00134     }
00135   else
00136     {
00137       // No allocator, so use the common heap!
00138       if (TAO_debug_level == 4)
00139         {
00140           // This debug is for testing purposes!
00141           ACE_DEBUG ((LM_DEBUG,
00142                       "TAO (%P|%t) - Synch_Queued_Message::clone\n"
00143                       "Using global pool for allocation \n"));
00144         }
00145 
00146       ACE_NEW_RETURN (qm,
00147                       TAO_Synch_Queued_Message (mb, this->orb_core_),
00148                       0);
00149     }
00150 
00151   // Set the flag to indicate that <qm> is created on the heap.
00152   if (qm)
00153     {
00154       qm->is_heap_created_ = true;
00155     }
00156 
00157   return qm;
00158 }
00159 
00160 void
00161 TAO_Synch_Queued_Message::destroy (void)
00162 {
00163   if (this->is_heap_created_)
00164     {
00165       ACE_Message_Block::release (this->contents_);
00166       this->current_block_ = 0;
00167 
00168       // If we have an allocator release the memory to the allocator
00169       // pool.
00170       if (this->allocator_)
00171         {
00172           ACE_DES_FREE (this,
00173                         this->allocator_->free,
00174                         TAO_Synch_Queued_Message);
00175 
00176         }
00177       else // global release..
00178         {
00179           delete this;
00180         }
00181     }
00182 }
00183 
00184 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 11:54:22 2006 for TAO by doxygen 1.3.6