00001 #include "tao/Queued_Data.h"
00002 #include "tao/debug.h"
00003
00004 #include "ace/Log_Msg.h"
00005 #include "ace/Malloc_Base.h"
00006
00007 #if !defined (__ACE_INLINE__)
00008 # include "tao/Queued_Data.inl"
00009 #endif
00010
00011 ACE_RCSID (tao,
00012 Queued_Data,
00013 "$Id: Queued_Data.cpp 80306 2007-12-18 12:10:07Z johnnyw $")
00014
00015 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 static ACE_Message_Block*
00034 clone_mb_nocopy_size (ACE_Message_Block *mb, size_t span_size)
00035 {
00036
00037 size_t const aligned_size = ACE_CDR::first_size (span_size + ACE_CDR::MAX_ALIGNMENT);
00038
00039
00040 ACE_Allocator *data_allocator = 0;
00041 ACE_Allocator *data_block_allocator = 0;
00042 ACE_Allocator *message_block_allocator = 0;
00043 mb->access_allocators (data_allocator,
00044 data_block_allocator,
00045 message_block_allocator);
00046
00047
00048 ACE_Message_Block *nb = 0;
00049 ACE_NEW_MALLOC_RETURN (nb,
00050 static_cast<ACE_Message_Block*> (
00051 message_block_allocator->malloc (
00052 sizeof (ACE_Message_Block))),
00053 ACE_Message_Block(aligned_size,
00054 mb->msg_type(),
00055 mb->cont(),
00056 0,
00057 data_allocator,
00058 mb->locking_strategy(),
00059 mb->msg_priority(),
00060 mb->msg_execution_time (),
00061 mb->msg_deadline_time (),
00062 data_block_allocator,
00063 message_block_allocator),
00064 0);
00065
00066 ACE_CDR::mb_align (nb);
00067
00068
00069
00070 nb->set_flags (mb->flags());
00071 nb->clr_flags (ACE_Message_Block::DONT_DELETE);
00072
00073 return nb;
00074 }
00075
00076
00077 TAO_Queued_Data *
00078 TAO_Queued_Data::make_queued_data (ACE_Allocator *message_buffer_alloc,
00079 ACE_Allocator *input_cdr_alloc,
00080 ACE_Data_Block *db)
00081 {
00082
00083 TAO_Queued_Data *qd = 0;
00084
00085 if (message_buffer_alloc)
00086 {
00087 ACE_NEW_MALLOC_RETURN (qd,
00088 static_cast<TAO_Queued_Data *> (
00089 message_buffer_alloc->malloc (sizeof (TAO_Queued_Data))),
00090 TAO_Queued_Data (message_buffer_alloc),
00091 0);
00092
00093 }
00094 else
00095 {
00096
00097 ACE_NEW_RETURN (qd,
00098 TAO_Queued_Data,
00099 0);
00100 }
00101
00102
00103
00104 if (db != 0)
00105 {
00106
00107 if (input_cdr_alloc == 0)
00108 ACE_NEW_RETURN (qd->msg_block_,
00109 ACE_Message_Block (db,
00110 0,
00111 input_cdr_alloc),
00112 0);
00113 else
00114 ACE_NEW_MALLOC_RETURN (qd->msg_block_,
00115 static_cast<ACE_Message_Block*> (
00116 input_cdr_alloc->malloc (sizeof (ACE_Message_Block))),
00117 ACE_Message_Block (db,
00118 0,
00119 input_cdr_alloc),
00120 0);
00121
00122 ACE_CDR::mb_align (qd->msg_block_);
00123 }
00124
00125 return qd;
00126 }
00127
00128
00129 void
00130 TAO_Queued_Data::release (TAO_Queued_Data *qd)
00131 {
00132
00133 ACE_Message_Block::release (qd->msg_block_);
00134
00135 if (qd->allocator_)
00136 {
00137 ACE_DES_FREE (qd,
00138 qd->allocator_->free,
00139 TAO_Queued_Data);
00140
00141 return;
00142 }
00143
00144
00145 if (TAO_debug_level == 4)
00146 {
00147
00148 ACE_DEBUG ((LM_DEBUG,
00149 "TAO (%P|%t) - Queued_Data[%d]::release\n",
00150 "Using global pool for releasing \n"));
00151 }
00152 delete qd;
00153
00154 }
00155
00156
00157 TAO_Queued_Data *
00158 TAO_Queued_Data::duplicate (TAO_Queued_Data &sqd)
00159 {
00160
00161
00162
00163
00164
00165
00166 ACE_Message_Block::Message_Flags fl =
00167 sqd.msg_block_->self_flags ();
00168
00169 if (ACE_BIT_ENABLED (fl,
00170 ACE_Message_Block::DONT_DELETE))
00171 (void) TAO_Queued_Data::replace_data_block (*sqd.msg_block_);
00172
00173
00174 TAO_Queued_Data *qd = 0;
00175
00176 if (sqd.allocator_)
00177 {
00178 ACE_NEW_MALLOC_RETURN (qd,
00179 static_cast<TAO_Queued_Data *> (
00180 sqd.allocator_->malloc (sizeof (TAO_Queued_Data))),
00181 TAO_Queued_Data (sqd),
00182 0);
00183
00184 return qd;
00185 }
00186
00187
00188
00189 if (TAO_debug_level == 4)
00190 {
00191
00192 ACE_DEBUG ((LM_DEBUG,
00193 "TAO (%P|%t) - Queued_Data[%d]::duplicate\n",
00194 "Using global pool for allocation \n"));
00195 }
00196
00197 ACE_NEW_RETURN (qd,
00198 TAO_Queued_Data (sqd),
00199 0);
00200
00201 return qd;
00202 }
00203
00204 int
00205 TAO_Queued_Data::consolidate (void)
00206 {
00207
00208 if (this->state_.more_fragments () && this->msg_block_->cont () != 0)
00209 {
00210
00211 ACE_Message_Block *dest = clone_mb_nocopy_size (
00212 this->msg_block_,
00213 this->msg_block_->total_length ());
00214
00215 if (0 == dest)
00216 {
00217
00218 return -1;
00219 }
00220
00221
00222
00223
00224
00225
00226 dest->cont (0);
00227
00228
00229 ACE_CDR::consolidate (dest, this->msg_block_);
00230
00231
00232 this->msg_block_->release ();
00233
00234
00235 this->msg_block_ = dest;
00236 this->state_.more_fragments (0);
00237 }
00238
00239 return 0;
00240 }
00241
00242 TAO_END_VERSIONED_NAMESPACE_DECL